Som altid:Der er ingen bedste løsning. Hver løsning gør forskellige ting nemmere eller sværere. Den rigtige løsning for dig afhænger af, hvilken operation du vil udføre mest.
Naiv tilgang med forældre-id:
Fordele:
-
Nem at implementere
-
Nemt at flytte et stort undertræ til en anden forælder
-
Indsatsen er billig
-
Nødvendige felter, der er direkte tilgængelige i SQL
Ulemper:
-
At hente et helt træ er rekursivt og derfor dyrt
-
Det er også dyrt at finde alle forældre (SQL kender ikke rekursioner...)
Ændret Preorder Tree Traversal (gemmer et start- og slutpunkt):
Fordele:
-
At hente et helt træ er nemt og billigt
-
Det er billigt at finde alle forældre
-
Nødvendige felter, der er direkte tilgængelige i SQL
-
Bonus:du gemmer også rækkefølgen af childnodes inden for dens parentnode
Ulemper:
- Indsættelse/opdatering kan være meget dyrt, da du måske bliver nødt til at opdatere en masse noder
Gemmer en sti i hver node:
Fordele:
-
Det er billigt at finde alle forældre
-
At hente et helt træ er billigt
-
Indsættelse er billigt
Ulemper:
-
Det er dyrt at flytte et helt træ
-
Afhængigt af måden du gemmer stien på, vil du ikke være i stand til at arbejde med den direkte i SQL, så du bliver altid nødt til at hente og analysere den, hvis du vil ændre den.
Tabel for lukning
Fordele:
-
Nem at implementere
-
Det er billigt at finde alle forældre
-
Indsættelse er billigt
-
Det er billigt at hente hele træer
Ulemper:
-
Har brug for et ekstra bord
-
Optager meget plads sammenlignet med andre tilgange
-
Det er dyrt at flytte et undertræ
Jeg foretrækker en af de to sidste, afhængigt af hvor ofte dataene ændres.
Se også:http://media.pragprog.com/titles/bksqla/trees. pdf