koppeltabel en index
Ik ben bezig in phpmyadmin om de tabellen in mijn db te plaatsen. Ik wil straks fk-relaties kunnen leggen tussen tabellen. Volgens dit blog:
http://www.mytechmusings.com/2008/04/using-foreign-keys-in-mysql.html
moet ik indexen aanwijzen. In de koppeltabel (parent) kan ik de beide primary keys aanwijzen als index. Maar als ik in de "child-tabel" de primary key aanwijs als index, krijg ik de melding:
The following indexes appear to be equal and one of them should be removed: PRIMARY, vakgebied_ID
Hoe komt dit? Geldt de primary key als index? Zo ja, moet het dan eigenlijk wel in die koppeltabel?
Dank bij voorbaat voor begrijpelijke uitleg!
parent
------
id
naam
child
-----
id
parent_id
De kolommen parent.id en child.parent_id hebben dezelfde waarde. Op de kolom child.parent_id moet je echter geen PK aanbrengen omdat je anders het hele idee van de 1-op-veel of veel-op-veel relatie overboord gooid. Een PK kan namelijk maar 1x in een tabel voorkomen waardoor je per definitie een 1-op-1 relatie zou overhouden.
Nee, breng gewoon een normale INDEX aan op de kolom child.parent_id waarna je een FK constraint kunt aanbrengen tussen de twee betreffende kolommen.
Overigens, als je in MySQL aan de gang gaat, zorg dan wel dat je de InnoDB engine gebruikt. Dat is namelijk de enige die het gebruik van FK's ondersteund...
Je uitleg is erg duidelijk....maar hoe pas ik dit nu toe op een koppeltabel?
tbl_werknemers
-----------
id
naam
tbl_taken
-----------
id
taak
tbl_koppel
-----------
werknemers_id
taken_id
Ik wilde die koppeltabel inzetten om te maken dat een werknemer meerdere taken kan hebben.
Ik dacht dat de id's in de beide parent een primary key mogen hebben. Maar wat doe ik met de overeenkomstige velden in de koppeltabel. Ik dacht dat die beide (dus werknemers_id en taken_id) als primary key moesten.
InnoDB heb ik inderdaad aanstaan.
Het enige nadeel van deze oplossing vind ik dat je altijd beide id's nodig hebt om een record aan te kunnen wijzen. Je zou ook voor de volgende oplossing kunnen kiezen:
tbl_koppel
---------
id
werknemers_id
taken_id
Met een PK op id en een UNIQUE constraint op de combinatie (werknemers_id, taken_id).