2017-01-30 1 views
0

Ich bin neu mit Firebase und NoSQL, ich habe eine Struktur für meine Anwendung und ich habe ein paar Fragen.Firebase-Struktur-Duplizierung

Mein stucture:

ROOT 
| 
+-- USERS 
|  | 
|  +-- USER_ID 
|   | 
|   +-- USERNAME 
|   | 
|   +-- DISPLAY_NAME 
|   | 
|   +-- PROFILE_PICTURE_URL 
|   | 
|   +-- POST_COUNT 
| 
+-- CATEGORIES 
|  | 
|  +-- CATEGORY_ID 
|   | 
|   +-- NAME 
|   | 
|   +-- POST_COUNT 
| 
+-- POSTS 
|  | 
|  +-- POST_ID 
|   | 
|   +-- MESSAGE 
|   | 
|   +-- USER_ID 
|   | 
|   +-- USERNAME 
|   | 
|   +-- DISPLAY_NAME 
|   | 
|   +-- PROFILE_PICTURE_URL 
|   | 
|   +-- CATEGORIES 
|   |  | 
|   |  +-- CATEGORY_ID 
|   | 
|   +-- LIKE_COUNT 
| 
+-- USERS_POSTS 
|  | 
|  +-- USER_ID 
|   | 
|   +-- POST_ID 
|     | 
|     +-- MESSAGE 
|     | 
|     +-- USER_ID 
|     | 
|     +-- USERNAME 
|     | 
|     +-- DISPLAY_NAME 
|     | 
|     +-- PROFILE_PICTURE_URL 
|     | 
|     +-- CATEGORIES 
|     |  | 
|     |  +-- CATEGORY_ID 
|     | 
|     +-- LIKE_COUNT 
| 
+-- CATEGORIES_POSTS 
|  | 
|  +-- CATEGORY_ID 
|   | 
|   +-- POST_ID 
|     | 
|     +-- MESSAGE 
|     | 
|     +-- USER_ID 
|     | 
|     +-- USERNAME 
|     | 
|     +-- DISPLAY_NAME 
|     | 
|     +-- PROFILE_PICTURE_URL 
|     | 
|     +-- CATEGORIES 
|     |  | 
|     |  +-- CATEGORY_ID 
|     | 
|     +-- LIKE_COUNT 
| 

ich mich fragen, ob diese Dinge gut sind oder nicht?

  • Die Beiträge werden oft dupliziert.
  • Die Benutzerinformationen sind in jedem Beitrag vorhanden, vielleicht brauche ich nur die Benutzer-ID und die Benutzerinformationen später anfordern?
  • Sollte ich "likeCount" in einem anderen Objekt extrahieren?
  • Wenn ich einen Benutzer oder einen Beitrag (oder "likeCount") aktualisieren möchte, habe ich viele Updates zu tun.

Vielen Dank im Voraus!

Antwort

1

Die Frage ist ein bisschen vage, aber hier einige Gedanken

Die Beiträge oft dupliziert werden.

Es ist nichts falsch mit doppelten Daten in NoSQL - es ist eigentlich ziemlich üblich. Die doppelten Daten müssen jedoch aus einem bestimmten Grund erstellt werden, um Abfragen zu unterstützen. Duplizieren Sie die Daten nicht einfach, um sie zu demormalisieren, ohne sie zu reduzieren. In der Frage werden die doppelten Daten nicht benötigt - das könnte sich ändern, je nachdem, was Sie mit diesen Daten machen wollen.

Die Benutzerinformation ist in jedem Beitrag vorhanden, vielleicht brauche ich nur die Benutzer-ID und fordern Sie später die Benutzerinformationen?

Richtig! In diesem Fall werden möglicherweise keine doppelten Daten benötigt. Nur eine UID in der Post ermöglicht es Ihnen, den Rest der Benutzerdaten bei Bedarf zu sammeln

Sollte ich "likeCount" in einem anderen Objekt extrahieren?

Das hängt davon ab. Mit einer einzigen Zählung ist es einfach, die Anzahl der Likes zu ermitteln, aber nicht, wer sie gemocht hat, sodass diese Verbindung verloren geht. Auf der anderen Seite könnten Sie einfach einen Knoten mit UIDs speichern, die den Beitrag mochten. Das wäre sehr schnell, um zu zählen und zu behaupten, wer es mochte.

Wenn ich einen Benutzer oder einen Beitrag (oder "likeCount") aktualisieren möchte, habe ich viele Updates zu tun.

Nicht wirklich. Wenn die gleiche Anzahl nur an einer Stelle (mit dem Post) gespeichert wird, wird nur ein Knoten inkrementiert. Aktualisieren der Post-Anzahl im Benutzerknoten, auch nicht zu groß. Wenn Sie Dinge in Firebase zählen wollen, können Sie entweder a) alle Knoten einlesen und sie im Code zählen oder b) einen Zählerknoten irgendwo halten und im laufenden Betrieb erhöhen. Der Counter-Knoten ist normalerweise der Weg, so dass Sie in die richtige Richtung gehen.

+0

Vielen Dank für Ihre Antwort! Über den Benutzer dupliziert Daten in jedem Beitrag, Sie sagten "In diesem Fall werden doppelte Daten wahrscheinlich nicht benötigt", aber wenn ich den Benutzer mit dem Beitrag anzeigen möchte (wie Facebook oder Twitter zum Beispiel), sollte ich die Benutzerdaten nach dem anfordern Daten posten oder duplizieren? – Pipiks

+0

@Pipiks Ich würde vorschlagen, laden Sie die Post-Daten für jeden Beitrag, die die Benutzer-ID enthalten würde, und dann die Benutzerdaten laden. Da Sie die UID haben, können Sie direkt auf den Benutzer über ein observeSingleEvent (Swift) unter/users/uid zugreifen, wodurch vermieden wird, dass eine Abfrage ausgeführt wird, die einen ressourcenintensiveren Vorgang als eine Beobachtung darstellt. – Jay

+0

Vielen Dank :) – Pipiks