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.
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.
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.
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!!!
Pagina 5

Het ophalen

Eerst laten we even zien hoe je alle producten uit de database haalt, met alle gegevens:


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]

Reacties

0
Nog geen reacties.