Hallo daar,

Ik ben wat aan het stoeien met mySQL via phpmyadmin. Ik heb 1 database, met daarin 3 tabellen:

-klanten: klantid,klantnaam, klantadres
-orders: orderid, ordernaam, orderstatus
-taken: taakid, taaknaam, taakaantal

Hoe kan ik nou in phpmyadmin de relatie tussen die 3 tabellen leggen? Ik snap het concept wel van relationele databases, maar ik kan nergens uitleg vinden hoe ik nou die relatie kan leggen. Immers, een taak is een onderdeel van een order (sterker nog, een order kan meerdere taken bevatten), en een order is een onderdeel van een klant (maar een klant kan ook meerdere orders bevatten). De primary keys heb in respectievelijk gezet op 'klantID' in de tabel klanten, 'orderID' in de tabel orders en 'taakID' in de tabel taken. En nu?

Graag een duidelijke uitleg en geen korte antwoorden met linkjes naar websites over relationele databases en FNF, SNF, TNF, enz.

alvast bedankt!
ON DELETE om te verwijderen, ON UPDATE om aan te passen
oke Kris dank je wel voor je reactie!
Kris Peeters op 05/12/2012 12:35:36

bv. KlantID en OrderID:
Bij het deleten van het record van een user, zullen dan automatisch alle records van klantenorders waar die KlantID voorkomt ook verwijderd worden.

En dat is nu precies wat je niet moet willen.
Kan funest zijn voor je boekhouding.

Met foreign keys kan je de integriteit van de database bewaken, maar je moet altijd heel goed nadenken waar, wanneer en hoe je ze toepast.
Als je ze toepast heb je bij ON DELETE en ON UPDATE drie opties:

NO ACTION (of RESTRICT)
Dit is de standaard optie, en betekent dat als je in tabel A probeert iets te verwijderen, dit een foutmelding oplevert als de waarde van de FK ook in tabel B staat.

CASCADE
De operatie wordt trapsgewijs naar beneden doorgevoerd (op de manier zoals Kris heeft). Soms heel handig, want je kan dan met één query bepaalde records uit alle onderliggende tabellen verwijderen.

SET NULL
Ik gebruik dit alleen bij ON DELETE, in het geval dat in tabel A een record wordt verwijderd, worden in tabel B de corresponderende records op NULL gezet. Moet dus wel toegestaan worden in de DDL

Een FK heeft (behalve dat ie altijd geindext is) geen enkele invloed op een SELECT query, daarin zal je altijd nog via joins de relatie moeten leggen.
Ger,

Duidelijke uitleg, dank daarvoor. Ik heb inderdaad die opties gevonden in phpmyadmin. Is het nu ook noodzakelijk om, als ik een tabel 'orders' heb met daarin oa. een veld 'orderid' (en ervanuitgaande dat 1 order meerdere taken kan bevatten), dit zelfde veld 'orderid' ook moet bestaan in de tabel 'taken'?

gr.
sander
Helemaal correct, het gaat er om dat je referenties moet kunnen maken.
Het kan ook nog zo zijn dat je vaste taken hebt, anders gezegd een order kan meerdere taken hebben, maar zo'n taak kan ook voor meerdere orders gebruikt worden. Dan heb je een meer op meer relatie en daarvoor moet je een koppeltabelletje maken.
Ok dank je. Daar kan ik wat mee. Ik ga weer stoeien met mysql en mocht ik weer wat tegenkomen dan meld ik me wel weer :-)

in ieder geval bedankt voor de uitleg!

Reageren