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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top