Ik heb een "probleem" met mijn datamodel in MySQL en de applicatie in PHP...
Het probleem is dat de performance beter kan dan nu.
Nu haal ik dmv group_concat alle procuten en hun eigenschappen op, waarna ik de eigenschappen in PHP explode.
Dit lijkt me behalve ingewikkelder dan nodig, ook langzamer dan optimaal. Ik krijg het echter niet beter dan dit; wanneer ik het namelijk in zoveel mogelijk SQL probeer wordt het enkel langzamer.
Dit is mijn datamodel:

Het lijkt me perfect als ik een aantal producten gewoon volledig op kan halen, zonder dat het gelijk 0,5 sec duurt of een vieze oplossing is.
Een product uit categorie 1 heeft andere eigenschappen dan categorie 2. Dit is een voordeel voor het onderhouden maar een nadeel voor de performance, tot nu toe dan.
Wanneer ik het zo probeer duurt het extreem lang om bv alle nokia's op te halen:
Het probleem is dat de performance beter kan dan nu.
Nu haal ik dmv group_concat alle procuten en hun eigenschappen op, waarna ik de eigenschappen in PHP explode.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| SELECT p.id, p.category, p.title, p.description as p_description, p.actief, GROUP_CONCAT( CONCAT( o.varname, '~', po.value, o.postfix ) ORDER BY o.description SEPARATOR '|' ) options FROM products$postfix p INNER JOIN product_options po ON po.productid = p.id INNER JOIN options o ON o.id = po.optionid WHERE p.category = '$category' AND p.actief = 1 GROUP BY p.id ORDER BY p.title |
Dit lijkt me behalve ingewikkelder dan nodig, ook langzamer dan optimaal. Ik krijg het echter niet beter dan dit; wanneer ik het namelijk in zoveel mogelijk SQL probeer wordt het enkel langzamer.
Dit is mijn datamodel:

Het lijkt me perfect als ik een aantal producten gewoon volledig op kan halen, zonder dat het gelijk 0,5 sec duurt of een vieze oplossing is.
Een product uit categorie 1 heeft andere eigenschappen dan categorie 2. Dit is een voordeel voor het onderhouden maar een nadeel voor de performance, tot nu toe dan.
Wanneer ik het zo probeer duurt het extreem lang om bv alle nokia's op te halen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| SELECT p.id, p.category, p.title, p.description, p.actief,prodopts.* FROM products p INNER JOIN ( SELECT productid FROM product_options po INNER JOIN `options` o ON o.id = po.optionid WHERE (po.value = 'Nokia' AND o.varname = '_merk') GROUP BY po.productid HAVING COUNT(*) = 1 ) AS s1 ON s1.productid = p.id INNER JOIN ( SELECT * FROM product_options po INNER JOIN `options` o ON o.id = po.optionid GROUP BY po.productid,po.optionid ) AS prodopts ON prodopts.productid = p.id WHERE p.category = 1 ORDER BY p.title |
[ Voor 20% gewijzigd door Verwijderd op 13-04-2010 12:05 ]