Voor een database gebruik ik een centrale plaats voor het opslaan van de boom-structuur van alle objecten. Hierheen staan dus de verhoudingen tussen de objecten in de database opgeslagen. Hiervoor gebruik ik momenteel het "modified preorder tree traversal algorithm", omdat het belangrijk is dat ik een hele subtree met één query uit de database kan halen.
Het ophalen van gegevens werkt inderdaad vrij snel en direct ... daar in principe geen problemen.
Waar ik nu alleen tegenaan loop, is dat bij het toevoegen, verplaatsen of verwijderen van nodes uit de tree de operaties té veel tijd gaan innemen. En dan praat ik niet eens over belachelijk grote hoeveelheden van rijen ... momenteel heb ik een database draaien met een paar duizend (zeg 15.000).
Voor de duidelijkheid hier een versimpelde weergave van de tabel waar het om gaat:
Bij het toevoegen van een node komt het neer op:
Die twee queries duren naar mijn zin veel te lang. Bij het verplaatsen van een een nodes tegelijk krijg je dus al snel een stuk of 10 van dit soort queries ... als ze allemaal al 1 seconde duren, zit je al op 10 seconde. Dat vind ik erg lang voor een dergelijke operatie.
Is er een handiger manier om dit aan te pakken, of wellicht een heel andere boom-structuur waarmee je dit probleem ontwijkt?
Het ophalen van gegevens werkt inderdaad vrij snel en direct ... daar in principe geen problemen.
Waar ik nu alleen tegenaan loop, is dat bij het toevoegen, verplaatsen of verwijderen van nodes uit de tree de operaties té veel tijd gaan innemen. En dan praat ik niet eens over belachelijk grote hoeveelheden van rijen ... momenteel heb ik een database draaien met een paar duizend (zeg 15.000).
Voor de duidelijkheid hier een versimpelde weergave van de tabel waar het om gaat:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
| CREATE TABLE `cms_objects` ( `objectID` int(11) NOT NULL auto_increment, `caption` varchar(255) NOT NULL default '', `parentID` int(11) NOT NULL default '0', `lft` int(11) NOT NULL default '0', `rgt` int(11) NOT NULL default '0', `depth` int(11) NOT NULL default '0', PRIMARY KEY (`cms_objectID`), KEY `lft` (`lft``), KEY `lft_2` (`lft`,`rgt`), KEY `parentID` (`parentID`), KEY `depth` (`depth`) ) |
Bij het toevoegen van een node komt het neer op:
MySQL:
1
2
| lft = lft + 2 WHERE lft > <plaats van invoegen> rgt = rgt + 2 WHERE rgt > <plaats van invoegen> |
Die twee queries duren naar mijn zin veel te lang. Bij het verplaatsen van een een nodes tegelijk krijg je dus al snel een stuk of 10 van dit soort queries ... als ze allemaal al 1 seconde duren, zit je al op 10 seconde. Dat vind ik erg lang voor een dergelijke operatie.
Is er een handiger manier om dit aan te pakken, of wellicht een heel andere boom-structuur waarmee je dit probleem ontwijkt?