2016-06-15 17 views
3

Wir haben gerade begonnen, Firebase für unsere neue App zu erkunden. Die App benötigt grundsätzlich einen Chat zwischen Nutzern und Gruppenchat.firebase google oder query support oder eine alternative Lösung

Für die Chat-Anwendung schaffen wir: MessageThread (id, Benutzer: userA, Benutzer: userB, Benutzergruppe: Gruppe, Array: deletedBy, ...)

Das Hauptproblem ist nicht der Fall ist Feuerbasis unterstütze ODER-Anfragen und IN-Anfragen, die ich in meinem Anwendungsfall benötige. Zum Beispiel:

Dummy Abfrage Gespräche Benutzerliste zuzugreifen: holen MessageThread (n), wo (currentUser.id == userA.id) OR (currentUser.id == userB.id) OR (currentUser.id IN group.members)

Ich vermisse etwas, um Firebase zu verstehen? Was ist der andere alternative Weg, unsere Datenbank zu entwerfen, um dieses Problem zu lösen?

Antwort

3

In NoSQL müssen Sie die Daten so modellieren, wie Ihre App es verwenden möchte. Also, wenn Sie eine Liste der Gespräche müssen, dass der Benutzer ein Teil ist, sollten Sie diese Liste in der Datenbank halten:

/conversationMessages 
    $conversationId 
     $messageId 
      text: "Hello world" 
      sender: "uid of sender" 
      name: "name of sender" 
/userConversations 
    $uid 
    $conversationId1: true 
    $conversationId2: true 

Mit diesem können Sie leicht die Liste der Gespräche nachschlagen, die jeder Benutzer ist ein Teil von und laden Sie dann die Nachrichten für einen von ihnen. Sie werden wahrscheinlich wollen auch für jedes Gespräch eine separate Liste der Metadaten halten:

/conversationMetadata 
    $conversationId 
     lastUpdated: timestamp (set with ServerValue.TIMESTAMP) 
     title: "name of our chat room" 

diese Weise können Sie die Liste der Gespräche für einen Benutzer anzeigen können ihr Gespräch ids durch das Laden und das Laden dann die Metadaten jedes Gespräch :

var ref = database.ref().child("userConversations").child(auth.uid); 
ref.on('child_added', function(conversationKey) { 
    var conversationRef = database.ref().child("conversationMetadata").child(conversationKey.key); 
    conversationRef.once('value', function(metadataSnapshot) { 
     console.log(metadataSnapshot.val()); 
    }); 
}); 

Der Versuch, SQL-Kenntnisse auf eine NoSQL-Datenbank abzubilden, führt zu einer schwierigen Lernerfahrung. Ich empfehle sehr, die relevant section of the Firebase documentation und diese article about NoSQL data modeling zu lesen.

+0

Vielen Dank, noch eine Frage: Gibt es irgendwelche Unterstützung von Referenzen in Firebase? Beispiel: Ich möchte das Objekt des Benutzers in der Konversation speichern, sodass ich den Namen und das Foto des Benutzers auf dem Konversationslistenbildschirm anzeigen kann. – iMemon

+0

Es gibt keine verwalteten Fremdschlüsselreferenzen. Aber es ist sehr üblich, Referenzen zu haben. Weitere Informationen finden Sie in der Dokumentation zu [Erstellen von Daten, die skaliert werden] (https://firebase.google.com/docs/database/android/structure-data#fanout). –

+0

In meinem Senerio, habe ich Gruppen/Benutzer-Chat und Chat-Name und Bild wird aus dieser Gruppe/Benutzer abgerufen Und ich kann es nicht denormalize, weil der Benutzer die Möglichkeit hat, es jederzeit zu ändern. Also von Ihrem erwähnten Ansatz, kann ich eine Tabelle/conversationMetadata haben, wo ich eine Referenz von Benutzer/Gruppe werde. Jetzt ist das Problem, eine Konversationsliste zu holen (wie in deinem oben erwähnten Code erklärt): Zuerst hole ich userConversations, dann hole ich conversationMetadata für jede Konversation und dann muss ich userData oder groupData holen (um Name/Bild zu erhalten). Glaubst du nicht, dass es zu langsam wird? Bitte helfen Sie. – iMemon