Tutorials
Multiple querys die je nodig hebt na normaliseren
Als je je datamodel genormaliseerd hebt, is de kans groot dat je multiple querys nodig hebt. Hier wordt dat uitgelegd. Graag commentaar op deze tutorial!
Pagina 1
Inleiding
Deze tutorial gaat over multiple querys –die je nodig hebt na het normaliseren- het halen van waardes uit meerdere tabellen om tot 1 mooie rij te komen. Dit is vooral handig in grote systemen, denk aan een webshop, een forum e.d.
In deze tutorial gebruik ik een webshop als voorbeeld. De webshop verkoopt games, die in categorieën zitten: de console (PS2, PSP e.d.) en type (hard- of software).
Ik zou zeggen: we gaan beginnen.
In deze tutorial gebruik ik een webshop als voorbeeld. De webshop verkoopt games, die in categorieën zitten: de console (PS2, PSP e.d.) en type (hard- of software).
Ik zou zeggen: we gaan beginnen.
Pagina 2
Slecht voorbeeld
Hier gaan we direct een slecht voorbeeld geven, wat veel mensen helaas gebruiken. Kijk maar mee:
producten
-id, int 10, unsigned, auto increment, primary key
-naam, varchar 50
-maker, varchar 50
-prijs, decimal 6,2
-vooraad, int 10
-console, varchar 50 / enum ‘PSP’, ‘PS2’
-type, varchar 50 / enum ‘hardware’, ‘software’
Wat gaat er fout?
De ergste fout is om console en type per rij volledig op te slaan. Zonde van je ruimte, maar het meest zonde is dat je een verneukt systeem hebt. Want stel dat de PSP een nieuwe naam krijgt? Tja, je kan een UPDATE query erop loslaten, maar dat stelt niets voor. Stel dat er nog een spel komt, maar voor een andere console, met dezelfde naam? Dubbele data = slecht en dom, en ook zonde. Dus gaan we het in meerdere tabellen opslaan.
producten
-id, int 10, unsigned, auto increment, primary key
-naam, varchar 50
-maker, varchar 50
-prijs, decimal 6,2
-vooraad, int 10
-console, varchar 50 / enum ‘PSP’, ‘PS2’
-type, varchar 50 / enum ‘hardware’, ‘software’
Wat gaat er fout?
De ergste fout is om console en type per rij volledig op te slaan. Zonde van je ruimte, maar het meest zonde is dat je een verneukt systeem hebt. Want stel dat de PSP een nieuwe naam krijgt? Tja, je kan een UPDATE query erop loslaten, maar dat stelt niets voor. Stel dat er nog een spel komt, maar voor een andere console, met dezelfde naam? Dubbele data = slecht en dom, en ook zonde. Dus gaan we het in meerdere tabellen opslaan.
Pagina 3
De nieuwe en goede tabellen
We gaan het hele zootje omgooien. Ze gaan we het doen:
vaderproducten
-id, int 10, unsigned, auto increment, primary key
-naam, varchar 50
-maker_id, int 10, unsigned
makers
-id, int 10, unsigned, auto increment, primary key
-maker, varchar 50
consoles
-id, int 10, unsigned, auto increment, primary key
-console, varchar 50
types
-id, int 10, unsigned, auto increment, primary key
-type, varchar 50
producten
-id, int 10, unsigned, auto increment, primary key
-vader_id, int 10, unsigned
-console_id, int 10, unsigned
-type_id, int 10, unsigned
-prijs, decimal 6,2
-vooraad, int 10, unsigned
Nu kunnen we met trots zeggen dat we een genormaliseerd datamodel hebben.
vaderproducten
-id, int 10, unsigned, auto increment, primary key
-naam, varchar 50
-maker_id, int 10, unsigned
makers
-id, int 10, unsigned, auto increment, primary key
-maker, varchar 50
consoles
-id, int 10, unsigned, auto increment, primary key
-console, varchar 50
types
-id, int 10, unsigned, auto increment, primary key
-type, varchar 50
producten
-id, int 10, unsigned, auto increment, primary key
-vader_id, int 10, unsigned
-console_id, int 10, unsigned
-type_id, int 10, unsigned
-prijs, decimal 6,2
-vooraad, int 10, unsigned
Nu kunnen we met trots zeggen dat we een genormaliseerd datamodel hebben.
Pagina 4
Iets minder slecht voorbeeld
Mensen hebben het datamodel van de vorige pagina, maar gaan iets heel doms doen: meerdere querys gebruiken. Eerst halen ze bijvoorbeeld alle vaderproducten op, in de while die dan komt gaan ze een query gebruiken om de echte producten op te halen. En dan nog 3 querys voor de maker, de console en het type. Dat gaan we dus ook niet doen, reken maar eens mee:
Ik heb 400 gametitels. Alle games zijn voor 3 verschillende consoles gemaakt, dus heb je 1200 verschillende games. Dan voor elke gametitel de maker ophalen, weer 400 querys. Dan per game nog eens de console en het type ophalen: 2 keer 1200 querys per game.
Totaalberekening:
1 voor de gametitels
400 voor de makers
400 voor de games.
1200 voor de consoles.
1200 voor de types
3201 querys!!!
Ik heb 400 gametitels. Alle games zijn voor 3 verschillende consoles gemaakt, dus heb je 1200 verschillende games. Dan voor elke gametitel de maker ophalen, weer 400 querys. Dan per game nog eens de console en het type ophalen: 2 keer 1200 querys per game.
Totaalberekening:
1 voor de gametitels
400 voor de makers
400 voor de games.
1200 voor de consoles.
1200 voor de types
3201 querys!!!
Pagina 5
Het ophalen
Eerst laten we even zien hoe je alle producten uit de database haalt, met alle gegevens:
Keurig lijstje, gesorteerd op naam van de game.
Maar nu: een specifieke game ophalen. Er verandert niet veel aan de query, een beetje maar:
Op de %S natuurlijk even het ID zetten, en klaar is Kees!
SELECT
producten.id,
vaderproducten.naam,
makers.maker,
consoles.console,
types.type,
producten.prijs,
producten.vooraad
FROM
producten,
vaderproducten,
makers,
consoles,
types
WHERE
producten.vader_id = vaderproducten.id
AND
vaderproducten.maker_id = makers.id
AND
producten.console_id = consoles.i
AND
producten.type_id = types.id
ORDER BY
vaderproducten.naam
ASC
Keurig lijstje, gesorteerd op naam van de game.
Maar nu: een specifieke game ophalen. Er verandert niet veel aan de query, een beetje maar:
SELECT
vaderproducten.naam,
makers.maker,
consoles.console,
types.type,
producten.prijs,
producten.vooraad
FROM
producten,
vaderproducten,
makers,
consoles,
types
WHERE
producten.vader_id = vaderproducten.id
AND
vaderproducten.maker_id = makers.id
AND
producten.console_id = consoles.i
AND
producten.type_id = types.id
AND
producten.id = %S
Op de %S natuurlijk even het ID zetten, en klaar is Kees!
Pagina 6
Einde
Tja, toen ik dit zag dacht ik: dit zal ik nooit leren. Maar naarmate je er een poosje mee werkt, is het oersimpel. Hierdoor wordt alles makkelijker en netter.
Ik wens je heel veel succes met je genormaliseerde website!
Voor de mensen die nog wat dieper op dit onderwerp in willen gaan:
SQL Joins [Uitgebreid]
Ik wens je heel veel succes met je genormaliseerde website!
Voor de mensen die nog wat dieper op dit onderwerp in willen gaan:
SQL Joins [Uitgebreid]
Reacties
0