it-swarm.com.de

So stellen Sie eine baumartige Struktur in einer Datenbank dar

Ich beginne ein Projekt und befinde mich in der Entwurfsphase: Das heißt, ich habe mich noch nicht entschieden, welches DB-Framework ich verwenden werde. Ich werde Code haben, der eine "waldartige" Struktur erzeugt. Das sind viele Bäume, bei denen jeder Baum ein Standard ist: Knoten und Kanten. Nachdem der Code diese Bäume erstellt hat, möchte ich sie in der Datenbank speichern. (und dann irgendwann herausziehen)

Der naive Ansatz zur Darstellung der Daten in der Datenbank ist eine relationale Datenbank mit zwei Tabellen: Knoten und Kanten. Das heißt, die Knotentabelle wird eine Knotennummer, Knotendaten usw. haben. Und die Kantentabelle wird eine Zuordnung von Knotennummer zu Knotennummer sein. 

Gibt es einen besseren Ansatz? Oder angesichts der (begrenzten) Annahmen, die ich gebe, ist dies der beste Ansatz? Wie wäre es, wenn wir die Annahme machen, dass die Bäume relativ klein sind - ist es besser, den ganzen Baum als Blob in der DB zu speichern? Welchen Db-Typ sollte ich in diesem Fall verwenden? Bitte kommentieren Sie die Geschwindigkeit/Skalierbarkeit. 

Vielen Dank

28
Guy

In meiner Antwort auf die StackOverflow-Frage habe ich eine Lösung gezeigt, die Ihren Knoten- und Kantentabellen ähnelt: Wie kann ich einen flachen Tisch am effizientesten/elegantesten in einem Baum analysieren? Ich nenne diese Lösung "Closure Table".

Ich habe eine Präsentation über verschiedene Methoden zum Speichern und Verwenden von Bäumen in SQL, Modelle für hierarchische Daten mit SQL und PHP . Ich habe gezeigt, dass mit den richtigen Indizes (abhängig von den Abfragen, die Sie ausführen müssen) das Closure Table-Design eine sehr gute Leistung haben kann, selbst über große Sammlungen von Kanten (etwa 500.000 Kanten in meiner Demo).

Ich habe auch das Design in meinem Buch behandelt: SQL Antipatterns: Vermeidung der Fallstricke der Datenbankprogrammierung .

18
Bill Karwin

Stellen Sie sicher, dass Sie für die zu behandelnde Entität eine Art Low-Level-Codierung verwenden, um das Schleifen zu verhindern. Die Entität kann ein Teil, ein Betreff, ein Ordner usw. sein.

Mit einer Entity-Datei und einer Entity-Xref-Datei können Sie eine von beispielsweise zwei Beziehungen zwischen den beiden Dateien durchgehen, eine übergeordnete und eine untergeordnete Beziehung.

Eine Ebene ist die Ebene, die eine Entität in einem Baum gefunden hat. Ein Low-Level-Code für die Entität ist die niedrigste Ebene, in der sich eine Entität in einem beliebigen Baum befindet. Stellen Sie sicher, dass der Low-Level-Code der Entität, die Sie als Kind erstellen möchten, kleiner oder gleich ist, um eine Schleife zu verhindern. Nachdem Sie eine Entität als Kind hinzugefügt haben, wird sie um mindestens eine Stufe niedriger.

1
eric