2017-11-19 3 views
1

Ich brauche ein paar Tipps, wie Sie meine Datenbank strukturieren, um sie korrekt abzufragen. Von dem, was ich verstanden habe, ist die Struktur der Datenbank alles, aber ich bin mir nicht sicher, ob ich es richtig benutze.Firebase Datenbankstruktur Beratung

Grundsätzlich soll meine App Daten von einem API abrufen und das in einer Listview anzeigen. Jeder Artikel (Nachrichtenpost) in der Listenansicht kann Kommentare von Firebase-Benutzern enthalten.

So habe ich "NewsPost", "Benutzer" und "Kommentar" Modelle, die so aussieht.

NewsPost.class 

private String id; 
private String date; 
private String title; 
private String commentsNumber; 
private List<Comment> comments; 
private String imageUrl; 

User.class 
private String userName; 
private String userAvatar; 
private String firstName; 
private String lastName; 
private String eMail; 

Comment.class 
private UUID uuid; 
private String postId; 
private String message; 
private String postDate; 
private String userAvatar; 
private String userName; 

So ist dies, wie ich versuchte, es zu speichern:

Firebase data structure

und das ist, wie ich versuche, die Kommentare zu erhalten, wenn ein Benutzer die Kommentare für die spezifische newsPostItem in der lesen klickt listView mit der newsPostId als Abfrageparameter.

public void getComments(String postId) { 

comments = new ArrayList<>(); 
Query query = databaseReference.child("comments").orderByChild(postId).equalTo(postId); 
     query.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.exists()) { 
        for (DataSnapshot issue : dataSnapshot.getChildren()) { 
         Comment comment = issue.getValue(Comment.class); 
         comments.add(comment); 
        } 
        Log.d("GETCOMMENTS", "SNAPSHOT EXISTS"); 
        view.onCommentsLoaded(comments); 
       } 

       else{ 
        view.onCommentsLoaded(comments); 
        Log.d("GETCOMMENTS", "SNAPSHOT NOT EXISTS"); 
       } 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       view.onCommentsLoaded(comments); 
       Log.d("GETCOMMENTS", databaseError.getMessage()); 
      } 
     }); 
} 

Meine Frage ist, Amidoinitrit?

Ich habe eine Feuerbasis Grenze für diesen Monat Warnung heruntergeladen (10 GB), die ich den einzigen Benutzer bin sollten nicht passieren, weil gerade jetzt.

Jede Hilfe wird geschätzt!

Hinweis: Der userAvatar ist in einem Byte [] in der Datenbank gespeichert, nicht gut?

+0

Haben Sie es geschafft, die gewünschten Daten zu bekommen? –

+0

@AlexMamo Ja und Nein. Wenn ich eine Abfrage verwende, existiert der Snapshot nicht. Wenn ich dbref verwende, dann bekomme ich die Kommentare, aber es beschwert sich über große Anfragen von der Firebase db. Etwas ist offensichtlich schlecht strukturiert, da ich fast 10 GB Download innerhalb eines Monats für EINEN Benutzer benutzt habe ... – JoSem

Antwort

0

Bei der Verwendung von Firebase müssen einige Regeln beachtet werden. In Ihrem speziellen Fall empfehle ich Ihnen, Denormalisierung zu verwenden und die Datenbank so flach wie möglich zu ändern. Zum besseren Verständnis empfehle ich dieses Video, Denormalization is normal with the Firebase Database. Da Firebase Realtime Database nicht mehrere Eigenschaften abfragen kann, sind auch Dubletten erforderlich. Das ist normal, wenn es um Firebase geht. In Ihrem speziellen Fall empfehle ich Ihnen, beide Dinge zu tun.

Ich empfehle Ihnen auch diesen Beitrag zu lesen, Structuring your Firebase Data correctly for a Complex App. Es ist sehr gut erklärt und wird Ihnen helfen, die beste Entscheidung zu treffen.

Sie müssen wissen, dass es keine perfekte Struktur für eine Datenbank gibt. Sie müssen Ihre Datenbank so strukturieren, dass Sie Daten sehr einfach und effizient lesen und schreiben können. Wenn Sie noch nicht wissen, hat Firebase ein neues Produkt mit dem Namen Cloud Firestore gestartet. Die Echtzeitdatenbank wird nicht automatisch skaliert, während der neue Firestore ausgeführt wird.

0

Derzeit fügen Sie "NewsPostID" als Root-Knoten in "Kommentare" hinzu. Diese Struktur verbraucht mehr Speichergröße, da jeder neue Kommentar als neuer root innerhalb des Kommentarknotens hinzugefügt wird.

Angenommen, wir möchten Folgendes abfragen: Spezifische Benutzer alle Kommentare für ein einzelnes Datum. In diesem Fall ist die aktuelle Struktur komplex, um die Abfrage anzuwenden.

können Sie Struktur wie ändern:

"comments" 
    -"userEmail" 
      - "NewPostDate" 
         - "NewpostID:15478" 
             -KHZzTwazaSd (this is random id) 
              -"message: hey.." 
              -"postDate: Date + 12:10PM" 
             -KHZzTwazaSd (this is random id) 
              -"message: Nice post.." 
              -"postDate: Date + 12:22PM" 
         - "NewpostID:54478" 
             -KHZzTwazaSd (this is random id) 
              -"message: Nice day" 
              -"postDate: Date + 10:45PM" 

können Sie alle damit verbundenen Details Benutzer erhalten von Benutzertabelle „Useremail“ aus „Kommentare“ können. Dies wird die Knotengröße verringern und wird auch hilfreich sein, um abzufragen.