Ik zit met een vraag waar ik niet uitkom, wellicht omdat niet allerlei terminologie mij bekend is. Ik heb nu een collection class die mijn objecten vast kan houden. Middels een uitbreiding op mijn standaard collection class kan ik bijvoorbeeld een article collection maken. Binnen die article collection kan ik middels een query gegevens ophalen van meerdere article's. Als ik een lijst ophaal van 100 article's hoef ik maar één query te draaien. Nu is het zo dat elke article zijn eigen collecties kan hebben (files, gerelateerde categorieën, etc...). Als ik bij elk article die collecties afzonderlijk moet vullen (query), ga ik daar een performance problemen krijgen (laten we stellen dat ik in een view al die gegevens nodig heb). Nu kan ik in mijn article collections met gemak een query maken die de gevens voor die subcollections ook gelijk ophaalt (op het moment dat ik die data nodig heb). Alleen gaan dan bij mij wat belletjes rinkelen. Ik leg dan zaken van bijvoorbeeld gekoppelde bestanden (dus objecttype File) al in mijn Collection Class Article. Dit lijkt mij een veel voorkomend probleem, alleen kan ik niet de informatie vinden over hoe dit het beste/netste op te lossen is. Ik kan natuurlijk wel met losse query's werken en templates cache. Dan hoef ik zolnag er niets veranderd niet elke keer mn query's te draaien. Lazy loading implementeren kan ook de performace ten goede komen. Mijn vraag: hoe moet je zoiets nou netjes oplossen, zodat ik niet met een cummulatief resultaat krijg van ziek veel query's? Mag ik uberhaupt wel een query in mn article collection plaatsen die bijvoorbeeld 50 article's ophaalt?
In je object model is het helemaal niet zo vreemd om redundantie te hebben. Je kunt immer vanaf verschillende plekken naar hetzelfde fileobject wijzen. Verder zou ik de queries niet in je article collections zetten. Daarin horen helemaal geen queries. Je article collection is gewoon je model. Puur de data. De queries implementeer je in de datalayer. Hierin implementeer je uiteindelijk een methode waarin die query staat en die een article collection oplevert. Lazy loading kan. Je kunt bijvoorbeeld in je datalayer ook een methode maken die een gegeven article vult met de bijbehorende informatie. Ook zou je verschillende ophaal methoden gebruiken die elk ietsje anders geïmplementeerd zijn afhankelijk van de gewenste gegevens.
Wat je uiteindelijk nog het beste kunt doen is zoeken naar OR mappers (object relation mappers). Dit zijn frameworks die dit soort dingen automagisch proberen af te handelen. Achter deze searchterm is veel theorie te vinden omtrent lazy loading en het n+1 selects probleem.
Wat je uiteindelijk nog het beste kunt doen is zoeken naar OR mappers (object relation mappers). Dit zijn frameworks die dit soort dingen automagisch proberen af te handelen. Achter deze searchterm is veel theorie te vinden omtrent lazy loading en het n+1 selects probleem.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ik had idd al wat gekeken naar OR mappers, maar voor PHP niet echt iets gevonden waar performance en functionaliteit voor mij voldeden. Ik zou natuurlijk wel kunnen kijken hoe zij met collecties e.d. omgaan.
Het is dus in principe niet gek om met één query data op te halen voor meerdere instancies van een object en voor subcollecties van die objecten? Het is dus zaak om op de juiste plek je query te plaatsen. Ik heb nu een omgeving waar ik het Framework van Zend heb draaien. Daar maak ik ook gebruik van hun databaselayer. Ik zou die class dus kunnen uitbreiden en daar het ophalen van de data in kunnen leggen.
Het is dus in principe niet gek om met één query data op te halen voor meerdere instancies van een object en voor subcollecties van die objecten? Het is dus zaak om op de juiste plek je query te plaatsen. Ik heb nu een omgeving waar ik het Framework van Zend heb draaien. Daar maak ik ook gebruik van hun databaselayer. Ik zou die class dus kunnen uitbreiden en daar het ophalen van de data in kunnen leggen.
Verwijderd
Ooit naar propel gekeken? Redelijk uitgebreide OR Mapper voor PHP. Zoek eens op ActiveRecord en Data Mapper... daar kan je wellicht meer informatie uithalen over dit soort problemen. Zoek ook eens op Eager Loading; de tegenhanger van Lazy Load.