Im folgenden Firebase-Handbuch zu structuring data für eine Chat-App. Sie schlagen die Struktur vor, wie unten gesehen.Strukturieren von Daten für die Chat-App in Firebase
{
// Chats contains only meta info about each conversation
// stored under the chats's unique ID
"chats": {
"one": {
"title": "Historical Tech Pioneers",
"lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
"timestamp": 1459361875666
},
"two": { ... },
"three": { ... }
},
// Conversation members are easily accessible
// and stored by chat conversation ID
"members": {
// we'll talk about indices like this below
"one": {
"ghopper": true,
"alovelace": true,
"eclarke": true
},
"two": { ... },
"three": { ... }
},
// Messages are separate from data we may want to iterate quickly
// but still easily paginated and queried, and organized by chat
// converation ID
"messages": {
"one": {
"m1": {
"name": "eclarke",
"message": "The relay seems to be malfunctioning.",
"timestamp": 1459361875337
},
"m2": { ... },
"m3": { ... }
},
"two": { ... },
"three": { ... }
}
}
Wie kann ich meine Benutzerdaten strukturieren, so dass ich einfach eine Liste aller von den Chats anzeigen kann sie Teil und für jeden von ihnen zeigen die letzte Nachricht und Zeitstempel sind. Wenn ich die folgende Struktur zu tun:
"users": {
"ghopper": {
"name": "Gary Hopper",
"chats": {
"one: true",
"two": true
}
},
"alovelace" { ... }
},
Ich kann leicht eine Liste aller Chat-Gruppe für einen bestimmten Benutzer, zum Beispiel ghopper erhalten, indem (in swift) tun:
ref.child("users").child("ghopper").child("chats").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
//do something with data
}
Jedoch habe ich gewonnen Habe in diesem Snapshot nicht die letzte Nachricht und den Zeitstempel. Was muss ich tun, um auf diese Daten zuzugreifen?
- Duplizieren Sie alle diese Daten für jeden Benutzer? dh Hinzufügen von Benutzern/ghopper/chats/one/{"lastMessage": "ghopper: Relaisfehler gefunden. Ursache: Moth.", "timestamp": 1459361875666}
- Stellen Sie für jeden Chat eine Abfrage nach "chats/specificGroupId" Der Benutzer ist Teil von (Hinzufügen mehrerer Listener)?
- Ein anderer Weg?
Was ist die Funktion von lastMesssage = Snapshot, da Sie diese Variable nicht verwenden? Es ist auch eine gute Übung, den Namen "self.variable" in einem Block (closure) zu verwenden. Außerdem ist das ref.child innerhalb des ersten ref.child ein Duplikat, so dass es die gleichen Daten lesen wird. Das größte Problem ist, dass Firebase asynchron ist und dass die Tight for-Schleife * schneller * läuft als die Daten innerhalb des Beobachtungsblocks zurückgegeben werden können. Daher denke ich, dass wir Probleme mit der Datenintegrität haben - wahrscheinlich sollte Firebase dies tun "stopfen" asynchron. – Jay
Um die Frage in Ihrer Antwort zu beantworten .... Nein, uid_2: false wird nicht benötigt, als ob es nicht existiert, es könnte standardmäßig falsch sein (hängt von seinem Code ab). Und nein, die Datenbank wächst nicht exponentiell. Wenn Sie 10 Benutzer und einen Chat haben, sind alle 10 Benutzer in diesem Chat, so dass nur der Benutzerknoten im Chat (in meiner Antwort) wächst. Wenn Sie 1000 Benutzer und 100 Chats haben, wird jeder Chat mit zwei Benutzern durchgeführt , das sind immer noch nur 100 Chats, die jeweils einen Benutzerknoten mit zwei Benutzern haben. Selbst bei 1000 Benutzern und 1000 Chats ist das keine wesentliche Datenmenge. – Jay