Ik ben bezig om in een bestaande website (gemaakt met behulp van SQL en PHP ) een 'faceted search' functie te implementeren, echter nu heb ik even een vraag over hoe je een dergelijke functie het beste kan opzetten.
Het is nu zo dat de gebruiker via een hoofdzoekbalk een vrije zoekterm invult een categorie kiest en vervolgens op zoeken drukt (net zoals op marktplaats.nl). Vervolgens wordt er dan een query uitgevoerd op de database waarbij eigenlijk 4 tabellen doorzocht worden en er dus een aantal join statements gebruikt worden.
SELECT
FROM...
LEFT JOIN..
ON
LEFT JOIN....
ON
LEFT JOIN...
ON
WHERE
AND.....
AND.....
AND....
Nu vraag ik mij echter af hoe je het beste kan gaan filteren op basis van de resultaatset die voortkomt uit deze query. Kan je het beste werken met 1 grote query en dat je dus de initiële query verder uitbreidt op basis van de gekozen filterwaarden (en dat je dus zo veel mogelijk doet in SQL), of kan je beter de resultaten van de initiële query gaan filteren in PHP (dat je dus alle gevonden objecten in een array hebt en op basis hiervan gaat filteren)?
Het probleem is daarnaast dat er bij een faceted search functie meestal de hoeveelheden bijgehouden worden van een bepaalde 'facetwaarde''. Dan wordt er dus bijvoorbeeld per subcategorie weergegeven hoeveel producten er in die subcategorie gevonden zijn. Dit betekent dus dat er per subcategorie een COUNT query uitgevoerd moet worden, echter als je dit steeds doet op basis van de initiële query dan moeten er dus in een korte tijd erg veel (afhankelijk van de hoeveelheid sub categorieën) zware query's uitgevoerd worden.
Misschien kunnen deze 'counts' dus beter gedaan worden op basis van de resultaat array (PHP). Echter dien je dan steeds een hele Array door te "loopen" en heb je de gehele objecten nodig ( of in ieder geval de velden van het object waarop gefilterd wordt) en dit vergt weer veel geheugen.
Maar wat is nu de meest efficiënte manier? Of 1 initiële query en op basis van PHP filteren, of 1 grote query en alles afhandelen via SQL? En hoe groot mag een SQL query überhaupt eigenlijk worden, is het mogelijk een query uit te voeren met 20 AND statements en 4 JOINS?
En nog 1 laatste vraag: weet iemand misschien relevante literatuur die nader op dit probleem ingaat?
Het is nu zo dat de gebruiker via een hoofdzoekbalk een vrije zoekterm invult een categorie kiest en vervolgens op zoeken drukt (net zoals op marktplaats.nl). Vervolgens wordt er dan een query uitgevoerd op de database waarbij eigenlijk 4 tabellen doorzocht worden en er dus een aantal join statements gebruikt worden.
SELECT
FROM...
LEFT JOIN..
ON
LEFT JOIN....
ON
LEFT JOIN...
ON
WHERE
AND.....
AND.....
AND....
Nu vraag ik mij echter af hoe je het beste kan gaan filteren op basis van de resultaatset die voortkomt uit deze query. Kan je het beste werken met 1 grote query en dat je dus de initiële query verder uitbreidt op basis van de gekozen filterwaarden (en dat je dus zo veel mogelijk doet in SQL), of kan je beter de resultaten van de initiële query gaan filteren in PHP (dat je dus alle gevonden objecten in een array hebt en op basis hiervan gaat filteren)?
Het probleem is daarnaast dat er bij een faceted search functie meestal de hoeveelheden bijgehouden worden van een bepaalde 'facetwaarde''. Dan wordt er dus bijvoorbeeld per subcategorie weergegeven hoeveel producten er in die subcategorie gevonden zijn. Dit betekent dus dat er per subcategorie een COUNT query uitgevoerd moet worden, echter als je dit steeds doet op basis van de initiële query dan moeten er dus in een korte tijd erg veel (afhankelijk van de hoeveelheid sub categorieën) zware query's uitgevoerd worden.
Misschien kunnen deze 'counts' dus beter gedaan worden op basis van de resultaat array (PHP). Echter dien je dan steeds een hele Array door te "loopen" en heb je de gehele objecten nodig ( of in ieder geval de velden van het object waarop gefilterd wordt) en dit vergt weer veel geheugen.
Maar wat is nu de meest efficiënte manier? Of 1 initiële query en op basis van PHP filteren, of 1 grote query en alles afhandelen via SQL? En hoe groot mag een SQL query überhaupt eigenlijk worden, is het mogelijk een query uit te voeren met 20 AND statements en 4 JOINS?
En nog 1 laatste vraag: weet iemand misschien relevante literatuur die nader op dit probleem ingaat?