Datenbankstruktur für Baumdatenstruktur


151

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 Server (seit 2008) bietet den hierarchyid Datentyp
BornToCode

Antworten:


80

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.


Hallo, ich stehe genau dem gleichen Problem gegenüber, das in der Frage angegeben ist, und möchte Ihnen eine Frage zu den oben genannten Themen stellen. In Anbetracht einer Struktur wie im ersten Thema (strukturierte Organisationstabelle (nicht mitarbeiterstrukturiert) mit ParentId, auf die in derselben Tabelle verwiesen wird) muss ich festlegen, wer der Chef eines bestimmten Bereichs ist. Ich werde alle Mitarbeiter dieses bestimmten Bereichs direkt ihm zuweisen. Wo würden Sie den Chef dieses bestimmten Bereichs hinstellen? Im selben Bereich oder in einem Gorup darüber? Mein Ansatz ist es, ihn / sie auf die obige Gruppe zu verweisen, was mir eine bessere Struktur gibt, denke ich. Vielen Dank.
Marcos Buarque

1
Der erste Link scheint unterbrochen zu sein.
Jorge Leitao

Hervorragende Antwort. Danke @JeremyDWill!
Bobocopy

56

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.


Ihr Link hat ein sehr interessantes Thema, das diskutiert wird. Vielen Dank!
Fritz

9

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.


2

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.


Ich habe eine Protokolltabelle mit einer LogID-Identitätsspalte und eine ParentLogID-Spalte mit einem FK, der auf die LogID-Spalte verweist. Wenn die erste Protokollzeile in einer Transaktion geschrieben wird, greife ich zu SCOPE_IDENTITY (). Alle anderen Protokollsätze werden mit diesem Wert in die ParentLogID-Spalte geschrieben. Dies ist sehr nützlich, um zusammengehörige Zeilen zu gruppieren. Dies ist der einzige wirkliche Weg, um zu sehen, was passiert ist. Ohne dies wäre es ein riesiges Durcheinander von Protokollzeilen aus mehreren Transaktionen, die alle miteinander vermischt sind.
KM.

@KM - Er sagte "macht Sinn" nicht "macht keinen Sinn"
John Rasch


1

Ich habe die folgende Implementierung auf SQL Server 2005 verwendet. Überprüfen Sie hier


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.