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

MongoDB-Beziehungen:einbetten oder referenzieren?

Das ist eher eine Kunst als eine Wissenschaft. Die Mongo-Dokumentation zu Schemas ist eine gute Referenz, aber hier sind einige Dinge zu beachten:

  • Geben Sie so viel wie möglich ein

    Das Schöne an einer Dokumentendatenbank ist, dass sie viele Verknüpfungen eliminiert. Ihr erster Instinkt sollte sein, so viel wie möglich in einem einzigen Dokument unterzubringen. Da MongoDB-Dokumente eine Struktur haben und Sie innerhalb dieser Struktur effizient Abfragen durchführen können (das bedeutet, dass Sie den Teil des Dokuments nehmen können, den Sie benötigen, sodass die Dokumentgröße Sie nicht sehr beunruhigen sollte), besteht keine unmittelbare Notwendigkeit, Daten wie zu normalisieren Sie würden in SQL. Insbesondere alle Daten, die abgesehen von ihrem übergeordneten Dokument nicht nützlich sind, sollten Teil desselben Dokuments sein.

  • Trennen Sie Daten, auf die von mehreren Stellen aus verwiesen werden kann, in eine eigene Sammlung.

    Dies ist weniger ein "Speicherplatz"-Problem als vielmehr ein "Datenkonsistenz"-Problem. Wenn viele Datensätze auf dieselben Daten verweisen, ist es effizienter und weniger fehleranfällig, einen einzelnen Datensatz zu aktualisieren und Verweise darauf an anderen Stellen beizubehalten.

  • Überlegungen zur Dokumentgröße

    MongoDB erlegt einem einzelnen Dokument eine Größenbeschränkung von 4 MB (16 MB mit 1.8) auf. In einer Welt von GB an Daten klingt das wenig, aber es sind auch 30.000 Tweets oder 250 typische Stack Overflow-Antworten oder 20 Flimmerfotos. Auf der anderen Seite sind dies weitaus mehr Informationen, als man auf einer typischen Webseite auf einmal präsentieren möchte. Überlegen Sie zunächst, was Ihre Abfragen erleichtert. In vielen Fällen ist die Sorge um die Dokumentengröße eine verfrühte Optimierung.

  • Komplexe Datenstrukturen:

    MongoDB kann beliebige tief verschachtelte Datenstrukturen speichern, aber nicht effizient durchsuchen. Wenn Ihre Daten einen Baum, eine Gesamtstruktur oder ein Diagramm bilden, müssen Sie effektiv jeden Knoten und seine Kanten in einem separaten Dokument speichern. (Beachten Sie, dass es Datenspeicher gibt, die speziell für diese Art von Daten entwickelt wurden und die man ebenfalls in Betracht ziehen sollte)

    Es wurde auch darauf hingewiesen, dass es unmöglich ist, eine Teilmenge von Elementen in einem Dokument zurückzugeben. Wenn Sie einige Teile jedes Dokuments auswählen und auswählen müssen, ist es einfacher, sie zu trennen.

  • Datenkonsistenz

    MongoDB geht einen Kompromiss zwischen Effizienz und Konsistenz ein. Die Regel lautet:Änderungen an einem einzelnen Dokument sind immer atomar, während Updates für mehrere Dokumente niemals als atomar angesehen werden sollten. Es gibt auch keine Möglichkeit, einen Datensatz auf dem Server zu „sperren“ (Sie können dies in die Logik des Clients einbauen, indem Sie beispielsweise ein „Sperr“-Feld verwenden). Wenn Sie Ihr Schema entwerfen, überlegen Sie, wie Sie Ihre Daten konsistent halten. Im Allgemeinen gilt:Je mehr Sie in einem Dokument aufbewahren, desto besser.

Für das, was Sie beschreiben, würde ich die Kommentare einbetten und jedem Kommentar ein ID-Feld mit einer ObjectID geben. In die Objekt-ID ist ein Zeitstempel eingebettet, sodass Sie diesen verwenden können, anstatt ihn zu erstellen, wenn Sie möchten.