www.wikidata.de-de.nina.az
Der Begriff Nested Sets verschachtelte Mengen bezeichnet ein Modell zur Abbildung eines Baumes mit Hilfe von Mengen die ineinander verschachtelt sind Dabei wird die ist Kind von Beziehung auf eine ist Teilmenge von Beziehung abgebildet Das Modell wurde ursprunglich im Buch SQL for Smarties von Joe Celko vorgestellt Es wird hauptsachlich im Rahmen von Datenbankanwendungen eingesetzt Diese Technik ist auch unter dem Namen Modified Preorder Tree Traversal MPTT bekannt Mit Hilfe von Nested Sets erkauft man sich die Moglichkeit Teilbaume oder den Pfad zur Wurzel mit konstantem Aufwand auslesen zu konnen zum Preis beim Andern des Baumes mit komplexeren Operationen arbeiten zu mussen Inhaltsverzeichnis 1 Klassische Baumstruktur 2 Baumstruktur als verschachtelte Mengen 2 1 Beispiel 3 Operationen 3 1 Knoten einfugen 3 2 Transformieren einer Baumstruktur in verschachtelten Mengen 3 3 Teilbaum entfernen 4 Auswertung 4 1 Anzahl aller Knoten eines Teilbaums 4 2 Pfad zu einem Knoten 4 3 Alle Knoten eines Teilbaumes 4 4 Alle Blatter eines Teilbaumes 4 5 Tiefensuche 5 Vor und Nachteile 6 WeblinksKlassische Baumstruktur BearbeitenDer klassische Ansatz zur Implementierung einer Baumstruktur in einer Datenbank ist das Adjazenzlisten Modell Hierbei wird zu jedem Knoten eine Referenz auf dessen Elternknoten abgelegt Die Wurzel hat dabei keinen Verweis zu einem Elternknoten das Feld ist mit NULL belegt ein Blatt ist ein Knoten zu dem kein anderer Knoten verweist Baumstruktur als verschachtelte Mengen BearbeitenBeim Nested Sets Modell wird die Baumstruktur in ineinander verschachtelte Mengen transformiert Jeder Knoten entspricht einer Teilmenge jede Teilmenge ist eine Teilmenge aller ihrer Eltern Mengen In einer Datenbank konnen diese verschachtelten Mengen reprasentiert werden indem fur jede Teilmenge zwei Werte bestimmt werden die die Grenzen dieser Teilmenge bestimmen Diese Werte werden oft mit links und rechts bezeichnet Der Wert links ist immer kleiner als rechts Beide Werte einer Teilmenge sind grosser als der Wert links ihrer Elternmenge und kleiner als deren Wert rechts Die folgende Grafik zeigt einen Baum der in verschachtelte Mengen transformiert wurde Die grunen Zahlen an den Randern einer Menge sind die oben beschriebenen Werte links an der linken Kante und rechts an der rechten Kante Beispiel Bearbeiten nbsp Operationen BearbeitenKnoten einfugen Bearbeiten Die Teilmenge fur den ersten Knoten erhalt die Werte 1 fur links und 2 fur rechts Wird eine weitere Teilmenge fur einen neuen Knoten unterhalb eines bestehenden Knotens eingefugt wird rechts fur die frischgebackene Elternmenge um 2 erhoht Damit dies moglich ist muss vorher im gesamten Baum jeder Wert links oder rechts der grosser als der ursprungliche Wert rechts der neuen Elternmenge ist ebenfalls um 2 erhoht werden Die Werte rechts minus 2 und rechts minus 1 der Elternmenge werden dann der neu eingefugten Teilmenge als links und rechts zugeordnet Zu beachten ist hierbei dass anders als beim herkommlichen Adjazenzlisten Modell die Reihenfolge der Kinder eines Knotens erhalten bleibt Die soeben beschriebe Vorgehensweise ist aquivalent dazu neue Knoten immer ans Ende der Liste der Kinder des Elternknotens anzuhangen Genauso ist es denkbar eine neue Teilmenge an beliebiger Stelle zwischen den anderen Teilmengen der Elternmenge einzufugen Dabei mussen dann die Werte links und rechts der auf die neu eingefugte Teilmenge folgenden Kinder ebenfalls erhoht werden Transformieren einer Baumstruktur in verschachtelten Mengen Bearbeiten Eine bereits existierende Baumstruktur kann in verschachtelte Mengen uberfuhrt werden in dem sie der Tiefe nach durchlaufen wird Dabei werden beginnend bei 1 die Kanten gezahlt Jedes Mal wenn ein Knoten betreten wird wird diesem der Wert des Zahlers als links zugeordnet und der Zahler erhoht Wenn der Knoten verlassen wird nachdem alle seine Kinder bearbeitet wurden wird ihm der Wert des Zahlers als rechts zugeordnet und der Zahler abermals erhoht Teilbaum entfernen Bearbeiten Um einen vollstandigen Teilbaum zu entfernen werden zunachst die Werte links und rechts der Wurzel des Teilbaumes bestimmt Danach kann dieser mitsamt seinen Teilmengen geloscht werden indem alle Knoten geloscht werden deren Werte fur links und rechts innerhalb dieser Werte liegen oder mit ihnen ubereinstimmen Abschliessend mussen noch alle links Werte sowie alle rechts Werte um die Breite des Teilbaumes verringert werden die grosser als der rechts Wert des zu entfernenden Knotens sind die Breite ist hierbei die Differenz zwischen rechts und links dessen Wurzel plus 1 Auswertung BearbeitenAnzahl aller Knoten eines Teilbaums Bearbeiten Die Halfte der Breite eines Teilbaums entspricht der Anzahl der Knoten in diesem Teilbaum inklusive der Wurzel Somit kann die Anzahl der Knoten im gesamten Baum ermittelt werden indem der Wert rechts minus dem Wert links der Wurzel durch zwei geteilt und auf gerundet wird Pfad zu einem Knoten Bearbeiten Im Gegensatz zum Adjazenzlistenmodell muss beim Nested Sets Modell der Pfad zu einem Knoten nicht rekursiv ermittelt werden Es genugt alle Teilmengen zu selektieren deren links Werte kleiner sind und deren rechts Werte gleichzeitig grosser sind als die des betrachteten Knotens Werden diese Teilmengen nach ihrem links Wert sortiert entspricht ihre Reihenfolge dem Weg von der Wurzel zum betrachteten Knoten Alle Knoten eines Teilbaumes Bearbeiten Alle Knoten unterhalb eines gegebenen Knotens konnen ermittelt werden indem alle Teilmengen selektiert werden deren Werte links und rechts sich innerhalb der Werte links und rechts des bearbeiteten Knotens befinden Beim Adjanzenzlistenmodell musste hier ebenfalls rekursiv vorgegangen werden Alle Blatter eines Teilbaumes Bearbeiten Die Abfrage nach einem kompletten Teilbaum kann leicht so modifiziert werden dass nur Blatter also Knoten ohne eigene Kinder selektiert werden Hierzu wird bei der Selektion als zusatzliches Kriterium rechts links 1 verwendet Tiefensuche Bearbeiten Um alle Knoten des Baumes gemass einer Tiefensuche zu enumerieren reicht bereits ein einfaches SELECT mit Sortierung aus Und das in beiden Varianten preorder Eltern vor Kind sowie postorder Kind vor Elternknoten Ebenso ist die durchlaufene Reihenfolge der Kindknoten aufgrund der symmetrischen Bedeutung von links und rechts durch eine leichte Variation der Sortierbedingung einfach umkehrbar SELECT FROM tree ORDER BY r DFS postorder SELECT FROM tree ORDER BY l DFS preorder SELECT FROM tree ORDER BY l DESC DFS reverse postorder smallest child last SELECT FROM tree ORDER BY r DESC DFS reverse preorder smallest child last Die zusatzliche Bestimmung der Knotentiefe beim Durchlauf ist mit Hilfe eines Self Joins moglich Hierbei werden alle Tupel aus zwei Knoten selektiert bei denen die Werte links und rechts des ersten Knotens zwischen den Werten links und rechts des zweiten Knotens liegen Dabei kann die Tiefe jedes Knotens ermittelt werden in dem gezahlt wird wie oft ein Tupel mit diesem Knoten als erstem Knoten auftritt Das Ergebnis wird nach dem Wert links der enthaltenen Knoten sortiert Diese Abfrage konnte in SQL beispielsweise so aussehen SELECT COUNT parent id 1 AS depth node id FROM tree AS node tree AS parent WHERE node l BETWEEN parent l and parent r GROUP BY node id ORDER BY node l Bei grossen Nested Sets ware ein solcher Self Join nur durch das Anlegen zusatzlicher Indizes auf links und rechts laufzeittechnisch uberhaupt realisierbar Daher wird in der Praxis haufig ein gemischtes Modell von Adjazenzlisten und Nested Sets verwendet zu jedem Knoten also noch zusatzlich der Verweis auf den Elternknoten und die Knotentiefe mit abgelegt Durch diesen vernachlassigbaren Mehraufwand beim Schreiben erreicht man so effiziente Auswertungsmoglichkeiten fur viele vergleichbare Fragestellungen Vor und Nachteile BearbeitenDie Komplexitat beim Lesen ist in den meisten Fallen konstant Beim Adjazenzlistenmodell ist der Aufwand linear abhangig von der Tiefe des bearbeiteten Knotens Im Tausch ist eine Anderung des Baumes beim Nested Sets Modell wesentlich aufwandiger als beim Adjazenzlistenmodell Somit eignet es sich besser fur Strukturen die nicht haufig modifiziert aber sehr oft gelesen werden Die Darstellung als Mengen passt besser in die mengenorientierte Welt der Datenbanken Mit der Abfragesprache SQL kann auf Mengen besser operiert werden als auf hierarchischen Strukturen Das Abfragen der direkten Kinder eines Knotens ist schwierig Die Reihenfolge der Kinder eines Knotens bleibt erhalten Weblinks BearbeitenJede Menge Baume Nested Sets von Arne Klempert Baume in SQL von Christoph Reeg Das Nested Sets Modell Baeume mit SQL von php resource de Adjecency List vs Nested Set Postgresql von Explain Extended englisch Adjecency List vs Nested Set SQL Server von Explain Extended englisch Adjecency List vs Nested Set ORACLE von Explain Extended englisch Adjecency List vs Nested Set MySQL von Explain Extended englisch Abgerufen von https de wikipedia org w index php title Nested Sets amp oldid 228589281