mySQL/PHPmyAdmin vraag: koppelen & sleutels
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!
Je hebt ook te weinig velden.
Hoe weet jij welke klant wat kocht?
Welke taak hoort bij welk order?
Hier is nog werk aan...
Gewijzigd op 05/12/2012 11:19:12 door Zie Foto
Dat klopt. De tabellen hebben uiteraard ook veel meer velden, alleen om het simpel te houden in mijn vraagstuk heb ik het even zo gedaan, vandaar....
gr.
sander
Want met "En nu?", zijn we niet veel.
* Orders van een klant weergeven?
mysql_query("SELECT orderID from tbl_orders WHERE klantID = "1"")
* Taken van een order tonen?
mysql_query("SELECT taakID from tbl_taken WHERE orderID = "1"")
In de sql-query's die jij net typt ga je er al vanuit dat die tabellen er zijn, maar hoe weet mysql nou dat een bepaald ordernummer bij een bepaald klantID hoort?
Gewijzigd op 05/12/2012 11:55:50 door S B
Dit principe heet Databasenormalisatie. Verdiep er maar eens in.
Het beste is om een tabel aan te maken waarin je per record een koppeling legt tussen KlantID en OrderID. Met JOINS in je applicatie kan je de juiste data met elkaar verbinden.
Gewijzigd op 05/12/2012 11:57:55 door - Ariën -
Ok. Dus het verbinden/de relatie leggen gebeurd dus niet in MySQL maar in PHP. Dus als ik de databasestructuur opzet en alle tabellen en velden aanmaak dan is de basis dus goed. Ik hoef dus niet meer te doen in de database zelf dan een primary key instellen op bijv. orderid ? De rest regel ik dus in PHP?
Je kan ook kijken naar CASCADE in MySQL, daarmee kan je records voor zover ik weet op de datalaag gekoppeld verwijderen bij een DELETE, maar daar heb ik nog nooit naar gekeken.
is dat nou een ja of een nee op mijn laatste vraag?
Als je je Engine op "InnoDB" zet , kan je relaties leggen.
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.
Ook bij het aanpassen.
Stel, je gebruikt als id van een user een string (ja ja, dat mag; een id hoeft niet numeriek te zijn). bv. Jan Kees => id = jan_kees
In je orders heb je dan een veld waar jan_kees staat in een aantal records.
Wel, wanneer je die id aanpast, zullen ook alle velden in de orders aangepast worden naar die nieuwe waarde
----
Voorbeeld ( http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html ):
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
CREATE TABLE parent (id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;
Gewijzigd op 05/12/2012 12:39:45 door Kris Peeters
Maar dat gata alleen om verwijderen natuurlijk ;)
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.
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.
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
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.
in ieder geval bedankt voor de uitleg!