Sturmrider
Erfahrenes Mitglied
Guten Abend zusammen,
ich beschäftige mich schon seit längerem mit Bäumen und stehe nun vor einem Problem, auf welches ich leider noch keine zufriedenstellende Antwort gefunden habe
Die gängigen Ausgabe-Methoden eines Baums aus einer Datenbank (wie z.B. in diesem Tutorial: http://www.tutorials.de/forum/php-tutorials/27144-menusystem-mit-php-und-mysql.html) funktionieren ab einem bestimmten Fall nicht mehr:
id | childid | text
1 | 0 | ...
2 | 1 | ...
3 | 1 | ...
4 | 8 | ...
5 | 2 | ...
6 | 1 | ...
7 | 6 | ...
8 | 7 | ...
nämlich, wenn die childIds, parentIds oder wie man sie nennen möchte nicht mehr in einer Reihenfolge sind dies kann ja ziemlich schnell passieren, wenn man beispielsweise eine verschieben-Funktion hat, die ganze Zweige oder einfache Elemente verschieben kann...
Wie gestalte ich daher eine eingabe/verschieben-Funktion am besten so, dass der Eintrag an die richtige Position der childIds gesetzt wird?
Prinzipiell würde ich dies folgendermaßen machen (jedoch ergibt dies eine regelrechte Query-Flut und scheint mir wenig sinnvoll...):
-> einen Zweig (Z1) mit einer hohen childId (C1) einer id (Z2) mit einer viel niedrigeren childId (C2) zuordnen
1. C1 von Z1 durch C2 von Z2 ersetzen (damit bekommen wir oben angeführtes Problem)
2. nachfolgende ids nach Z2 alle mit der Anzahl der Elemente von Z1 addieren, sowie ihre childids anpassen (dies in einer rekursiven-Funktion (Query-Flut) -> dabei beachten, dass man nicht mit der id von Z1 kollidiert, diese also überspringt
3. alle Elemente von Z1, sowie ihren childids C1 in die entstandene Lücke aus 2. setzen und natürlich wieder childIds anpassen
4. die entstandene Lücke weiter hinten in den Ids aus 2., wo ja beachtet wurde, dass keine Kollision statt findet, mit evtl. nachfolgenden Ids stopfen und ihre childIds erneut anpassen... -> da bei mehrfachem verschieben sonst zu viele große Lücken entstehen und die Datenbank unübersichtlich wird...
Dies ist aber doch keine akzeptable Lösung...bei einem großen Baum bekomme ich so evtl. sogar ein buffer-overflow...
Wie habt/würdet ihr dieses Problem lösen? Habe ich vielleicht etwas übersehen?
ich beschäftige mich schon seit längerem mit Bäumen und stehe nun vor einem Problem, auf welches ich leider noch keine zufriedenstellende Antwort gefunden habe
Die gängigen Ausgabe-Methoden eines Baums aus einer Datenbank (wie z.B. in diesem Tutorial: http://www.tutorials.de/forum/php-tutorials/27144-menusystem-mit-php-und-mysql.html) funktionieren ab einem bestimmten Fall nicht mehr:
id | childid | text
1 | 0 | ...
2 | 1 | ...
3 | 1 | ...
4 | 8 | ...
5 | 2 | ...
6 | 1 | ...
7 | 6 | ...
8 | 7 | ...
nämlich, wenn die childIds, parentIds oder wie man sie nennen möchte nicht mehr in einer Reihenfolge sind dies kann ja ziemlich schnell passieren, wenn man beispielsweise eine verschieben-Funktion hat, die ganze Zweige oder einfache Elemente verschieben kann...
Wie gestalte ich daher eine eingabe/verschieben-Funktion am besten so, dass der Eintrag an die richtige Position der childIds gesetzt wird?
Prinzipiell würde ich dies folgendermaßen machen (jedoch ergibt dies eine regelrechte Query-Flut und scheint mir wenig sinnvoll...):
-> einen Zweig (Z1) mit einer hohen childId (C1) einer id (Z2) mit einer viel niedrigeren childId (C2) zuordnen
1. C1 von Z1 durch C2 von Z2 ersetzen (damit bekommen wir oben angeführtes Problem)
2. nachfolgende ids nach Z2 alle mit der Anzahl der Elemente von Z1 addieren, sowie ihre childids anpassen (dies in einer rekursiven-Funktion (Query-Flut) -> dabei beachten, dass man nicht mit der id von Z1 kollidiert, diese also überspringt
3. alle Elemente von Z1, sowie ihren childids C1 in die entstandene Lücke aus 2. setzen und natürlich wieder childIds anpassen
4. die entstandene Lücke weiter hinten in den Ids aus 2., wo ja beachtet wurde, dass keine Kollision statt findet, mit evtl. nachfolgenden Ids stopfen und ihre childIds erneut anpassen... -> da bei mehrfachem verschieben sonst zu viele große Lücken entstehen und die Datenbank unübersichtlich wird...
Dies ist aber doch keine akzeptable Lösung...bei einem großen Baum bekomme ich so evtl. sogar ein buffer-overflow...
Wie habt/würdet ihr dieses Problem lösen? Habe ich vielleicht etwas übersehen?