Baumstruktur in Datenbank eintragen

Also das siehst du so falsch wens um Prefix system geht.
Die erste Spalte wird auf Autoincrement gesetzt eben die Id Spalte.
Danach folgt der name dann die Prefix spalte danach die Sortierungs spalte danach die on_off spalte.

Durch die Id Spalte wird eine Vortlaufende nummer vergeben ob die durcheinander ist oder nach der Reihe bwz. mittendrin was ausgelassen wird ist dabei egal. Wichtig ist nur dabei das es die Id nummer nur 1 gibt in der gesamten Tabelle(also keine Redunaz bei der Id spalte) also daher auf Autoincremt stellen und Primarykey.

Das Prefix system arbeitet nach folgenden Schema

ID|Prefix
0 2
1 1
2 3
3 3

So um nun die Erklärung zum Prefix Beispiel.
Menü mit der Id 0 ist ein Untermenü vom Menu der id gruppe 2
Menü mit der Id 1 ist ein Hauptmenü (Also wurzelzweig)
Menü mit der id 2 ist ein Untermenü vom Menü 3
Menü mit der id 3 ist ein Hauptmenü (Also im Wurzelzweig)
unsw.

Wenn noch fragen gibt zum Prefix system dann einfach sagen ich werds dann versuchen so gut es mir möglich ist es zu erklären, Da es am Anfang nicht leicht ist es zu verstehen.

Mit nun der zusätzlich Sort spalte kann man das ganze leicht sortieren bwz in der Reihenfolge ausgeben wie man möchte. Dabei hat man 2 möglichkeiten entweder man sortiert absteigen oder Aufsteigend je nach dem kann man die Reihenfolge mit einer Zahl bestimmen niedriege zahl ganz vorne hoche zahl ganz unten oder umgekehrt wenn man anderes Sortiert hohe Zahl vorne und niedriege Zahl hinten.

Daher baut sich der Baum folgender massen auf:
Zuerst werden alle Hauptmenüs bestimmt danach schaut sql auf die sort spalt und sortiert alle nach der vorgeben Reihnfolge. Danach schaut sql weiter auf auf alle untermenüs eines Hauptmenüs und sortiert die dort genauso und so weiter. Das ganze wird dann eben mit dem einem oben gepostet Sql befehl durchgeführt.

Mfg Splasch
 
Zuletzt bearbeitet:
okay, ich hatte gerade fast meine Nachricht fertig geschrieben, da hat es erst "klick" gemacht und ich denke ich weiß jetzt was du meinst °(n____n)° endlich!

Du meinst mit Präfix (was im übrigen eine Endung ist, die an etwas angehängt wird; und ich glaube kaum, dass du das meinst) soetwas wie im Nested-Sets-Modell die Levels -> also die Ebene, die Höhe auf welchem sich ein Blatt oder eine Wurzel befindet (also ob sie sich auf gleicher Verschachtelungstiefe befinden :rolleyes: )
Du verschweigst mir jedoch, wie du das Level ermitteln möchtest ;) und ich denke, dass an dieser Stelle das Nested-Sets-Modell eindeutige vorteile liefert ^^

achso ganz nebenbei, ich weiß was auto_increment ist, ich bin nicht ganz so blöd wie du vielleicht denkst ^^° wenn ich jemand wäre, der noch nie etwas von auto_increment gehört hätte, würde ich mich wohl kaum mit solchen Modellen beschäftigen :p

EDIT: achso noch ein Tipp ;) habe gerade gesehen, dass du für on_off (visible wäre übrigens eindeutiger) einen Buchstaben verwendest. Für boolsche Variablen verwendet man in MySQL normalerweise '' und 0 bei char(0) ;) -> kostet u.a. nur 1 Bit Speicherplatz
 
Zuletzt bearbeitet:
@Sturmi
Ich hab den Eindruck das du noch nicht verstanden hast wie das Schema funktioniert.Im erklären war ich eben noch nie gut.

Daher versuch ich es mal mit anderen Worten auszudrücken.
Die Prefix spalte gibt den beziehungs punkt an.Also die Ebene in der sich der Menü punkt befindet.
Wenn die Prefix spalte den gleichen Wert hat wie die Id spalte dann handels es sich um einen Wurzel Punkt also ein Menü punkt der keinen anderen untergeordnet ist.

Wenn allerdings die Prefix spalte einen anderen Wert hat als die Id Spalte dann gibt der Prefix wert den Beziehungspunkt in der Baumstruktur an.
Zum Beispiel wenn in einen Datensatz die Prefix spalte auf 3 steht dann ist er dem Menü punkt 3 untergeordnet auser die id spalte ist auch 3.Dies bedeuted weiter alle Prefix spalten die auch den wert 3 haben sind alle dem Menü punkt 3 untergeordnet also dem Punkt wo die Id Spalte auch 3 ist.

Ich versuch das mal an einem Beispiel zu demostrieren.
Id|prefix|name
5 3 haus
3 3 baum
7 3 nuss
9 3 apfel

In dem Fall hätten wir 3 untermenüs die alle dem Menü Punkt 3 (als baum) zugeordent sind.
Das Menü würde also so ausehen
baum
-haus
-nuss
-apfel

So hier noch ein anderes mit mehren Eben zur Verdeutlichung
Id|prefix|name
0 1 auto
1 1 klein
2 0 haus
3 2 tor
4 2 ball

In dem Fall haben wir 1 Wurzelverzeichnis mit mehren unter ebenen.
Das Menü würde dan so aussehen.

klein
-auto
--haus
---tor
---ball

Beachtet dabei die bindestrich(-) der steht für eine weiter unter Ebene.
Erklärung:
klein ist Wurzel durch (1,1) dem wiederum ist auto durch Prefix 1 zugeteilt.klein hat keine weiteren untermenü mehr ,aber dem auto ist ein weiteres untermenü zugeteilt.

auto hat die id 0 und haus hat ein Prefix mit 0 daher ist haus ein untermenü von auto .Da es keine weiteren spalten mit Prefix 0 gibt hat auto keine weiteren untermenüs mehr.

Anderes sieht bei haus aus dort gibst 2 weiter untermenü tor und ball die haben beide das Prefix 2 und sind daher dem haus untergeordnet das die Id 2 hat.

Kurze zusammenfassung vom Beispiel oben.
Id|prefix|name
0 1 auto -- dem klein untergeordnet
1 1 klein -- Wurzel
2 0 haus -- dem auto untergeordnet da aber auto schon klein untergeordnet ist ergibst sich eine weiter unterebene
3 2 tor -- dem haus untergeordner da aber haus schon 2 Ebene unter geordnet ist befindet sich tor dann in der 3 Ebene
4 2 ball -- Gilt selbe wie bei Tor ist in der 3 unter Ebene da es dem haus zugeordnet ist


Ich weiß es ist am Anfang nicht leicht zu verstehen aber wenn man mal weis wie das System funktioniert ist es leicht.

Mfg Splasch
 
Zuletzt bearbeitet:
Ja es ähnlicht dem System.(Mir wars nur unter einem anderen Begriff bekannt)

Was man eben je nach Bedarf erweitern kann. Sowie in meinen Beispiel das manuele bestimmen der Reihenfolge sowie das Ausblenden der Einzelen Knoten.

@Sturmi
Ich hoffe du hast soweit verstanden wie das nun Funktioniert.
Wenn nicht einfach nochmal fragen.

Mfg Splasch
 
also Matthias Reitinger hat absolut recht... anstelle des Präfix könnte auch stehen parentId...

Was du mir die ganze Zeit versuchst du erklären splasch, IST das Adjazenzlisten-Modell alias parent- oder child-Modell... und es ist in keinster Weise kompliziert! Du versuchst mir hier meine Frage zu erklären, die diesen Thread gestartet hat ^^ tut mir leid, aber bisher hast du mir in keinster Weise weiter geholfen, auch wenn du es gut meintest (ich glaube nicht, dass du am Anfang einfach nur einen Denkfehler hattest und nicht die Courage besessen hättest deinen Fehler zuzugeben, auch wenn es langsam danach aussieht)
Du hast mich jedoch in meiner Entscheidung bestärkt, das Nested-Sets-Modell zu nutzen, da das Adjazenzlisten-Modell absolut nicht für meine Zwecke geeignet ist, egal wie sehr man es auch optimiert...

Und damit würde ich ganz gerne dieses Thema beenden, es gibt genügend andere Threads wo bereits ausführlich über das Adjazenzlisten-Modell geschrieben wurde ^^
Ich habe ja jetzt meine Lösung :) und knobel schon ganz eifrig an einer Funktion, die es mir ermöglichst Äste in andere Ebenen zu verschieben (was nicht so besonders einfach scheint)
 
*grins* ich bin selber auch schon recht weit ;D lass mir noch bis morgen Mittag Zeit, dann komme ich gerne auf deinen Lösungsvorschlag zurück :rolleyes:
mein Problem bisher ist hauptsächlich, dass folgende Punkte je nach Fall zusammen gehören bzw. kombinierbar sind (ich möchte nicht alles doppelt und dreifach schreiben)

- Äste in ein neues Level verschieben
- wo neues Level > alt Level​
- wo neues Level < alt Level​

prinzipiell kann man mit einigen SELECT abfragen ja alles "recht einfach" umschreiben...aber die Performance ist dabei einfach grotten schlecht :eek: und wenn man später einmal einen Baum hat und Levelunterschiede von mehreren 100 hat, könnte es passieren, dass das System vollends zusammenbricht XD ...hmmm, schwierig, schwierig :rolleyes:
 
Ich erzähl dir einfach mal von meinem Lösungsanstz - vielleicht siehst du da ja noch Verbesserungsmöglichkeiten.

Hier meine Schritte:
  • Den zu verschiebenden Knoten (inkl. aller Kinder, sofern dieser welche besitzt) ermitteln und dessen UID in einem Array zwischenspeichern.
  • Die Lücke, die der zu verschiebende Knoten hinterlassen würde, muss geschlossen werden. Jedoch muss darauf geachtet werden, dass die in Schritt 1 gemerkten Datensätze nicht berührt werden!!
  • Jetzt müssen die left & right Werte des Zielknoten ermittelt werden, die können sich natürlich in Schritt 2 geändert haben, deswegen werden die Werte erst jetzt ermittelt. Ich hab es so gemacht, dass Knoten in einen Knoten (append) bzw. vor einem bestimmten Knoten eingefügt werden können (insertBefore). Je nach Modus berechne ich die Differenz, die im letzten Schritt zur Berechnung der neuen left und right Werte des zu verschiebenden Knoten benötigt werden.
Code:
// append:
$intDifference = $intTargetRight-$intMoveLeft;

// insertBefore:
$intDifference = $intTargetLeft-$intMoveLeft;
  • Jetzt muss für den zu verschiebenden Knoten eine neue Lücke aufgerissen werden.
  • Zu guter Letzt wird der Knoten in die im vorherigen Schritt erzeugte Lücke verschoben.

Soviel zur Theorie, wie die einzelnen Statements aussehen, verrate ich dir erstmal nicht - schließlich hab ich schon mitbekommen, dass du auf meinen vorherigen Eintrag geantwortet hast. ;) Gutes gelingen! Ich schau mir den Rainer an und hoffe, dass der heute noch mal die Rodelbahn hinunter "Wokt" :D
 
Zurück