Zoals altijd:er is geen beste oplossing. Elke oplossing maakt verschillende dingen gemakkelijker of moeilijker. De juiste oplossing voor u hangt af van welke bewerking u het meest zult uitvoeren.
Naïeve benadering met ouder-ID:
Voordelen:
-
Eenvoudig te implementeren
-
Eenvoudig een grote subboom naar een andere ouder verplaatsen
-
Invoegen is goedkoop
-
Benodigde velden direct toegankelijk in SQL
Nadelen:
-
Het ophalen van een hele boom is recursief en daarom duur
-
Het vinden van alle ouders is ook duur (SQL kent geen recursie... )
Gewijzigde Preorder Tree Traversal (opslaan van een start- en eindpunt):
Voordelen:
-
Een hele boom terughalen is gemakkelijk en goedkoop
-
Alle ouders vinden is goedkoop
-
Benodigde velden direct toegankelijk in SQL
-
Bonus:je bewaart ook de volgorde van childnodes binnen zijn parentnode
Nadelen:
- Invoegen / bijwerken kan erg duur zijn, omdat u misschien veel knooppunten moet bijwerken
Een pad opslaan in elk knooppunt:
Voordelen:
-
Alle ouders vinden is goedkoop
-
Een hele boom ophalen is goedkoop
-
Invoegen is goedkoop
Nadelen:
-
Een hele boom verplaatsen is duur
-
Afhankelijk van de manier waarop u het pad opslaat, kunt u er niet rechtstreeks in SQL mee werken, dus u moet het altijd ophalen en ontleden als u het wilt wijzigen.
Sluitingstabel
Voordelen:
-
Eenvoudig te implementeren
-
Alle ouders vinden is goedkoop
-
Invoegen is goedkoop
-
Hele bomen ophalen is goedkoop
Nadelen:
-
Heeft een extra tafel nodig
-
Neemt veel ruimte in beslag in vergelijking met andere benaderingen
-
Een substructuur verplaatsen is duur
Ik heb liever een van de laatste twee, afhankelijk van hoe vaak de gegevens veranderen.
Zie ook:http://media.pragprog.com/titles/bksqla/trees. pdf