Sie müssen die Art der Abfragen berücksichtigen, die Sie ausführen müssen, und wie häufig jeder Typ benötigt wird. Als ich an etwas Ähnlichem gearbeitet habe, sind mir sechs mögliche Aktionen eingefallen:
- Unternimm etwas mit den Eltern
- Unternimm etwas mit den Kindern
- Unternimm etwas mit den Vorfahren (Eltern von Eltern, Eltern von Eltern von Eltern usw.)
- Unternimm etwas mit den Nachkommen (Kinder von Kindern, Kinder von Kindern von Kindern usw.)
- Beziehungen ändern (Knoten in der Hierarchie hinzufügen/verschieben/löschen)
- Ändern Sie die Hauptdaten im aktuellen Knoten (z. B. Ändern des Werts im Feld "Titel")
Sie sollten schätzen, wie wichtig diese für Ihre Anwendung sind.
Wenn der größte Teil Ihrer Arbeit darin besteht, mit gespeicherten Daten für einen bestimmten Artikel zu arbeiten, einschließlich seiner unmittelbaren Eltern und Kinder, die erste Idee ist am nützlichsten. Tatsächlich ist es in MongoDB durchaus üblich, alle benötigten Informationen in demselben Dokument zu platzieren, anstatt extern darauf zu verweisen, sodass Sie nur eine Sache abrufen und nur mit diesen Daten arbeiten müssen. Die letzten vier Aktionen in der Liste sind jedoch kniffliger.
Insbesondere müssen Sie in diesem Fall den Baum durchlaufen, um Vorfahren und Nachkommen abzurufen, sich durch Zwischendokumente bewegen und einem Pfad folgen, auch wenn Sie sich möglicherweise nur für das letzte Dokument im Pfad interessieren. Dies kann bei langen Hierarchien langsam sein. Das Ändern von Beziehungen kann das Verschieben vieler Informationen in mehreren Dokumenten erfordern, da alle Daten in jedem Dokument vorhanden sind. Aber auch das Ändern eines einzelnen Feldes wie "Titel" kann lästig sein, da Sie berücksichtigen müssen, dass dieses Feld in mehreren verschiedenen Dokumenten vorhanden ist, entweder als Hauptfeld oder unter den Eltern- oder Kinderfeldern.
Im Grunde Ihre erste Idee funktioniert am besten in mehr statischen Anwendungen wo Sie die Daten nach der anfänglichen Erstellung nicht viel ändern, aber wo Sie sie regelmäßig lesen müssen.
Die MongoDB-Dokumentation enthält fünf empfohlene Ansätze für den Umgang mit baumartigen (hierarchischen) Strukturen. Alle haben unterschiedliche Vor- und Nachteile, aber alle machen es einfach, die Hauptdaten in einem Artikel zu aktualisieren, indem sie dies nur in einem Dokument tun müssen.
- Übergeordnete Referenzen :Jeder Knoten enthält einen Verweis auf seinen Elternknoten.
- Vorteile :
- Schnelle Elternsuche (Suche nach "_id" =Ihr Dokumenttitel, Rückgabefeld "Eltern")
- Schnelle Kindersuche (Suche nach "Eltern" =Ihr Dokumenttitel, der alle Kinderdokumente zurückgibt)
- Das Aktualisieren von Beziehungen ist nur eine Frage der Änderung des "Eltern"-Felds
- Das Ändern der zugrunde liegenden Daten erfordert Änderungen an nur einem Dokument
- Nachteile :
- Die Suche nach Vorfahren und Nachkommen ist langsam und erfordert eine Traversierung
- Kinderreferenzen :Jeder Knoten enthält ein Referenzarray zu seinen Kindern
- Vorteile :
- Schneller Abruf von untergeordneten Elementen (Rückgabe des untergeordneten Arrays)
- Schnelle Beziehungsaktualisierung (aktualisieren Sie bei Bedarf einfach das Array der Kinder)
- Nachteile :
- Um einen übergeordneten Knoten zu finden, müssen Sie Ihre _id in allen untergeordneten Arrays aller Dokumente nachschlagen, bis Sie sie finden (da der übergeordnete Knoten den aktuellen Knoten als untergeordnetes Element enthält)
- Die Suche nach Vorfahren und Nachkommen erfordert das Durchqueren des Baums
- Vorteile :
- Reihe von Vorfahren :Jeder Knoten enthält einen Verweis auf ein Array seiner Vorfahren und seiner Eltern
- Vorteile :
- Schneller Abruf von Vorfahren (keine Traversierung erforderlich, um einen bestimmten zu finden)
- Einfaches Nachschlagen von Eltern und Kindern nach dem "Elternreferenzen"-Ansatz
- Um Nachkommen zu finden, suchen Sie einfach nach den Vorfahren, da alle Nachkommen dieselben Vorfahren enthalten müssen
- Nachteile :
- Sie müssen sich darum kümmern, das Array der Vorfahren sowie das übergeordnete Feld immer auf dem neuesten Stand zu halten, wenn sich die Beziehungen ändern, oft über mehrere Dokumente hinweg.
- Vorteile :
- Materialisierte Pfade :jeder Knoten enthält einen Pfad zu sich selbst - erfordert regex
- Vorteile :
- Untergeordnete und untergeordnete Elemente mit Regex leicht zu finden
- Kann einen Pfad verwenden, um Eltern und Vorfahren abzurufen
- Flexibilität, wie das Finden von Knoten anhand von Teilpfaden
- Nachteile :
- Beziehungsänderungen sind schwierig, da sie möglicherweise Änderungen an Pfaden über mehrere Dokumente hinweg erfordern
- Vorteile :
- Verschachtelte Sätze :Jeder Knoten enthält ein „linkes“ und „rechtes“ Feld, um die Suche nach Teilbäumen zu erleichtern
- Vorteile :
- Nachkommen lassen sich einfach und optimal abrufen, indem zwischen "links" und "rechts" gesucht wird
- Wie beim Ansatz "Elternreferenz" ist es einfach, Eltern und Kinder zu finden
- Nachteile :
- Muss Struktur durchqueren, um Vorfahren zu finden
- Beziehungsänderungen schneiden hier am schlechtesten ab als jede andere Option, weil jedes einzelne Dokument im Baum möglicherweise geändert werden muss, um sicherzustellen, dass "links" und "rechts" immer noch Sinn machen, wenn sich etwas in der Hierarchie ändert
- Vorteile :
Die fünf Ansätze werden ausführlicher in der MongoDB-Dokumentation behandelt .
Ihre zweite Idee kombiniert die oben diskutierten Ansätze "Elternreferenzen" und "Kindreferenzen". Dieser Ansatz macht es einfach, sowohl die untergeordneten als auch die übergeordneten Elemente zu finden, und macht es einfach, Beziehungen und die Hauptdaten eines Artikels zu aktualisieren (obwohl Sie sowohl die übergeordneten als auch die untergeordneten Felder aktualisieren müssen), aber Sie müssen sie dennoch durchlaufen Vorfahren und Nachkommen zu finden.
Wenn Sie daran interessiert sind, Vorfahren und Nachkommen zu finden (und sich mehr darum kümmern, als Beziehungen einfach aktualisieren zu können), können Sie Ihrer zweiten Idee ein Vorfahren-Array hinzufügen, um auch die Abfrage nach Vorfahren und Nachkommen zu vereinfachen. Natürlich wird das Aktualisieren von Beziehungen zu einem echten Problem, wenn Sie dies tun.
Fazit:
-
Letztendlich hängt alles davon ab, welche Maßnahmen am dringendsten erforderlich sind. Da Sie mit Artikeln arbeiten, deren zugrunde liegende Daten (wie der Titel) sich häufig ändern können, möchten Sie vielleicht die erste Idee vermeiden, da Sie nicht nur das Hauptdokument für diesen Artikel aktualisieren müssten, sondern alle untergeordneten Dokumente sowie die Elternteil.
-
Ihre zweite Idee macht es einfach, die unmittelbaren Eltern und Kinder abzurufen. Das Aktualisieren von Beziehungen ist auch nicht allzu schwierig (es ist sicherlich besser als einige der anderen verfügbaren Optionen).
-
Wenn Sie es wirklich einfach machen wollen, Vorfahren und Nachkommen auf Kosten der Aktualisierung von Beziehungen zu finden, wählen Sie eine Reihe von Vorfahrenreferenzen aus.
-
Versuchen Sie im Allgemeinen, die Anzahl der erforderlichen Durchläufe zu minimieren, da sie eine Art Iteration oder Rekursion erfordern, um zu den gewünschten Daten zu gelangen. Wenn Sie die Möglichkeit schätzen, Beziehungen zu aktualisieren, sollten Sie auch eine Option wählen, die weniger Knoten im Baum ändert (übergeordnete Referenzen, untergeordnete Referenzen und Ihre zweite Idee können dies tun).