Allereerst fijne dagen allemaal 
Ik maak een veilingsite en heb o.a. de volgende (gedeeltelijke) tabel:
De pagina browse.php haalt de categorien uit de database die de bezoeker wil zien. Bijvoorbeeld browse.php?id=2 haalt alle categorien op die onder electronica vallen en stuurt dus naar de browser:
Op dezelfde wijze retourneert browse.php?id=6:
Ik wil nu graag aan de bezoeker tonen waar hij in de site zit. Hiertoe wil ik een cookie crumb trail maken. In het laatste geval zou deze er als volgt uitzien:
Ofwel in de browser:
Om deze trail te kunnen maken, heb ik een recursieve functie nodig, welke vanaf het gevraagde id (6 voor Desktops) in de boom omhoog loopt tot ie bij Top uitgekomen is.
Zoals ik het zie, heb ik voor bovenstaande trail (browse.php?id=6) 4 queries nodig:
Dit vind ik veel te veel. Ik wil de site vooral snel houden, en nu spring ik van 1 naar in totaal 5 queries op browse.php. Bovendien wil ik later nog een statistiekentooltje bouwen (1 query), een "nieuwe producten" box op elke pagina (1 query) en nog een en ander. Zo zit ik al snel op 8, 9 queries per pagina.
Toen ben ik over dit probleem gaan nadenken, en de enige mogelijkheid die ik zie om die trail met maar 1 query te schrijven is om hem hardcoded in de database in te voeren. Ik zou dan bijvoorbeeld krijgen:
Ik dacht, omdat er toch niet dagelijks categorien bij komen (niet eens wekelijks), en ik toch zelf de administratie verzorg, kan ik net zo goed wat tijd nemen om zo'n trail zelf ff uit te tikken. Op die manier haal ik in 1 query alle op.
Nadeel is wel dat wanneer de site WEL vaker geupdate zal moeten worden (en dat moet de toekomst uitwijzen) dat ik dat een hoop extra werk heb.
Mijn vragen zijn:
1) zijn jullie ook tegen soortgelijke performance problemen (te veel queries naar jouw zin) aangelopen en hoe heb je dit opgelost?
2) wat vind je van mijn oplossing? Welke voor/nadelen zie je?
3) heb je wellicht een andere oplossing waarmee ik met minder queries die trail kan maken?
Ik maak een veilingsite en heb o.a. de volgende (gedeeltelijke) tabel:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| ----+-----------+------------------- id | parent_id | name ----+-----------+------------------- 0 | | Top ----+-----------+------------------- 2 | 0 | Electronica ----+-----------+------------------- 3 | 2 | Computers ----+-----------+------------------- 21 | 2 | Mobiele Telefoons ----+-----------+------------------- 6 | 3 | Desktops ----+-----------+------------------- 7 | 3 | Laptops ----+-----------+------------------- 33 | 6 | Dell ----+-----------+------------------- |
De pagina browse.php haalt de categorien uit de database die de bezoeker wil zien. Bijvoorbeeld browse.php?id=2 haalt alle categorien op die onder electronica vallen en stuurt dus naar de browser:
HTML:
1
2
| <li><a href="bowse.php?id=3">Computers</a> <li><a href="bowse.php?id=21">Mobiele Telefoons</a> |
Op dezelfde wijze retourneert browse.php?id=6:
HTML:
1
| <li><a href="browse.php?id=33">Dell</a> |
Ik wil nu graag aan de bezoeker tonen waar hij in de site zit. Hiertoe wil ik een cookie crumb trail maken. In het laatste geval zou deze er als volgt uitzien:
HTML:
1
2
| <a href="browse.php?id=0">Top</a> > <a href="browse.php?id=2">Electronica</a> > <a href="browse.php?id=3">Computers</a> > Desktops |
Ofwel in de browser:
HTML:
1
| Top > Electronica > Computers > Desktops |
Om deze trail te kunnen maken, heb ik een recursieve functie nodig, welke vanaf het gevraagde id (6 voor Desktops) in de boom omhoog loopt tot ie bij Top uitgekomen is.
Zoals ik het zie, heb ik voor bovenstaande trail (browse.php?id=6) 4 queries nodig:
PHP:
1
2
3
4
5
6
7
8
9
10
| $id = $_GET[id]; /* $id is in dit voorbeeld 6 */ SELECT parent_id, name FROM categories WHERE id = 6 /* retourneert 3 en Desktops. 3 Moet dan weer ingevuld worden in een nieuwe query */ SELECT parent_id, name FROM categories WHERE id = 3 /* 2, Computers */ SELECT parent_id, name FROM categories WHERE id = 2 /* 0, Electronica */ SELECT parent_id, name FROM categories WHERE id = 0 /* Top */ |
Dit vind ik veel te veel. Ik wil de site vooral snel houden, en nu spring ik van 1 naar in totaal 5 queries op browse.php. Bovendien wil ik later nog een statistiekentooltje bouwen (1 query), een "nieuwe producten" box op elke pagina (1 query) en nog een en ander. Zo zit ik al snel op 8, 9 queries per pagina.
Toen ben ik over dit probleem gaan nadenken, en de enige mogelijkheid die ik zie om die trail met maar 1 query te schrijven is om hem hardcoded in de database in te voeren. Ik zou dan bijvoorbeeld krijgen:
HTML:
1
2
3
4
5
6
7
8
| ----+-----------+-----------+--------------------------------------------- id | parent_id | name | trail ----+-----------+-----------+--------------------------------------------- 6 | 3 | Desktops | <a href="browse.php?id=0">Top</a> > | | | <a href="browse.php?id=2">Electronica</a> > | | | <a href="browse.php?id=3">Computers</a> > | | | Desktops ----+-----------+-----------+--------------------------------------------- |
Ik dacht, omdat er toch niet dagelijks categorien bij komen (niet eens wekelijks), en ik toch zelf de administratie verzorg, kan ik net zo goed wat tijd nemen om zo'n trail zelf ff uit te tikken. Op die manier haal ik in 1 query alle op.
Nadeel is wel dat wanneer de site WEL vaker geupdate zal moeten worden (en dat moet de toekomst uitwijzen) dat ik dat een hoop extra werk heb.
Mijn vragen zijn:
1) zijn jullie ook tegen soortgelijke performance problemen (te veel queries naar jouw zin) aangelopen en hoe heb je dit opgelost?
2) wat vind je van mijn oplossing? Welke voor/nadelen zie je?
3) heb je wellicht een andere oplossing waarmee ik met minder queries die trail kan maken?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."