[PHP] Boomstructuur

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb al rondgekeken/gezocht hier op het forum, maar ben helaas niks tegengekomen wat bruikbaar was. Het zit namelijk zo.

Ik ben bezig met een website, waar locaties met een boomstructuur worden weergeven. Dat geeft zoiets als dit:

code:
1
2
3
4
5
6
7
8
9
10
Europa
 - Nederland
 - - Drenthe
 - - - Emmen
 - - - - Noorder dierenpark
 - - - Assen
 - - - Coevorden
 - - Friesland
 - - - Joure
 - Duitsland


Dit staat als volgt in de database:
Afbeeldingslocatie: http://img209.imageshack.us/img209/5318/db0hg.jpg

Alle subcategorieën van de categorie zijn gescheiden met een comma (,). Het nummer vertegenwoordigd de categorie (komt dus overeen met een nummer uit de database).

Ik lees alles uit d.m.v. een functie recursief aan te roepen. Opzich geen probleem, maar het begint allemaal wel erg traag te worden nu er meer dan 5000 locaties in de database staan.

Is hier een snellere oplossing voor? En zo ja.. hoe zou ik dat aan moeten pakken?

Alvast bedankt!

Matthias Trip

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Waarom maak je er niet een extra tabel bij waar je de relaties onderling in zet? Zodat je met een join alle directe kinderen hebt?

Acties:
  • 0 Henk 'm!

  • Superdeboer
  • Registratie: December 2002
  • Niet online

Superdeboer

Sa-weee-tah

Het standaard voorbeeld dat in dit verband altijd genoemd wordt is Modified Preorder Tree Traversal. Op die manier heb je geen recursie meer nodig en dat kan een aanmerkelijke snelheidswinst opleveren. Het is echter wel zo dat je je database anders in elkaar zult moeten zetten en als je al een berg bestaande data hebt dan is dat weer niet zo heel erg aantrekkelijk natuurlijk. :)

When I write my code, only God and I know what it means. One week later, only God knows.
Hell yes it's a Cuban Cigar, but I'm not supporting their economy, I'm burning their fields.


Acties:
  • 0 Henk 'm!

  • TweakerNummer
  • Registratie: September 2001
  • Niet online
Je kan een non-php oplossing nastreven. Die zal wat sneller zijn. Over het algemeen worden dit soort dingen gedaan met Treeview: http://www.obout.com/t2/download.aspx

Als je PHP sneller wilt maken moet je alleen de hoofddnodes laden, en als een klant een node expand kan je een nieuwe tree genereren (server-side) en deze dan aan de client geven (dus niet de hele boom).
Als je nog mooier wilt moet je client-side javascript gebruiken zodat de client een gedeelte locaal doet, en alleen nodes ophaalt die ge-update zijn server-side (of als de client deze nodes niet heef).

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Het opslaan van kinderen op deze manier is natuurlijk wel vrij ranzig. :|

In plaats daarvan zou ik bij het kind het ID van de parent opnemen. Verder link ik ook altijd naar dat stuk over die hierarchical database wat al gelinkt is.

Rustacean


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb inmiddels een goed werkende oplossing gevonden. Alles word nu binnen 0.4 seconden ingeladen.. een heel verschil dus, als je het gaat vergelijken met de 17 seconden van eerst. :)

Die laadtijd werd veroorzaakt doordat ik bij elke subcategorie een query uitvoerde om informatie op te halen. Dit resulteerde dus 10.000 query's!

De oplossing was alle records in de database in een array stampen, zodat ik alle info uit die array kan halen en dus de database maar 1 keer een query hoeft uit te voeren. :)


Dit is vast geen oplossing waar je 'u' tegen zegt, maar dit voorkomt een hoop werk, aangezien ik anders heel het systeem over de kop had kunnen gooien.

[ Voor 14% gewijzigd door Verwijderd op 18-02-2006 17:05 ]


Acties:
  • 0 Henk 'm!

  • sebastius
  • Registratie: September 2000
  • Laatst online: 20-09 13:58

sebastius

Laten we lekker link gaan doen

Ik moet zeggen dat ik het met Manuzhai eens ben. Zet in elk 'kind' de parent, ipv in elke parent de kinderen. Zo sorteer je al vele malen eenvoudiger. Maar als je query werkt zoals je nu wilt, dan is dat ook prima natuurlijk :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
sebastius schreef op zaterdag 18 februari 2006 @ 20:09:
Ik moet zeggen dat ik het met Manuzhai eens ben. Zet in elk 'kind' de parent, ipv in elke parent de kinderen. Zo sorteer je al vele malen eenvoudiger. Maar als je query werkt zoals je nu wilt, dan is dat ook prima natuurlijk :)
Daar zit inderdaad wat in ja, als ik in de toekomst ooit nog eens zoiets nodig ben zal ik ook zeker die methode toepassen. Ik heb dat in dit geval niet gedaan omdat ik anders geheel het systeem 'over de kop moest gooien'.

In ieder geval iedereen bedankt voor de tips. Geweldig. :) _/-\o_
Pagina: 1