Ik ben bezig met een meertalige productendatabase.
Bepaalde waarden van een product staan vast, bijv. prijs en id. Maar een titel en omschrijving zijn meertalig.
Nu had ik bedacht dat de titel en omschrijving een id krijgen die verwijst naar een translations-tabel; waarin de content staat met meerdere talen.
Even een versimpelde weergave
table producten
table translations
Maar nu de query. Ik wil bijvoorbeeld de producten ophalen, in het Engels.
Nu had ik het volgende verzonnen:
Dat werkt prima:
Ik vind de query alleen niet om aan te zien. Meerdere JOINs met elk een subquery
.
Bovendien is deze namelijk niet echt lekker dynamisch. De query moet uiteindelijk met PHP dynamisch opgezet worden.
Dan kom ik de volgende "problemen" tegen:
Kan iemand mij een duwtje in de juiste richting geven voor een betere query?
Of is deze tabelstructuur in dit geval sowieso niet verstandig?
Bepaalde waarden van een product staan vast, bijv. prijs en id. Maar een titel en omschrijving zijn meertalig.
Nu had ik bedacht dat de titel en omschrijving een id krijgen die verwijst naar een translations-tabel; waarin de content staat met meerdere talen.
Even een versimpelde weergave
table producten
id prijs titel_id omschr_id 1 12.00 1 2 2 86.00 3 4
table translations
id content_id lang content 1 1 nl Nederlandse titel Product 1 2 2 nl Nederlandse omschrijving product 1 3 1 en English title product 1 4 2 en English description product 1 5 3 nl Nederlandse titel Product 2 6 4 nl Nederlandse omschrijving product 2 7 3 en English title product 2 8 4 en English description product 2
Maar nu de query. Ik wil bijvoorbeeld de producten ophalen, in het Engels.
Nu had ik het volgende verzonnen:
SQL:
1
2
3
4
5
6
7
8
9
10
| SELECT a.id AS productid, a.prijs, b.lang, b.titel,c.omschrijving FROM bart__producten a JOIN ( SELECT trans.content_id AS contentid, trans.content AS titel, trans.lang AS lang FROM bart__translations trans ) b ON (a.titel_id = b.contentid AND b.lang = 'en') JOIN ( SELECT trans.content_id AS contentid, trans.content AS omschrijving, trans.lang AS lang FROM bart__translations trans ) c ON (a.omschr_id = c.contentid AND c.lang = 'en') |
Dat werkt prima:
productid prijs lang titel omschrijving 1 12.00 en English title product 1 English description product 1 2 86.00 en English title product 2 English description product 2
Ik vind de query alleen niet om aan te zien. Meerdere JOINs met elk een subquery

Bovendien is deze namelijk niet echt lekker dynamisch. De query moet uiteindelijk met PHP dynamisch opgezet worden.
Dan kom ik de volgende "problemen" tegen:
- Ik moet per veld een JOIN doen. Als ik nog een veld wil toevoegen (bijv. specificaties) moet ik nog een JOIN toevoegen; deze bijvoorbeeld "d" noemen en deze ook in regel 1 van de query selecten (d.specificaties).
- Als ik de taal wil wijzigen; moet ik dat dus ook in iedere JOIN doen.
- Volgens mij creëert MySQL "onder de motorkap" per subquery een temp-table. Qua performance lijkt me deze query dus absoluut niet ideaal; met name als het aantal velden nog uitgebreid word en de query straks 150 producten ophaalt.
Kan iemand mij een duwtje in de juiste richting geven voor een betere query?
Of is deze tabelstructuur in dit geval sowieso niet verstandig?