Speichern von zusammengesetzten Mustern (hierarchische Daten) in der Datenbank

8

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.

    
Lieven Cardoen 29.03.2009, 16:42
quelle

2 Antworten

6

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:

%Vor%

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?

    
j_random_hacker 29.03.2009, 17:08
quelle
0

Der beste Weg, Hierakial-Daten in einer Datenbank zu speichern, die ich gehört habe, ist die Verwendung eines String-Attributs, wobei der Inhalt die Liste der Eltern ist, die durch, sagen wir, Doppelpunkte getrennt sind.

    
tomjen 29.03.2009 17:08
quelle