deStylr

Nested Set´s

Wer kennt Sie nicht, der sich schon mit hirachischen Strukturen beschäftigen musste: Arne Klempert, dieses oder jenes Tutorial, virtuelle MySQL-Kurse, …

Alles auch sehr hilfreich, aber…

… aber irgendwie hören alle in der Mitte auf. Wie geht das denn nun mit dem verschieben von Teilbäumen rauf und runter in der Struktur im Konzept der NestedSet´s, hä?

Verwiesen wird auf die Pear-Klassen, sonstige Klassen und Frameworks - auf die Details und Feinheiten geht niemand ein. Das versuche ich jetzt nachzuholen. ConstructrCMS liegt vor in Version 1.01.3 Beta und komplette Teilbäume (Seiten mit Unterseiten) können in der Struktur beliebig nach dem NestedSet´s-Konzept verschoben werden. Das war noch das Sahnehäubchen was dort fehlte.

Visit ConstructrCMS

Um das gesamte Konzept zu erläutern fehlt mir heute Abend die Zeit, aber ich fange an und mache auch weiter ;-). Das wird jetzt durchgezogen - bis zum bitteren Ende!

Einführung: Was sind Nested Sets?

Ein Bild sagt mehr als tausend Worte, da ich hier mehrere Bilder zeige ist das schon ein recht langer Artikel ;-). Erläuterung zu den folgenden Bildern: Alle Bilder zeigen die identische hirachische Struktur einer Anordnung von Seiten in einer geordneten Struktur (Seitenbaum):

Nested Sets 1

Nested Sets 1

Nested Sets 2

Nested Sets 2

Nested Sets 3

Nested Sets 3

Im einfachsten Fall genügt also eine Datenbanktabelle mit drei Feldern: PK, LFT und RGT - für eine Feinheit nehmen wir noch ein weiteres Feld hinzu, auf das ich später eingehen werde - eine Art temporären Marker.

PK: Der PrimaryKey der Datenbanktabelle

LFT: Der linke Zähler

RGT: Der rechte Zähler

TMP_MARKER (int, oder char, oder sonst was… ist egal)

Mehr benötigt man nicht um eine solche NestedSet´s-Struktur in einer Datenbanktabelle darzustellen. Für ein - sagen wir mal - Content Management System kämen noch ein paar Felder dazu (Seitenname, Sichtbarkeit, …), aber zum darstellen reicht die Struktur vollkommen aus.

1) Anlegen von Seiten

Befindet sich noch keine Seite in der Tabelle, erstellen wir durch das Anlegen einer neuen Seite den Mutter-Knoten (Root). Dieser Grundstein hat als linken Wert (LFT) immer die 1 - feste Regel. Der Rechte Wert (RGT) ergibt sich aus der Anzahl der vorhandenen Unter- oder Folge-Seiten.

Jetzt legen wir in MySQL die Mutter (Root) an:

INSERT INTO TABELLE (PK,LFT,RGT,TMP_MARKER) VALUES (1,1,2,”);

Sind schon Seiten vorhanden, wird beim Anlegen einer neuen Seite automatisch eine Unterseite erstellt (es kann immer nur einen Wurzel -> Root geben - ist wie bei Highlander).

Benötigt wird für das Anlegen einer neuen Unterseite der RGT- und LFT-Wert der zuletzt eingefügten Seite - des Vorgängers im Seiten-Baum. In unserem Fall also die Werte der Root-Seite -> LFT = 1 und RGT = 2, mehr Seiten gibt es noch nicht.

Der LFT-Wert der neuen Unterseite ergibt sich aus dem LFT-Wert des Vorgängers addiert mit 1 (1+1=2). Der LFT-Wert der ersten Unterseite ist also 2. An der Stelle hätten wir aber ein Problem mit der Mutter-Seite: diese hat bis jetzt der Wert 2 als RGT-Wert inne -> muss also geändert werden.

Vor dem Einfügen der ersten Unterseite, wird also bei Mutti ein wenig Platz geschaffen (der Platz für exakt eine einzige Unterseite - mehr wird aktuell nicht benötigt):

UPDATE TABELLE  SET RGT = RGT+2  WHERE RGT >= NEW_LFT;

Wie vergrößern dadurch den RGT-Wert der Mutti. Dadurch ergeben sich die neuen Werte der Mutter-Seite wie folgt:

Aus LFT 1 wird LFT 1 -> weil die Mutti immer die 1 als linken Zähler hat!!!

Aus RGT 2 wird RGT 4 -> damit in die Lücke von 2 bis 4 die neue Seite mit den Werten LFT:2 und RGT:3 passt. Wir fügen die neue Unterseite gefahrenlos ein:

INSERT INTO TABELLE (PK,LFT,RGT,TMP_MARKER) VALUES (2,2,3,”);

War doch net so wild. Wir haben erfolgreich eine Mutter-Seite angelegt und eine Unter-Seite. Das Spiel könnte man nun weiterspielen, bis wir den Seiten-Baum aus den oben gezeigten Bildern nachgebildet haben:

…Jetzt ist Feierabend mit Folge 1, die nächste folgt bald!

No Comments, Comment or Ping

Reply to “Nested Set´s”

You must be logged in to post a comment.

Before you go

Going so soon? May these links be a guide to web enlightenment. Schwing!

Add´s