Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Neuerungen in SQL Server 2008: Der HierarchyId-Datentyp

Möchte man hier­ar­chi­sche Daten able­gen – wie z.B. Organisationsstrukturen in Unternehmen, so war das Standard-Vorgehen dazu bis­her, 2 Felder zu ver­wen­den – zunächst die Id des eigent­li­chen Elements und in einem wei­te­ren Feld die Id des Elternknotens.

Beispiel für Speicherung hierarchischer Daten

Damit las­sen sich Abfragen wie: "Wer ist direk­ter Vorgesetzter des Mitarbeiters X?" oder "Welche Mitarbeiter sind direkt dem Vorgesetzten Y unter­stellt?" recht ein­fach beant­wor­ten. Umfangreichere Aussagen wie: "Was sind alle direk­ten und indi­rek­ten Mitarbeiter des Managers X?" oder "Wer ist Ebene-3-Manager des Mitarbeiters Y?" sind damit schon schwie­ri­ger zu ermitteln.

Nun kommt der HierarchyId-Datentyp ins Spiel. Mit ihm kön­nen sol­che Zusammenhänge dar­ge­stellt und ein­fach abge­fragt wer­den. Als Besonderheit gilt es zu beach­ten, dass die­ser Datentyp als CLR-Datentyp imple­men­tiert ist, der aller­dings auch dann zur Verfügung steht, wenn CLR-Integration deak­ti­viert ist. Daraus resul­tie­rend lei­tet sich auch die Darstellung der Funktionen ab. Dazu aber spä­ter mehr. Zunächst möchte ich die oben gezeigte Struktur mit die­sem Datentyp auf­bauen. Dazu erstelle ich eine neue Tabelle.

Erstellung der Tabelle

Im nächs­ten Schritt wird diese mit Daten gefüllt.

Daten einfügen

Lässt man sich nun die Daten ein­mal anzei­gen, ergibt sich fol­gen­des Bild:

Gespeicherte Daten

Man erkennt, dass die Daten vor­lie­gen – aller­dings ist OrgNode eine hexa­de­zi­male Darstellung, die nicht ganz so benut­zer­freund­lich ist. Dafür gibt es Abhilfe, denn die Methode ToString gibt die kano­ni­sche Darstellung des OrgNodes zurück:

GetString-Beispiel

Nun erkennt man die hier­ar­chi­schen Beziehungen schon besser.

Um die Vorteile auch kom­plett aus­nut­zen zu kön­nen, sollte man einen Blick auf die Methoden des HierarchyId-Datentyps werfen:

  • GetRoot(): ermit­telt den Hauptknoten
  • GetAncestor(n): ermit­telt den n‑ten Vaterknoten
  • GetDescendant(child1, child2): ermit­telt Kindknoten
  • GetLevel(): ermit­telt die Hierarchieebene
  • IsDescendantOf(): ermit­telt, ob eine hier­ar­chi­sche Beziehung (ist y Kind von x) zwi­schen 2 Knoten besteht
  • ToString(): Konvertierung in die kano­ni­sche Form
  • Parse(): Konvertierung aus der kano­ni­schen Form
  • GetReparentedValue(): nütz­lich zum Umhängen von Teilstrukturen

Spalten des Datentyps HierarchyId ach­ten nicht selbst auf die Eindeutigkeit. Aus die­sem Grund ist es sinn­voll, einen ein­deu­ti­gen Index auf die Spalte zu legen. Je nach Anwendungsfall unter­schei­det man hier Depth-First-Index und Breadth-First-Index. Beim Depth-First-Index wird zuerst in die Tiefe gegan­gen – also zuerst alle Kindelemente des Knotens 1 indi­ziert, bevor zu Knoten 2 über­ge­gan­gen wird. Beim Breadth-First-Index wird Ebene für Ebene indiziert.

Das Anlegen eines Depth-First-Index ist recht tri­vial – dazu indi­ziert man ein­fach eine bestehende HierarchyId-Spalte.

Depth-First-Index

Für die Anlage eines Breadth-First-Indexes benö­tigt man noch eine zusätz­li­che Spalte in der Tabelle, in der der Level per­sis­tiert und die dann in den Index mit ein­be­zo­gen wird.

Breadth-First-Index

Related Posts

Hallo, ich ver­su­che gerade ein Java Produkt (bis jetzt lief alles mit Oracle) an MSSQL Server anzu­pas­sen. Einer der Aufgaben ist Hierarchischen Queries von Oracle opti­mal für MSSQL zu imple­men­tie­ren. Die mög­lich­keit mit den zwei Spalten kenne ich schon, lei­der ist das per­for­mance­mä­ßig nicht so gut, des­we­gen habe ich mir über­legt der neue Datentyp HIERARCHYID zu neh­men. Leider kann ich keine Implementierung für JDBC fin­den. So meine Frage ist: Ist der Datentyp nur für CLR imple­men­tiert oder kann man das auch mit JDBC benutzen?
Ich werde mich auf jede Hilfe freuen.

Gruß

Hallo, soweit ich weiß, unter­stützt der aktu­elle JDBC-Treiber hierarchyId nicht. Mit der letz­ten Version sind zwar Features wir Unterstützung für datetime2 und datetime­off­set hin­zu­ge­kom­men, aber hierarchyId war lei­der nicht dabei
(s. http://msdn.microsoft.com/de-de/library/aa342325.aspx)
Gruß Martin

Danke für die schnelle Antwort Martin! Das ist natür­lich ärger­lich, dass der Datentyp nicht unter­stützt ist. Hmm trotz­dem danke.

Comments are closed.

Pin It on Pinterest