MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Viele zu viele Beziehungen mit MongoDB im großen Maßstab

Dies ist eine gute Frage, die die Probleme der Überbettung veranschaulicht und zeigt, wie man damit umgeht.

Beispiel:Likes posten

Bleiben wir bei dem Beispiel von Benutzern, die Beiträge mögen, was ein einfaches Beispiel ist. Die anderen Relationen müssten entsprechend gehandhabt werden.

Du hast vollkommen Recht, dass das Speichern der Likes innerhalb des Posts früher oder später zu dem Problem führen würde, dass sehr populäre Posts die Größenbeschränkung erreichen würden.

Sie haben also korrekterweise einen post_likes erstellt Sammlung. Warum nenne ich das richtig? Weil es zu Ihren Anwendungsfällen und funktionalen und nicht-funktionalen Anforderungen passt!

  • Es ist unbegrenzt skalierbar (na ja, es gibt eine theoretische Grenze, aber es ist gewaltig)
  • Es ist einfach zu warten (erstellen Sie einen eindeutigen Index über post_id und liked_user_id ) und Verwendung (sowohl der Benutzer als auch der Beitrag sind bekannt, daher ist das Hinzufügen eines Likes eine einfache Einfügung oder eher ein Upsert)
  • Sie können ganz einfach herausfinden, welchen Benutzern welcher Beitrag gefällt und welcher Beitrag welchen Benutzern gefällt

Ich würde die Sammlung jedoch etwas erweitern, um unnötige Abfragen für bestimmte Anwendungsfälle zu vermeiden, die häufig vorkommen.

Nehmen wir vorerst an, dass Beitragstitel und Benutzernamen nicht geändert werden können. In diesem Fall könnte das folgende Datenmodell sinnvoller sein

{
  _id: new ObjectId(),
  "post_id": someValue,
  "post_title": "Cool thing",
  "liked_user_id": someUserId,
  "user_name": "JoeCool"
}

Nehmen wir nun an, Sie möchten die Benutzernamen aller Benutzer anzeigen, denen ein Beitrag gefallen hat. Mit dem obigen Modell wäre das eine einzelne, ziemlich schnelle Abfrage:

db.post_likes.find(
  {"postId":someValue},
  {_id:0,user_name:1}
)

Wenn nur die IDs gespeichert sind, würde diese eher übliche Aufgabe mindestens zwei Abfragen erfordern und - angesichts der Einschränkung, dass es eine unendliche Anzahl von Likes für einen Beitrag geben kann - möglicherweise riesig Speicherverbrauch (Sie müssten die Benutzer-IDs im RAM speichern).

Zugegeben, dies führt zu einer gewissen Redundanz, aber selbst wenn Millionen von Menschen einen Beitrag mit „Gefällt mir“ markieren, sprechen wir nur von ein paar Megabyte an relativ billigem (und einfach zu skalierendem) Speicherplatz, während viel Leistung gewonnen wird in Bezug auf die Benutzererfahrung.

Jetzt kommt die Sache:Auch wenn sich die Benutzernamen und Beitragstitel ändern, musstest du nur ein Multi-Update machen:

db.post_likes.update(
  {"post_id":someId},
  { $set:{ "post_title":newTitle} },
  { multi: true}
)

Sie geben an, dass es eine Weile dauert, einige eher seltene Dinge wie das Ändern eines Benutzernamens oder eines Beitrags für extreme Geschwindigkeit für Anwendungsfälle zu tun, die extrem häufig vorkommen.

Unterm Strich

Denken Sie daran, dass MongoDB eine dokumentenorientierte Datenbank ist. Dokumentieren Sie also die Ereignisse, an denen Sie interessiert sind, mit den Werten, die Sie für zukünftige Abfragen benötigen, und modellieren Sie Ihre Daten entsprechend.