Was wäre der beste Weg, um eine anpassbare Baumdatenstruktur (dh eine Baumstruktur mit einer unbekannten Anzahl von Ebenen) in einer Datenbank zu implementieren?
Ich habe dies einmal getan, bevor ich eine Tabelle mit einem Fremdschlüssel für sich selbst verwendet habe.
Welche anderen Implementierungen könnten Sie sehen, und ist diese Implementierung sinnvoll?
sql
database-design
tree
CodeMonkey1313
quelle
quelle
Antworten:
Sie erwähnen die am häufigsten implementierte Adjacency List: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets
Es gibt auch andere Modelle, einschließlich materialisierter Pfade und verschachtelter Mengen: http://communities.bmc.com/communities/docs/DOC-9902
Joe Celko hat ein Buch zu diesem Thema geschrieben, das aus allgemeiner SQL-Sicht eine gute Referenz darstellt (es wird im obigen Link zu verschachtelten Artikeln erwähnt).
Außerdem hat Itzik Ben-Gann in seinem Buch "Inside Microsoft SQL Server 2005: T-SQL-Abfrage" einen guten Überblick über die häufigsten Optionen.
Die wichtigsten Dinge, die bei der Auswahl eines Modells zu beachten sind, sind:
1) Häufigkeit der Strukturänderung - Wie häufig ändert sich die tatsächliche Struktur des Baums? Einige Modelle bieten bessere Strukturaktualisierungseigenschaften. Es ist jedoch wichtig, Strukturänderungen von anderen Datenänderungen zu trennen. Beispielsweise möchten Sie möglicherweise das Organigramm eines Unternehmens modellieren. Einige Personen modellieren dies als Adjazenzliste und verwenden die Mitarbeiter-ID, um einen Mitarbeiter mit seinem Vorgesetzten zu verknüpfen. Dies ist normalerweise ein nicht optimaler Ansatz. Ein Ansatz, der häufig besser funktioniert, besteht darin, die Organisationsstruktur getrennt von den Mitarbeitern selbst zu modellieren und den Mitarbeiter als Attribut der Struktur beizubehalten. Wenn ein Mitarbeiter das Unternehmen verlässt, muss die Organisationsstruktur selbst nicht geändert werden, sondern nur die Zuordnung zu dem Mitarbeiter, der das Unternehmen verlassen hat.
2) Ist der Baum schreib- oder leselastig? Einige Strukturen funktionieren beim Lesen der Struktur sehr gut, verursachen jedoch zusätzlichen Aufwand beim Schreiben in die Struktur.
3) Welche Arten von Informationen benötigen Sie, um von der Struktur zu erhalten? Einige Strukturen bieten bestimmte Arten von Informationen über die Struktur. Beispiele sind das Finden eines Knotens und aller seiner untergeordneten Knoten, das Finden eines Knotens und aller seiner Eltern, das Finden der Anzahl der untergeordneten Knoten, die bestimmte Bedingungen erfüllen usw. Sie müssen wissen, welche Informationen von der Struktur benötigt werden, um die Struktur zu bestimmen, die am besten passt Deine Bedürfnisse.
quelle
Schauen Sie sich das Verwalten hierarchischer Daten in MySQL an . Es werden zwei Ansätze zum Speichern und Verwalten hierarchischer (baumartiger) Daten in einer relationalen Datenbank erläutert.
Der erste Ansatz ist das Adjazenzlistenmodell, das Sie im Wesentlichen beschreiben: einen Fremdschlüssel zu haben, der auf die Tabelle selbst verweist. Obwohl dieser Ansatz einfach ist, kann er für bestimmte Abfragen, wie das Erstellen des gesamten Baums, sehr ineffizient sein.
Der zweite im Artikel diskutierte Ansatz ist das verschachtelte Mengenmodell. Dieser Ansatz ist weitaus effizienter und flexibler. Ausführliche Erläuterungen und Beispielabfragen finden Sie im Artikel.
quelle
Wenn Sie Relational DataBase zum Organisieren der Baumdatenstruktur verwenden müssen, verfügt Postgresql über ein cooles ltree-Modul, das den Datentyp für die Darstellung von Datenbeschriftungen bereitstellt, die in einer hierarchischen baumartigen Struktur gespeichert sind. Sie können die Idee von dort bekommen. (Weitere Informationen finden Sie unter: http://www.postgresql.org/docs/9.0/static/ltree.html )
Im Allgemeinen wird LDAP verwendet, um Datensätze in hierarchischer Struktur zu organisieren.
quelle
Einen Tisch mit einem Fremdschlüssel für sich zu haben, macht für mich Sinn.
Sie können dann einen allgemeinen Tabellenausdruck in SQL oder die Anweisung connect by prior in Oracle verwenden, um Ihren Baum zu erstellen.
quelle
Fantastische Sammlung gebrauchsfertiger Funktionen, die mit dem Adjazenzlistenmodell verwendet werden können, um das Leben zu vereinfachen.
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
quelle
Ich habe die folgende Implementierung auf SQL Server 2005 verwendet. Überprüfen Sie hier
quelle
Wenn jemand, der MS SQL Server 2008 und höher verwendet, diese Frage beantwortet: SQL Server 2008 und höher verfügt über eine neue Funktion "hierarchyId", die speziell für diese Aufgabe entwickelt wurde.
Weitere Informationen finden Sie unter https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server
quelle