Frage

Ich bin neugierig zu wissen, was der beste Weg (Best Practice) Hierarchien in Bezug auf Datenbank-Design zu handhaben sind. Hier ist ein kleines Beispiel dafür, wie ich sie in der Regel behandeln.

Knotentabelle

NodeId int PRIMARY KEY
NodeParentId int NULL
DisplaySeq int NOT NULL
Title nvarchar(255)

Vorfahr Tabelle

NodeId int
AncestorId int
Hops int

mit Indizes auf NodeId, AncestorId, Hops

Tabellen wie folgt aussehen:

Knotentabelle

NodeId    NodeParentId    DisplaySeq    Title
1         NULL            1             'Root'
2         1               1             'Child 1'
3         1               2             'Child 2'
4         2               1             'Grandchild 1'
5         2               2             'Grandchild 2'

Vorfahr Tabelle

NodeId    AncestorId    Hops
1         NULL          0
1         1             0
2         1             1
2         2             0
3         1             1
3         3             0
4         1             2
4         2             1
4         4             0
5         1             2
5         2             1
5         5             0

Mit diesem Entwurf habe ich festgestellt, dass mit großen Hierarchien ich einen ganzen Abschnitt der Hierarchie durch den Beitritt auf der Vorfahr Tabelle sehr schnell für AncestorId = Ziel NodeId bekommen kann, wie:

SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId

Es ist auch einfach als auch direkte Kinder zu bekommen

SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
AND Hops = 1

Ich bin daran interessiert zu wissen, was andere Lösungen, die Sie für diese Art der Sache verwendet haben. Nach meiner Erfahrung können Hierarchien ziemlich haarig, und eine Möglichkeit, deren Wiederherstellung zu optimieren, ist sehr wichtig.

War es hilfreich?

Lösung

Wie MarkusQ und n8wrl bereits hingewiesen haben, Joe Celko hat einige gute Sachen zu diesem Thema. Ich werde nur hinzufügen, dass es mehr Möglichkeiten gibt, eine Hierarchie zu modellieren (Joes Buch enthält mehrere ich glaube, nicht nur ein, dass er die „beste“ betrachtet). Ihre endgültige Entscheidung wird hoffentlich berücksichtigen Ihre spezifischen Bedürfnisse. Einige der verschiedenen Möglichkeiten, modellieren sie sind besser für schreibintensive Operationen, während andere besser sind für häufige oder schnell liest und unten in der Hierarchie. Denken Sie daran, was Ihr System mit ihm tun.

Andere Tipps

Es gibt einige herstellerspezifische Erweiterungen, dies zu tun, aber mein Favorit db neutral kommt von Joe Celko - google ‚Joe Celko Bäume und Hierarchien‘ oder dieses Buch kaufen: link text

Dies ist ein sehr kluger Satz-basierter Weg zu gehen. Einfache Hierarchie abzufragen. Ich fügte hinzu, die ‚parentID‘ Feld, das Sie gerade, weil ich die ‚direkte Kinder‘ und ‚Eltern‘ Fragen viel fragen und beschleunigt diejenigen auf. Aber dies ist ein wunderbarer Weg, um eine ‚Abstammung‘ oder ‚descdent‘ Abfrage zu erhalten.

Sie können auch die „verschachtelte Sätze“ Muster prüfen wollen:

  

http://www.intelligententerprise.com/001020/celko.jhtml   (Broken-Link)

Oder Sie können Google für mehr.

P. S .: Flüche, n8wrl , geben Sie schneller als ich!

SQL Server 2008 eingeführt, um den hierarchyid Datentyp

In Oracle können Sie CONNECT BY / START MIT verwenden hierarchische Daten abzufragen. In SQL Server können Sie eine gespeicherte Prozedur verwenden, die sich selbst rekursiv aufruft.

Ich würde auf jeden Fall verschachtelte Gruppen empfehlen. Sie sind groß.

http://threebit.net/tutorials/nestedset/tutorial1.html http://www.dbmsmag.com/9603d06.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top