Baumstruktur in Datenbank eintragen

Moin

Ich hatte mich der Sache vor einiger Zeit auch mal angenommen, und bin dann so vorgegangen:

Da man für das ganze Umherschieben usw. eh ein Interface benötigt, habe ich das Ganze in JS mit Listen gemacht. Die genannten Methoden(appendChild, insertBefore etc.) sind dort ja vorhanden, so lässt sich dort alles sauber verschieben. Die Berechnung der lft und rgt-Werte habe ich auch gleich in JS vorgenommen, mann muss da im Endeffekt ja nur die Knoten durchlaufen und die Anzahl von Kindern und Kindeskindern zählen. Die Daten brauchten dann fix&fertig nur noch eingetragen zu werden. :)

Ich weiss jetzt garnicht mehr, ob ich die Sache fertiggemacht habe :-)
Ich werd mal gucken, ob ichs noch irgendwo finde :-(
 
Ich hatte die letzten Tage leider ziemlich viel fürs Abi zu tun :( aber ich habe mir trotzdem so
meine Gedanken über das "Problem" gemacht.

@Chainy
Ich kann deinen von dir vorgestellten Ansatz ab schritt 3 nicht mehr so ganz nachvollziehen :(
z.B. verstehe ich nicht, wie du die evtl. nachfolgenden Elemente der Wurzel anpasst, unter die die zu verschiebende gesetzt werden soll.
Mein bisheriges Modell weißt leider noch ein paar Lücken auf, aber ich denke eine genauere Fallunterscheidung als bei deinem Modell könnte das ganze mehr besser optimieren.

@Sven Mintel
Wäre toll wenn du das findest :) würde mich interessieren, wie du das gelöst hast!
 
Okay, also ich versuch es dir mal anhand einiger SQL-Beispiele besser zu erklären. Um die Lücke in Schritte 2 schließen zu können, muss erst berechnet werden, um welchen Wert sich die left- & right-Werte der nachfolgenden Datensätze geändert werden müssen. Dieser Wert wird in Schritt 4 wieder verwendet, nämlich um eine neue Lücke, an der neuen Position im Baum zu schaffen. Der Wert berechnet sich aus den left- & right-Werten des zu verschiebenden Knotens.
PHP:
// round((right-left)/2)*2
$intDifference = round(($intRight-$intLeft)/2)*2;
Das Sql-Statement um den left-Wert zu korrigieren sieht so aus: (:table, :left, :difference usw. sind Platzhalter)
Code:
UPDATE :table SET :left = :left-:difference WHERE :left > :leftValue AND :primary NOT IN(:ids)
In Schritt 3 muss jetzt der neue left-Wert des Knotens berechnet werden, der right-Wert ergibt sich ja unweigerlich aus dem neuen left-Wert und der Differenz aus Schritt 2. Dabei muss jetzt beachtet werden, ob du den Knoten am Ende des Zielknotens einfügen willst (append) oder direkt vor dem Zielknoten (insertBefore). Beispiel für das anfügen am Ende des Zielknotens:
PHP:
// den left-Wert des zu verschiebenden Knotens: $intOldLeft;
$intNewLeft = $objTargetRight;
In Schritt 4 wird eine neue Lücke geschaffen.Das Sql-Statement um den left-Wert zu korrigieren sieht so aus: (hier finden sich wieder Platzhalter; :leftValue ist ein Platzhalter für $intNewLeft; :difference wird durch den Wert, der in Schritt 2 berechnet wurde, ersetzt)
Code:
UPDATE :table SET :left = :left+:difference WHERE :left >= :leftValue AND :primary NOT IN(:ids)
In Schritt 5 wird der Knoten letztenendes verschoben. In Schritt 3 haben wir den neuen left-Wert berechnet. Aus dem neuen und alten left-Wert bilden wir nun eine Differenz.
PHP:
$intDifference = $intNewLeft-$intOldLeft;
Das Sql-Statement dazu, wieder gefüllt mit Platzhaltern, sieht wie folgt aus. (:difference könnte den Wert +4 oder -4 haben)
Code:
UPDATE :table SET :left = :left:difference, :right = :right:difference WHERE :primary IN(:ids)
Ich hoffe, dir damit weiterhelfen zu können. :)

Edit: In Schritt 2 & 4 fehlen die Sql-Statements, die den right-Wert anpassen, die müsstest du dir ggf. selbst herleiten oder du fragst einfach noch mal danach. ;)
 
Zuletzt bearbeitet:
Zurück