0

Ich habe (etwas) große Liste von Witzen in meiner Firebase-Datenbank wie im Bild unten.Firebase Datenbank Datenstruktur mit Firebase Authentifizierung Benutzer

Current jokes node

I zeigt sie in einer Liste in meinem Android-App so etwas wie ein Feed. Ich habe auch die Möglichkeit eingeführt, mich mit der Firebase-Authentifizierung anzumelden, und jetzt möchte ich Optionen für angemeldete Benutzer hinzufügen, um Witze zu mögen (dis) zu mögen und sie zu Favoriten hinzuzufügen (Favoriten sollen wie private Lesezeichen sein). Ich wanderte, wie ich meine Daten strukturieren könnte, und ich habe zwei Vorschläge:

  1. Hinzufügen neuer Wurzelknoten „userJokes“ mit Kind Knoten, die Benutzer-UID von Firebase Authentication genannt. Jeder UID-Kindknoten sollte eine Kopie jedes Witzes vom "Scherz" -Knoten mit zusätzlichen booleschen Werten haben, die (un) ähnliche und favorisierte Zustände darstellen.

    Suggestion 1

  2. Eine andere Lösung ist es, jeden Benutzer UID zu einem Witz ein Benutzer (dis) gefällt oder fügt Favoriten hinzuzufügen.

    Suggestion 2

Erste Lösung ist logisch, aber wie könnte ich zähle Anzahl von Vorlieben und Abneigungen, wenn ich Strukturdaten auf diese Weise? Und was ist der beste Weg, um jeden Witz vom "Scherz" -Knoten zum "Benutzer" -Knoten für jeden Benutzer zu kopieren, der im Feed angezeigt wird? Zweitens ist das unpraktisch, da ich während des Abrufens von Witzen Informationen über jeden Benutzer erhalten kann, der die Favoriten entfernt oder hinzugefügt hat, und das ist nicht das, was ich brauche. Welche Lösung ist besser? Gibt es noch andere? Ist es OK, der Datenbank in der Firebase-Datenbank eine Benutzer-UID aus der Firebase-Authentifizierung hinzuzufügen?

Antwort

1

ich denke, die erste mehr akzeptiert wird, obwohl es einige zwicken :)

Erste Notiz muss: Wenn Sie Daten erstellen nur als relationale verwendet werden (wie userJokes), dann ist es besser, nur einfach hinzufügen Wert ohne gesamten Quelldaten kopiert (jokes Daten), wie folgt aus:

userJokes: { 
    randomUserId: { 
     randomJokeId:true, 
     anotherRandomJokeId:true 
    } 
    awesomeUser: { 
     randomJokeId:true 
    } 
} 

Zweite Anmerkung: wenn Sie wollen implementieren zwei funktionen (like und favorite), ich denke du solltest es als andere daten machen. So wäre es userJokeLike und userJokeFavorite (oder so ähnlich). Und die Struktur für jeden von ihnen sollte gleich sein, wie ich in der ersten Notiz erwähnt habe.


Abschließend:

  • Jeder Witz Daten sind nach wie vor in ihrem Quellpfad (dh innerhalb jokes) und nur ihre ID in neu erstellte Datenpfad kopiert (userJokeLike und userJokeFavorite)

  • Wenn Sie nach Witze, die Benutzer mit der ID randomUserId Likes suchen möchten, sollten Sie nach userJokeLike\randomUserId suchen. Dann von jeder Witz-ID, die Sie dort bekommen, erhalten Sie die echten Daten aus der Quelle jokes Pfad.

  • Wenn Sie nach einem Witz suchen möchten, der von einem Benutzer mit der ID randomUserId favorisiert wird, tun Sie das Gleiche wie oben.

  • Wenn Sie möchten, Vorlieben und Lieblings jeder Witz zählen, nur so etwas wie folgt verwenden:

    FirebaseDatabase.getInstance().getReference("userJokeLike") 
        .orderByChild().equalsTo("randomJokeId") 
        .addListenerForSingleValueEvent(new ValueEventListener() { 
         ... onDataChange(DataSnapshot dataSnapshot) { 
          int jokeCount = dataSnapshot.getChildrenCount(); 
         } 
        }); 
    

Und da gehen Sie, hoffe, das hilft.

Hinweis: Ich habe den letzten Code nicht überprüfen, hoffen, dass die Arbeit: p

EDIT:

Sieht aus wie ich falsch verstehen tat: D

Die Lösung oben ist das, was ich für die Struktur selbst am besten finde. Aber wenn wir etwas Einfaches und Schnelles brauchen, ist es für jeden Fall anders. Ich denke, dass die beste Lösung, wenn Sie Witze mit Vorlieben und Favoriten bekommen enthalten (keine Notwendigkeit, eine weitere Anforderung erstellen), dann Ihre Struktur sollte wie folgt aussehen:

jokes: { 
    randomJokeId: { 
     // joke data here 
     likes:{ 
      randomUserId:true, 
      anotherUserId:true 
     }, 
     favorites:{ 
      randomUserId:true 
     } 
    } 
} 

Es enthält likes und favorite wenn Sie jokes Daten anfordern . SO in jeder Daten müssen Sie nur prüfen, ob die Benutzer-ID des aktuellen Benutzers in likes und/oder favorite existiert. Und der Counter wird auf diese Weise viel einfacher sein.

Happy Coding :)

+0

Ich habe vielleicht den Punkt in meiner Frage verpasst. Ich möchte Witze in einer Liste wie einen Feed in jeder sozialen App zeigen. Während ich Witze zeige, möchte ich auch sofort geeignete Symbole für Likes, Abneigungen und Favoriten zeigen, je nachdem, was der Benutzer bereits getan hat. Genau wie Instagram Feed zeigt rotes Herz auf Bilder, die bereits gemocht wurden. Ich möchte also, dass diese Daten bereits vorhanden sind, ohne eine neue Abfrage durchführen zu müssen. Aus diesem Grund schlug ich die erste Lösung vor, bei der ich jeden Witz unter dem Benutzer-UID-Schlüssel mit zusätzlichen Informationen speichern würde, die Vorlieben, Abneigungen und Favoriten darstellen. – lagoman

+0

Ich habe meine Antwort bearbeitet, hoffe, diesmal habe ich es richtig verstanden: D – koceeng

Verwandte Themen