Ich habe mich über die ideale Dokumentenstruktur für maximale Abfragereffizienz in verschiedenen Situationen gewundert, und da ist eine, nach der ich fragen möchte. Es ist wirklich aus mir heraus getragen, nicht wirklich zu wissen, wie sich MongoDB in diesem speziellen Fall im Gedächtnis verhält. Lassen Sie mich ein hypothetisches Szenario geben.
Stellen Sie sich ein Twitter-ähnliches System von Followern und Followees vor. Nach einem zugegebenermaßen flüchtigen Blick scheinen die Hauptoptionen zu sein:
In jedem Benutzerdokument ein "followers" -Array, das Verweise auf alle Dokumente anderer Benutzer enthält, denen sie folgen. Follower werden gefunden, indem sie unseren aktuellen Benutzer im Array "user.followers" anderer Benutzer finden. Der Hauptnachteil scheint der mögliche Abfrage-Overhead der Followee-Suche zu sein. Auch für eine Abfrage speziell für den Inhalt von "user.followers" greift MongoDB einfach auf das erforderliche Feld in den Benutzerdokumenten zu, oder wird das gesamte Benutzerdokument gefunden und dann werden die erforderlichen Feldwerte von dort nachgeschlagen und wird diese zwischengespeichert / so gespeichert, dass eine Abfrage über eine große Benutzerdatenbank wesentlich mehr Speicher benötigt?
Speichern Sie in jedem Benutzerdokument sowohl "Follower" als auch "Follower" für einen schnelleren Zugriff auf jedes Mitglied. Dies hat offensichtlich den Nachteil von doppelten Daten in dem Sinn, dass ein Eintrag für den Benutzer A, der dem Benutzer B folgt, in beiden Benutzerdokumenten in dem jeweiligen Feld existiert, und das Löschen von von dem eine übereinstimmende Löschung in dem anderen erfordert. Technisch könnte dies in Erwägung gezogen werden, die Anzahl möglicher Fehlerpunkte für eine einfache Löschung zu verdoppeln. Und leidet MongoDB nach wie vor an dem, was ich als "swiss cheesing" seiner im Speicher gespeicherten Daten beschrieben habe, wenn Löschungen auftreten, und so verdoppelt die Entfernung aus den 2 Feldern anstatt 1 die Wirkung dieses Speicherlochproblems?
Eine separate Sammlung zum Speichern von Followern von Benutzern, ähnlich wie die Benutzerdokumente in 1- abgefragt, mit der Ausnahme, dass die einzigen Daten, auf die zugegriffen wird, Follower sind, wenn die Benutzerdokumente ziemlich viele andere relevante Daten enthalten Für jeden Benutzer vermeiden wir den Zugriff auf diese Daten. Dies scheint jedoch etwas relationales Datenbank-Feeling zu haben und obwohl ich weiß, ist das nicht immer ein schrecklicher Ansatz, grundsätzlich, wenn einer der anderen erwähnten Ansätze (oder einer, den ich nicht in Betracht gezogen habe) unter Mongos Architektur besser ist Ich würde gerne lernen!
Wenn jemand irgendwelche Gedanken dazu hat oder mir sagen will, dass ich irgendwo eine sehr relevante und offensichtliche Doku-Seite verpasst habe, oder mir sogar sagen will, dass ich nur dumm bin (dachte mit einer Erklärung warum? Bitte;)) Ich würde gerne von dir hören!
Dies ist ein klassisches Follower-Follower-Problem und es gibt keine Antwort darauf ... Lesen Sie diesen Link:
mongo db design der folgenden und feeds, wo sollte ich einbetten?
Tatsächlich eignet sich diese Situation sehr gut für ein relationales Schema, wenn MongoDB und SQL Server die einzigen Möglichkeiten waren, die Sie hatten. Aber das ist eine spezielle Art von relationalem Problem, bei dem Sie eine wechselseitige Beziehung haben. Dies kann vielleicht besser durch eine Graphdatenbank bewältigt werden:
Ссылка
Die Sache ist, dass Sie entweder Follower oder Follower in einem Benutzerdokument behalten können, aber nicht beides, um doppelte Löschprobleme zu vermeiden. Also, wenn Sie bei MongoDB bleiben müssen, könnte ein Ausweg sein .. (unter der Annahme, dass die Leute nicht häufig jemandem folgen / nicht folgen das ),
Behalte nur die Folgebetroffenen im Dokument, denn wenn ich mein Profil anschaue, würde ich mich für die Leute interessieren, denen ich folge. (Das ist der Grund, warum ich ihnen überhaupt gefolgt bin, oder?) Und dann eine Frage wie :
db.Users.find({ user_id : { $in : followees })
Dies wird sagen, wer alle mir folgen (sagen meine ID ist 'user_id').
Ein anderer Grund, warum ich nicht umgekehrt vorschlage, ist, dass man höchstens 30-40 Leuten folgen kann, also sollte Benutzerdokument, das 30-40 Follower speichert, in Ordnung sein gegenüber einem Benutzerdokument, das tausende Follower speichert! Mit dem Followee-in-document-Ansatz erhalten Sie eine ungefähr gleichgroße Anzahl an Benutzerdokumenten. Bei der Follower-in-Document-Methode haben Sie einige sehr kleine, aber auch einige sehr umfangreiche Dokumente. Und abhängig von der Anzahl der Follower-Daten, die du eingibst (falls vorhanden, abgesehen von der Follower-ID), solltest du vorsichtig mit der Begrenzung der Dokumentgröße umgehen.
Da es eine Beziehung von vielen zu vielen ist, sieht die Option (2) gut für mich aus. Was die passenden Löschungen betrifft, so ist das normalerweise kein Problem, solange Sie zwischen den beiden Dokumenten eine Art Abgleichsmechanismus haben.
Die Fragmentierung hängt im Allgemeinen von den Zugriffsmustern der Anwendung ab und ist bei den meisten Datensystemen ein Problem. Einige wichtige Änderungen wurden an Mongo vorgenommen, um interne Fragmentierung zu vermeiden. Darüber hinaus gibt es Offline-Komprimierungsalternativen, um die Fragmentierung zu beheben, falls dies geschieht.