Was sind die Optionen für die Speicherung von hierarchischen Daten in einer relationalen Datenbank?

Gute Übersichten

Generell, Sie machen eine Entscheidung zwischen schnell mal Lesen (zum Beispiel, nested set) oder schnell mal schreiben (angrenzens Liste). In der Regel werden Sie am Ende mit einer Kombination der folgenden Optionen, die am besten zu Ihren Bedürfnissen passen. Im folgenden werden einige in-Tiefe Lesung:

Optionen

Denen ich mir bewusst bin-und Allgemeine Funktionen:

  1. Nähe Liste:
    • Spalten: ID, ParentID
    • Einfach zu implementieren.
    • Billig-Knoten bewegt, Einfügungen und Löschungen.
    • Teuer zu finden, die Ebene, Abstammung & Nachkommen, Pfad
    • Vermeiden N+1 über Common Table Expressions in Datenbanken, die Sie unterstützen
  2. Nested Set (ein.k.ein Modified Preorder Tree Traversal)
    • Spalten: Links, Rechts
    • Billig Abstammung, Nachkommen
    • Sehr teuer O(n/2) bewegt, Einfügungen, Löschungen aufgrund des volatilen Codierung
  3. Bridge-Tabelle (ein.k.ein. Schließung Tabelle /w-Trigger)
    • Verwendet separate join-Tabelle: Vorfahren, Nachkommen, Tiefe (optional)
    • Günstigen Vorfahren und Nachkommen
    • Schreibt Kosten O(log n) (Größe Teilbaum) für einfügen, aktualisieren, löschen
    • Normalisierte Kodierung: gut für die RDBMS-Statistiken & query planner schließt
    • Erfordert mehrere Zeilen pro Knoten
  4. Abstammung Spalte (ein.k.ein. Materialized Path, Path Enumeration)
    • Spalte: Linie (z.B. /Eltern/Kind/Enkel/etc...)
    • Billig Nachkommen über prefix-Abfrage (z.B. LEFT(lineage, #) = '/enumerated/path')
    • Schreibt Kosten O(log n) (Größe Teilbaum) für einfügen, aktualisieren, löschen
    • Nicht-relationale: basiert auf Array-Datentyp oder serialisierte string-format
  5. Geschachtelte Intervalle
    • Wie verschachtelte Satz, aber mit real/float/decimal, so dass die Codierung nicht flüchtig (preiswert verschieben/einfügen/löschen)
    • Hat real/float/decimal-Darstellung/Präzisions-Themen
    • Matrix-Codierung-Variante fügt Vorfahren Codierung (materialized path) für "frei", aber mit zusätzlichen trickiness der linearen algebra.
  6. Flat Tisch
    • Eine modifizierte Nachbarschaft-Liste, fügt ein Level und Rang (z.B. Bestellung) - Spalte jedes Datensatzes.
    • Billig zu iterieren/paginieren über
    • Teuer, verschieben und löschen
    • Gut Verwenden: Gewinde-Diskussion - Foren /blog-Kommentare
  7. Mehrere herkunftsspalten
    • Spalten: eine für jede Linie Ebene bezieht sich auf alle Eltern, die bis zu der Wurzel, werden die Ebenen nach unten aus dem Element s-Ebene auf NULL gesetzt
    • Günstigen Vorfahren, Nachkommen, Ebene
    • Günstigen einfügen, löschen, verschieben der Blätter
    • Teuer, einfügen, löschen, verschieben von dem internen Knoten
    • Hart an der Grenze, wie tief die Hierarchie

Datenbank-Spezifische Hinweise

MySQL

Oracle

  • Verwenden VERBINDEN zu durchqueren Angrenzens Listen

PostgreSQL

SQL Server

Nach slideshare.net/billkarwin/sql-antipatterns-strike-back Seite 77 Closure Tables überlegen sind Adjacency List, Path Enumeration und Nested Sets in Bezug auf die Benutzerfreundlichkeit (und ich vermute, die Leistung sowie).
Ich vermisse eine sehr einfache version hier: eine einfache BLOB. Wenn Ihre Hierarchie nur noch ein paar dozend Elemente, die einen serialisierten Baum von id ' s könnte die beste option sein.
Frage ist ein community-wiki, so fühlen sich frei, um es haben. Mein Gedanke dabei: ich würde es nur tun, die mit den Datenbanken unterstützen eine Art von blob-Strukturierung, wie Sie XML mit einem stabilen Anfragesprache wie XPATH. Ansonsten sehe ich nicht ein guter Weg, von der Abfrage abgesehen von abrufen, Deserialisieren und munge im code, nicht SQL. Und wenn du wirklich ein problem, wo Sie brauchen, eine Menge von beliebigen Elementen könnten Sie besser dran, mit Knoten wie bei einer Datenbank Neo4J, die ich jemals benutzt habe und mochte, wenn auch nie bis zur Produktion.
Für MS SQL Server: Kombination von Id-ParentId-und HierarchyId-Ansätze für Hierarchische Daten
Die MSDN-link für den "Allgemeinen Zusammenfassung" nicht mehr zeigt der Artikel. Es wurde in der September 2008-Ausgabe des MSDN Magazins, die Sie herunterladen können, als eine CHM-Datei, oder sehen Sie über das web-Archiv unter: web.archive.org/web/20080913041559/http://msdn.microsoft.com:80/...

InformationsquelleAutor | 

Schreibe einen Kommentar