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!
In phpmyadmin werk je niet meer met lijntjes zoals bij Access :)

Je hebt ook te weinig velden.
Hoe weet jij welke klant wat kocht?
Welke taak hoort bij welk order?
Hier is nog werk aan...
Hoi Gerrie,

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
Kan je dan even uitleggen wat de bedoeling is?
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"")
Nou ik wil dus weten hoe ik meerdere orders aan 1 klantID koppel. Dus als ik een form heb waar ik dus een nieuwe order wil aanmaken moet ik eerst selecteren bij welke klant deze order hoort (uiteindelijk dus een report waar ik bijv. alle orders van díe klant wil zien). Ik kan dan wel een tabel klant aanmaken en een tabel orders, maar ik snap dus niet hoe ik de onderlinge relatie leg. Moet ik dan een extra tabel aanmaken per klant bijvoorbeeld?

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?
Nee, databases, tabellen en velden zijn nooit afhandelijk van aantallen. Ze moeten zo gemaakt zijn dat bij grote aantallen dat de structuur niet hoeft te worden aangepast.

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.
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?
Het antwoord is nee. Het kan puur in mySQL.

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 ):

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;


Maar dat gata alleen om verwijderen natuurlijk ;)

Reageren