Was sind Best Practices zum Speichern von zusammengesetzten Mustern in einer relationalen Datenbank?
Wir haben Modified Preorder Tree Traversal verwendet. Dies ist sehr schnell, um den gesamten Baum zu erstellen, aber es ist sehr langsam, neue Knoten einzufügen oder zu löschen (alle linken und rechten Werte müssen angepasst werden). Das Abfragen der untergeordneten Elemente eines Knotens ist nicht einfach und sehr langsam.
Eine andere Sache, die wir bemerkt haben, ist, dass Sie wirklich sicherstellen müssen, dass der Baum nicht unordentlich wird. Sie benötigen Transaktionssperren, sonst können die linken und rechten Werte beschädigt werden, und das Korrigieren eines beschädigten linken rechten Baums ist keine einfache Aufgabe.
Es funktioniert jedoch sehr gut, die Modified Preorder Tree Traversal, aber ich frage mich, ob es bessere Alternativen gibt.
Während alle Nachkommen einer Reihe mit MPTT schnell gefunden werden, kann es schwierig sein, alle Kinder zu finden. Allerdings sollten Sie das beheben können, indem Sie Ihrer Tabelle ein parent_id
-Feld hinzufügen, das das Elternelement der Zeile (ja, redundant) aufzeichnet. Dann wird die Suche:
Ja, parent_id
enthält redundante Informationen, die Ihre Tabelle potenziell denormalisieren. Da aber jedes Einfügen / Aktualisieren / Löschen globale Änderungen erfordert, ist es nicht viel zu bezahlen, parent_id
aktuell zu halten. Sie könnten auch ein level
-Feld verwenden, das die vertikale Ebene der Zeile aufzeichnet, obwohl sich dies bei bestimmten Arten von Transformationen (z. B. Verschieben einer Teilstruktur an einen anderen Punkt in der Baum).
Die einfache alte Link-zu-Parent-Repräsentation (dh nur parent_id
und keine left_pos
oder right_pos
) ist natürlich schneller für Arbeitslasten mit Insert / Update-Auslastung, aber die einzigen Abfragen, die effizient beantwortet werden können sind "Finde die Eltern von X" und "Finde die Kinder von X." Die meisten Workloads beinhalten viel mehr Lesen als Schreiben, daher ist MPTT normalerweise insgesamt schneller - aber vielleicht müssen Sie in Ihrem Fall das Verschieben ("Zurück") zu Link-zu-Eltern verschieben?
Tags und Links database hierarchical-data modified-preorder-tree-t