Gute Übersichten
Im Allgemeinen treffen Sie eine Entscheidung zwischen schnellen Lesezeiten (z. B. verschachtelter Satz) oder schnellen Schreibzeiten (Adjazenzliste). Normalerweise erhalten Sie eine Kombination der folgenden Optionen, die Ihren Anforderungen am besten entspricht. Im Folgenden finden Sie einige ausführliche Informationen:
- Noch ein Vergleich zwischen verschachtelten Intervallen und Adjazenzliste : Der beste Vergleich von Adjazenzliste, materialisiertem Pfad, verschachtelter Menge und verschachteltem Intervall, den ich gefunden habe.
- Modelle für hierarchische Daten : Folien mit guten Erklärungen zu Kompromissen und Beispielverwendung
- Darstellung von Hierarchien in MySQL : Insbesondere ein sehr guter Überblick über Nested Set
- Hierarchische Daten in RDBMS : die umfassendsten und am besten organisierten Links, die ich gesehen habe, aber nicht viel zur Erklärung
Optionen
Eine, die mir bekannt ist und allgemeine Merkmale:
- Adjazenzliste :
- Spalten: ID, ParentID
- Einfach zu implementieren.
- Günstiger Knoten wird verschoben, eingefügt und gelöscht.
- Teuer, um das Level, die Abstammung und die Nachkommen, den Pfad zu finden
- Vermeiden Sie N + 1 über Common Table Expressions in Datenbanken, die diese unterstützen
- Verschachteltes Set (auch bekannt als Modified Preorder Tree Traversal )
- Spalten: Links, rechts
- Billige Abstammung, Nachkommen
- Sehr teure
O(n/2)
Verschiebungen, Einfügungen, Löschungen aufgrund flüchtiger Codierung
- Brückentabelle (auch bekannt als Closure Table / w-Trigger )
- Verwendet eine separate Verknüpfungstabelle mit: Vorfahr, Nachkomme, Tiefe (optional)
- Billige Vorfahren und Nachkommen
- Schreibt Kosten
O(log n)
(Größe des Teilbaums) für das Einfügen, Aktualisieren und Löschen - Normalisierte Codierung: Gut für RDBMS-Statistiken und Abfrageplaner in Joins
- Erfordert mehrere Zeilen pro Knoten
- Abstammungsspalte (auch bekannt als Materialized Path , Path Enumeration)
- Spalte: Abstammung (zB / Elternteil / Kind / Enkel / etc ...)
- Günstige Nachkommen per Präfixabfrage (zB
LEFT(lineage, #) = '/enumerated/path'
) - Schreibt Kosten
O(log n)
(Größe des Teilbaums) für das Einfügen, Aktualisieren und Löschen - Nicht relational: basiert auf dem Array-Datentyp oder dem serialisierten Zeichenfolgenformat
- Verschachtelte Intervalle
- Wie verschachtelte Menge, jedoch mit real / float / decimal, damit die Codierung nicht flüchtig ist (kostengünstiges Verschieben / Einfügen / Löschen)
- Hat Real / Float / Dezimaldarstellung / Präzisionsprobleme
- Die Matrixcodierungsvariante fügt die Ahnencodierung (materialisierter Pfad) "kostenlos" hinzu, jedoch mit zusätzlicher Schwierigkeit der linearen Algebra.
- Flacher Tisch
- Eine modifizierte Adjazenzliste, die jedem Datensatz eine Spalte für Stufe und Rang (z. B. Reihenfolge) hinzufügt.
- Günstig zu iterieren / paginieren
- Teuer verschieben und löschen
- Gute Verwendung: Diskussionsfäden - Foren / Blog-Kommentare
- Mehrere Abstammungsspalten
- Spalten: Eine für jede Abstammungsstufe bezieht sich auf alle Eltern bis zur Wurzel, Stufen von der Stufe des Gegenstands werden auf NULL gesetzt
- Billige Vorfahren, Nachkommen, Level
- Billig einfügen, löschen, bewegen der Blätter
- Teures Einfügen, Löschen, Verschieben der internen Knoten
- Harte Grenze, wie tief die Hierarchie sein kann
Datenbankspezifische Hinweise
MySQL
Orakel
- Verwenden Sie CONNECT BY , um Adjazenzlisten zu durchlaufen
PostgreSQL
- ltree-Datentyp für Materialized Path
SQL Server
- Allgemeine Zusammenfassung
- 2008 bietet HierarchyId- Datentyp scheint beim Lineage Column-Ansatz zu helfen und die darstellbare Tiefe zu erweitern.
Closure Tables
überlegen sindAdjacency List
,Path Enumeration
undNested Sets
in Bezug auf die Benutzerfreundlichkeit (und ich nehme an Leistung als auch).