php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.05.2006, 18:47  
Neuer Benutzer
 
Registriert seit: 13.01.2005
Beiträge: 14
raffnix
Standard nested set dbmodell subtrees verschieben

hallo,

ich beschäftige mich seit einigen tagen mit dem nested set modell.
einfügen an beliebiger stelle, löschen, einzelne nodes verschieben geht alles ... war auch kein problem.

mein problem ist das verschieben von ganzen hierachien.

vom prinzip müsste ich so vorgehen (grob):

1. selektieren aller id´s im subtree
2. prüfen ob es zu einen bruder / schwester zu einem eintrage / node gibt
3. bis zu dem "geschwisternpaar und deren evtl. hierachie" den baum aufbauen
4. jede einzelne geschwisterhierachie nachbilden
5. löschen der alten einträge (nicht das problem)

bin ich da auf dem richtigen weg oder hab ich den holzweg eingeschlagen?
hat von euch jemand schon damit erfahrung (verschieben von ganzen hierachen / subtrees)?
hat jemand evtl. eine doku speziell zu dem thema verschieben von subtrees ...

wäre nett, wenn der eine oder andere (mädels natürlich auch) zeit haben und mir antworten.

danke schon einmal für eure mühe.

ps: ja, das nested set modell mach in meiner situation sinn, da 99,9% der sql anweisungen selects sind und mit rekursiver abfrage hier hohe kosten enstehen. der "baum / hierachie" wird evtl. 1 oder 2 mal am tag erweitert.
raffnix ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.05.2006, 10:31  
Erfahrener Benutzer
 
Registriert seit: 02.03.2005
Beiträge: 306
DerDesian
Standard

Also für gewöhnlich ist der Vorteil an hierarchisch aufgebauten Relationen, dass man einen ganzen Subtree 'umhängen' kann in dem man nur eine einzige ID ändert.

sieht ja für gewöhnlich so aus (weiß narürlich nicht ob deine Tabelle so aussieht):
Code:
table
------------------------------
id | pid | column3 | column4.....
pid ~ parent_id

und dann brauchst du nur die 'pid' zu ändern und gut.
__________________
Wenn dich was ankotzt, machs besser.
DerDesian ist offline   Mit Zitat antworten
Alt 16.05.2006, 11:06  
Neuer Benutzer
 
Registriert seit: 13.01.2005
Beiträge: 14
raffnix
Standard re

erstmal danke für deinen beitrag.

beim nested set modell sieht die aufbau wie folgt aus:

Code:
table
-------------------
id | left | right | root_id (alternativ)
anhand des left und dem right wird definiert, an welcher stelle sich der eintag befindet.

dies hat den vorteil, dass man bei selectionen keine rekursion anwenden muss, die sehr "kostenintensiv" sind.

um einen teilbaum (oder den ganzen) zu selektieren reicht beim nested set modell:

select * from table where left between xxx and yyyy
(wobei xxx der left wert und yyyy der right wert sind, ab dem datensatz von wo man die restlichen daten haben will.

da bei mir 99,9% selectionen anfallen, macht es viel sinn dieses modell zu wählen. nachteil des modelles sind die hohen "kosten" beim manipulieren des baumes (dies kommt aber nur 1 bis 2 mal am tag vor, wenn überhaupt).
raffnix ist offline   Mit Zitat antworten
Alt 16.05.2006, 15:20  
Erfahrener Benutzer
 
Registriert seit: 02.03.2005
Beiträge: 306
DerDesian
Standard

Ich bin mir nicht sicher ob ich das 'Nested-Modell' richtig verstanden habe.
Wenn ich das richtig verstanden habe bedeutet dies, dass die reihenfolge der IDs eine Rolle spielt und dass diese in einem betimmten Wertebereich liegen müssen um in einem Teilbaum zu sein...

Fragen, die ich dazu hätte:
Stehen in 'left' IDs
Stehen in 'right' IDs
Wofür steht die 'root_id'
Nach welchen Kriterien werden 'left' bzw 'right' eingetragen?
__________________
Wenn dich was ankotzt, machs besser.
DerDesian ist offline   Mit Zitat antworten
Alt 16.05.2006, 15:30  
Neuer Benutzer
 
Registriert seit: 13.01.2005
Beiträge: 14
raffnix
Standard re

bevor ich mir die finger wund schreibe, hier ein paar links :wink:

http://www.develnet.org/36.html
http://ffm.junetz.de/members/reeg/DS...00000000000000

gruß und danke
raffnix ist offline   Mit Zitat antworten
Alt 16.05.2006, 20:30  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard Re: nested set dbmodell subtrees verschieben

Zitat:
Zitat von raffnix
1. selektieren aller id´s im subtree
Macht meiner Meinung nach Sinn.

Zitat:
Zitat von raffnix
2. prüfen ob es zu einen bruder / schwester zu einem eintrage / node gibt
3. bis zu dem "geschwisternpaar und deren evtl. hierachie" den baum aufbauen
4. jede einzelne geschwisterhierachie nachbilden
Bei den drei Schritten verstehe ich nicht, was genau du damit meinst.

Zitat:
Zitat von raffnix
5. löschen der alten einträge (nicht das problem)
Wozu willst du die Einträge löschen?

Wichtig wäre meiner Ansicht nach, dass zunächst left und right aller Einträge, die sich nicht in dem zu verschiebenen Subtree befinden, so angepasst werden, dass die beim Verschieben entstehende Lücke nicht auftritt.
Anschließend können die zu verschiebenen IDs durch Aktualisierung von left und right an der neuen Position eingefügt werden.
Zum Schluß müssen dann nur noch left und right für die weiter "rechts" im Baum positionierten Knoten angepasst werden.

Bei Bedarf kann ich auch gerne mal nachschauen, ob ich etwas älteren Code von mir wiederfinde, in dem ich entsprechende Aktionen umgesetzt hatte.
xabbuh ist offline   Mit Zitat antworten
Alt 16.05.2006, 20:47  
Neuer Benutzer
 
Registriert seit: 13.01.2005
Beiträge: 14
raffnix
Standard re

ja ... punkt 2-4 stammen aus meinen vielen gedanken darüber

mittlerweile scheiter ich an der manipulation von lft und rgt
irgendwie stell ich mich bei der "berechnung" der lft und rgt werte des zu verschiebenden subtrees zu dumm an

das erhöhen des rechten baumes ist kein problem, das hab ich schon hinbekommen *g* nur eben das manipulieren des einzufügenden subtrees scheitert

>Bei Bedarf kann ich auch gerne mal nachschauen, ob ich etwas älteren >Code von mir wiederfinde, in dem ich entsprechende Aktionen >umgesetzt hatte.

das wäre cool ein ansatz würde mir schon viel helfen
ein paar bier wären dir sicher
raffnix ist offline   Mit Zitat antworten
Alt 16.05.2006, 21:56  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

versuch's mal hiermit:
http://pear.php.net/package/DB_NestedSet
guck dir dabei die DB_NestedSet_DB::moveTree() - methode an.

grüße
axo
axo ist offline   Mit Zitat antworten
Alt 17.05.2006, 09:25  
Neuer Benutzer
 
Registriert seit: 13.01.2005
Beiträge: 14
raffnix
Standard re axo

danke für deinen tipp.

Zitat:
Zitat von axo
versuch's mal hiermit:
http://pear.php.net/package/DB_NestedSet
guck dir dabei die DB_NestedSet_DB::moveTree() - methode an.

grüße
axo

das hatte ich schon gefunden ... bin leider nicht daraus schlau geworden
raffnix ist offline   Mit Zitat antworten
Alt 17.05.2006, 10:09  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

naja, wenn du den code nicht durchs durchlesen nachvollziehen kannst, solltest du evtl. einfach die pear-klasse verwenden, denn dann bist du noch nicht ganz soweit, um das problem selbst zu lösen.
das verwenden der klasse ist eh schon nicht ganz einfach, aber bei weitem einfacher als das selber-implementieren, und deinem wissensstand wohl eher angemessen.

die klasse ist mehr als nur gut dokumentiert, und alles was es dazu zu sagen gibt, haben die jungs als kommentare in den quellcode geschrieben. eine persönliche anleitung auf deutsch kannste dir knicken, das dauert zu lang, und du solltest eh schnell englisch lernen.

führe die klasse halt aus, sie hat sogar einen debug-modus, mithilfe dessen du wunderbar sehen kannst, was intern passiert.

[edit]
... und wenn du's brennend wissen willst:
http://www.amazon.com/gp/product/1558609202
soweit ich weiß, kann man das nur per amazon usa bestellen, dauert dementsprechend 4 wochen bis es da ist, aber es ist das einzige buch, das bäume in sql überhaupt behandelt (zumindest ist das mein wissensstand).
[/edit]

grüße
axo
axo ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dateien verschieben per php PHP Tipps 2004 4 02.01.2010 15:26
Nested Sets und viele Fragen... BartTheDevil89 Datenbanken 7 13.08.2008 10:18
Nested Sets oder Rekursion? litterauspirna PHP Tipps 2008 8 06.06.2008 16:57
Ordner inkl. aller Unterordner und Dateien verschieben? BartTheDevil89 PHP Tipps 2008 6 14.02.2008 08:45
Nested Sets in ein Mehrdimensionales Array Simon9990 PHP-Fortgeschrittene 2 29.10.2007 17:38
Wieso verschieben sich diese Tabellen? Chr!s HTML, Usability und Barrierefreiheit 3 29.09.2005 17:41
SQL Tabelle - Spalten verschieben - PHPMyAdmin Datenbanken 6 12.07.2005 17:00
Layer auf x-Achse verschieben php1 HTML, Usability und Barrierefreiheit 2 24.06.2005 16:08
nach oben && nach unten verschieben realisieren PHP-Fortgeschrittene 8 26.01.2005 22:22
Datei verschieben Calli PHP Tipps 2004-2 2 15.12.2004 14:27
NESTED SETS dieses Thema sollte abgehakt werden PHP Tipps 2004 0 12.10.2004 18:18

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
nested sets verschieben, nested set verschieben, nested set move, nested sets move, nested set move subtree, nested set knoten verschieben, nested sets move subtree, nested set move node, nested sets teilbäume verschieben, nested sets knoten verschieben, nested set move tree, php nested set verschieben, nested set teilbaum verschieben, nested set class, nested set teilbäume verschieben, moving nodes nested sets, nestedset, nested sets php class, verschieben nested set, php nested set move node

Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.