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

Umgang mit Beziehungen bei der Verwendung von mongodb

BEARBEITEN:

Habe gerade eine Antwort gefunden von Brendan McAdams, Typ von 10gen, der offensichtlich viel autoritärer ist als ich, und er empfiehlt, Dokumente einzubetten.

älterer Text:

Die erste besteht darin, jedem Kommentar manuell die ObjectID des Benutzers hinzuzufügen, zu dem sie gehören.

comment: { text : "...", 
           date: "...", 
           user: ObjectId("4b866f08234ae01d21d89604"),
           votes: 7 }

Der zweite und clevere Weg ist, DBRefs zu verwenden

Wir fügen unserer Festplatte zusätzliche E/A hinzu, wodurch Leistung verloren geht, habe ich Recht? (Ich bin mir nicht sicher, wie das intern funktioniert), daher müssen wir das Verlinken nach Möglichkeit vermeiden, oder?

Ja - es würde eine weitere Abfrage geben, aber der Treiber erledigt das für Sie - Sie können sich das als eine Art Syntaxzucker vorstellen. Beeinflusst es die Leistung? Eigentlich hängt es auch davon ab :) Einer der Gründe, warum Mongo so verdammt schnell ist, ist, dass es speicherabgebildete Dateien und Mongo versuchen es am besten, den gesamten Arbeitssatz (plus Indizes) direkt im RAM zu halten. Und alle 60 Sekunden (standardmäßig) synchronisiert es den RAM-Schnappschuss mit der festplattenbasierten Datei.
Wenn ich sage Arbeitssatz , ich meine Dinge, mit denen Sie arbeiten:Sie können drei Sammlungen haben - foo , Leiste , baz , aber wenn Sie jetzt nur mit foo und bar arbeiten, sollten sie in den ram geladen werden, während baz auf der Festplatte verlassen bleibt. Darüber hinaus ermöglichen speicherabgebildete Dateien, nur einen Teil der Sammlung zu laden. Wenn Sie also so etwas wie engadget oder techcrunch erstellen, besteht eine hohe Wahrscheinlichkeit, dass der Arbeitssatz Kommentare für die letzten Tage sind und alte Seiten viel seltener wiederbelebt werden (Kommentare werden bei Bedarf in den Speicher gespawnt). Die Leistung wird nicht wesentlich beeinträchtigt.

Fassen wir also zusammen:Solange Sie den Arbeitssatz im Speicher behalten (Sie denken vielleicht, dass dies Lese-/Schreib-Caching ist), ist das Abrufen dieser Dinge superschnell und eine weitere Abfrage wäre kein Problem. Wenn Sie mit Datenscheiben arbeiten, die nicht in den Speicher passen, würde die Geschwindigkeit Verschlechterung , aber ich verstehe Ihre Umstände nicht - es könnte akzeptabel sein, also neige ich in beiden Fällen dazu, verwenden zu wählen verlinken.