Nu ik voor de zoveelste keer een dergelijk topic voorbij zag komen, heb ik nog eens over dit probleem na zitten denken. Het doel van deze methode is dat je met één simpele query een item en alle onderliggende items wilt ophalen.
Toen kwam ik met een leuke oplossing, maar misschien willen jullie nog nadenken over de puntjes op de ı. Weliswaar met 2 queries, maar het werkt wel een stuk makkelijker.
Je hebt 2 tabellen: Items en Children. In de Children-tabel worden items met onderliggende items gelinkt. Bijvoorbeeld Item 1 heeft twee onderliggende items (Items 2 en 3), dan is de inhoud van tabel Children:
ItemID ChildID
1 2
1 3
Om nu item 1 en alle onderliggende items op te halen, heb je 2 queries nodig:
- Eentje om Item 1 op te halen
SELECT * FROM Items WHERE ItemID = 1
- Eentje om alle onderliggende Children op te halen
SELECT Items.* FROM Children INNER JOIN Items ON Children.ChildID = Items.ItemID WHERE Children.ItemID = 1
Maar nu: als je een item toevoegt aan de Items tabel moet je er ook voor zorgen dat de Children tabel correct wordt bijgewerkt. Als we bijvoorbeeld onder item 3 een nieuw item hangen, wordt dat een onderliggend Child voor item 3 èn 1. Stel; dit nieuwe item is Item 4, deze heeft als directe parent Item 3. We moeten nu 2 invoegqueries doen:
- Eentje om Item 4 als Child aan te melden bij alle Items die Item 3 als Child hebben
INSERT INTO Children (ItemID, ChildID) SELECT ItemID, 4 FROM Children WHERE ChildID = 3
- Eentje om Item 4 als Child van Item 3 aan te melden
INSERT INTO Children (ItemID, ChildID) VALUES (3, 4)
Op deze manier heb je voor het invoegen en ophalen steeds maar 2 queries nodig. De performance van deze methode zal daarom een stuk beter zijn dan met een recursieve functie.
[
Voor 4% gewijzigd door
bigtree op 27-02-2003 10:31
]
Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.