Speichern von Composite-Patterns (Hierarchical Data) in Datenbank
-
22-08-2019 - |
Frage
Was ist 'Best Practices' für Composite-Muster in einer relationalen Datenbank zu speichern?
Wir haben mit modifizierten Preorder-Baum-Traversal. Dies ist sehr schnell den ganzen Baum zu bauen, aber sehr langsam, um neue Knoten einfügen oder löschen (alle links und müssen richtige Werte eingestellt werden). Auch die Abfrage der Kinder eines Knotens ist nicht einfach und sehr langsam.
Eine andere Sache, die wir bemerkt, ist, dass Sie wirklich sicher machen müssen den Baum nicht unordentlich bekommt. Sie müssen Transaktionssperren, sonst werden die linken und rechten Werte korrupt bekommen, und eine beschädigte Links-Rechts-Baum Befestigung ist keine leichte Aufgabe.
Es funktioniert jedoch sehr gut, die modifizierte Preorder-Baum-Traversal, aber ich frage mich, ob es bessere Alternativen.
Lösung
Während alle Abkömmlinge einer Reihe mit MPTT finden schnell ist, können alle Kinder zu finden langsam sein. Allerdings sollten Sie in der Lage sein, das zu beheben, indem ein parent_id
Feld auf den Tisch fügt hinzu, dass Datensätze (ja, redundant) das Mutter der Reihe. Dann wird die Suche:
SELECT *
FROM tbl
WHERE parent_id = z
Ja, enthält parent_id
redundante Informationen, die möglicherweise Ihre Tabelle Denormalisierung - aber da jede insert / update / delete erfordert bereits globale Änderungen, halten parent_id
up-to-date ist nicht viel extra zu bezahlen. Sie könnten alternativ ein level
Feld verwenden, die die vertikale Ebene der Reihe aufzeichnet, obwohl dies in der Tat ist mehr wahrscheinlich unter bestimmten Arten von Transformationen ändern (zB einen Teilbaum zu einem anderen Punkt im Baum bewegt) .
Die gute alte link-to-Eltern-Darstellung (dh nur parent_id
und keinen left_pos
oder right_pos
), ist natürlich schneller für insert / update-hohe Arbeitsbelastung, aber die nur Anfragen effizient beantworten können, sind „Finden Sie die Eltern von X“und‚die Kinder von X.‘ Die meisten Workloads beinhalten viel mehr Lese als das Schreiben, so in der Regel MPTT insgesamt schneller ist - aber vielleicht in Ihrem Fall müssen Sie prüfen, zu bewegen ( „back“) zu koppeln-to-parent
Andere Tipps
Der beste Weg, hierarchische Daten in einer Datenbank zu speichern, die ich gehört habe ist ein String-Attribut zu verwenden, in denen der Inhalt der Liste der Eltern, sagen Doppelpunkte getrennt ist.