mySQL/PHPmyAdmin vraag: koppelen & sleutels

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

S B

S B

05/12/2012 11:05:35
Quote Anchor link
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!
 
PHP hulp

PHP hulp

18/12/2024 12:14:49
 
Zie Foto

Zie Foto

05/12/2012 11:16:25
Quote Anchor link
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...
Gewijzigd op 05/12/2012 11:19:12 door Zie Foto
 
S B

S B

05/12/2012 11:22:15
Quote Anchor link
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
 
Zie Foto

Zie Foto

05/12/2012 11:32:06
Quote Anchor link
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"")
 
S B

S B

05/12/2012 11:54:25
Quote Anchor link
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?
Gewijzigd op 05/12/2012 11:55:50 door S B
 
- Ariën  -
Beheerder

- Ariën -

05/12/2012 11:57:27
Quote Anchor link
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.
Gewijzigd op 05/12/2012 11:57:55 door - Ariën -
 
S B

S B

05/12/2012 12:06:14
Quote Anchor link
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?
 
- Ariën  -
Beheerder

- Ariën -

05/12/2012 12:08:45
Quote Anchor link
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.
 
S B

S B

05/12/2012 12:11:41
Quote Anchor link
is dat nou een ja of een nee op mijn laatste vraag?
 
Kris Peeters

Kris Peeters

05/12/2012 12:35:36
Quote Anchor link
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 ):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
Gewijzigd op 05/12/2012 12:39:45 door Kris Peeters
 
- Ariën  -
Beheerder

- Ariën -

05/12/2012 12:48:52
Quote Anchor link
Maar dat gata alleen om verwijderen natuurlijk ;)
 
Kris Peeters

Kris Peeters

05/12/2012 13:11:47
Quote Anchor link
ON DELETE om te verwijderen, ON UPDATE om aan te passen
 
S B

S B

05/12/2012 15:22:35
Quote Anchor link
oke Kris dank je wel voor je reactie!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/12/2012 16:12:55
Quote Anchor link
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.
 
S B

S B

05/12/2012 16:29:08
Quote Anchor link
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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/12/2012 16:36:01
Quote Anchor link
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.
 
S B

S B

05/12/2012 17:07:00
Quote Anchor link
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!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.