Hoi Tweakers,
Ik heb met een collegaatje wat zitten brainstormen over de implementatie van een binaire boom in een relationele database. Daar zijn voor zover wij weten 2 methodes voor: met parent-child relaties en met left en right values. Op sitepoint staat een mooi artikel met achetrgrondinfo hierover.
De schrijver van het artikel merkt terecht op dat een parent-child relatie in je database werkt, maar dat je tegen het 'probleem' van recursie aanloopt. Als je boomstructuur diep wordt en je wilt alle nodes pakken onder node X, dan moet je, net als bij een filesysteem, alle nodes direct onder X pakken, dan per node kijken of er subnodes zijn, dan weer per subnode kijken of er subsubnodes zijn, etc. Recursie dus. En dat is traag, want je moet telkens een nieuwe query op de DB afvuren om sub(subsubsub)nodes te pakken.
Het alternatief is een oplossing met right en left values voor elk node. Met deze aanpak kun je van node X de left en right value pakken en dan in 1 query alle nodes pakken die een left-waarde groter dan die van X en een right-waarde kleiner dan die van X hebben. Lekker makkelijk
en het performt als een beest vergeleken met de recursieve aanpak, want je hebt maar 1 query nodig.
ECHTER! Wat gebeurt er als je een boom hebt met 2 miljoen nodes, zoals in ons systeem..... Op het moment dat je een node insert of delete, dan moeten alle left en right waardes van nodes te rechterzijde van de toegevoegde (of verwijderde) node ge-update worden en da's niet zo leuk als je dat voor 2 miljoen nodes moet doen DENK IK.
Ik denk daarom dat ik ondanks het recursieprobleem toch tot een parent-child aanpak 'veroordeeld' ben. De boom van ons systeem zal waarschijnlijk niet heel diep worden (4 levels max) dus ik denk dat het het beste is om voor die parent-child optie te gaan.
A penny for your thoughts.
Ik heb met een collegaatje wat zitten brainstormen over de implementatie van een binaire boom in een relationele database. Daar zijn voor zover wij weten 2 methodes voor: met parent-child relaties en met left en right values. Op sitepoint staat een mooi artikel met achetrgrondinfo hierover.
De schrijver van het artikel merkt terecht op dat een parent-child relatie in je database werkt, maar dat je tegen het 'probleem' van recursie aanloopt. Als je boomstructuur diep wordt en je wilt alle nodes pakken onder node X, dan moet je, net als bij een filesysteem, alle nodes direct onder X pakken, dan per node kijken of er subnodes zijn, dan weer per subnode kijken of er subsubnodes zijn, etc. Recursie dus. En dat is traag, want je moet telkens een nieuwe query op de DB afvuren om sub(subsubsub)nodes te pakken.
Het alternatief is een oplossing met right en left values voor elk node. Met deze aanpak kun je van node X de left en right value pakken en dan in 1 query alle nodes pakken die een left-waarde groter dan die van X en een right-waarde kleiner dan die van X hebben. Lekker makkelijk
ECHTER! Wat gebeurt er als je een boom hebt met 2 miljoen nodes, zoals in ons systeem..... Op het moment dat je een node insert of delete, dan moeten alle left en right waardes van nodes te rechterzijde van de toegevoegde (of verwijderde) node ge-update worden en da's niet zo leuk als je dat voor 2 miljoen nodes moet doen DENK IK.
Ik denk daarom dat ik ondanks het recursieprobleem toch tot een parent-child aanpak 'veroordeeld' ben. De boom van ons systeem zal waarschijnlijk niet heel diep worden (4 levels max) dus ik denk dat het het beste is om voor die parent-child optie te gaan.
A penny for your thoughts.