Toon posts:

[MySQL] Foreign keys... InnoDB?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben momenteel bezig met het opzetten van een MySQL DB. Deze DB komt uit 2 tables te bestaan, waarvan van in de ene tabel naar een veld verwijst naar de primary key van de andere table, een foreign key dus.

De vraag is: hoe implementeer ik dat in MySQL? Moet ik nu met InnoDB gaan werken? Zoja, hoe doe ik dat?

Ik heb online heel wat docs gelezen maar kom er niet echt uit.. komt waarschijnlijk door mijn zeer beperkte kenis van DB's (en al helemaal van MySQL)...

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Wil je perse referentiele integriteit (dat de database bewaakt of er altijd een overeenkomend record aanwezig is) of zoek je een manier om die twee tabellen te verbinden dmv een query?

Het eerste ondersteunt MySQL niet voorzover ik weet (maar misschien in InnoDB wel?). Het tweede komt neer op een vrij normale join-query.

  • Femme
  • Registratie: Juni 1999
  • Laatst online: 14:06

Femme

Hardwareconnaisseur

Official Jony Ive fan

Zorg er in ieder geval voor dat je laatste versie van MySQL Max draait. Uitleg over FK's vind je in de InnoDB manual op www.innodb.com .

Verwijderd

Topicstarter
Het moet zo zijn, dat bijv een persoon verwijderd wordt, dat alle gegevens die bij die persoon horen ook verwijderd worden...

Verwijderd

Verwijderd schreef op 09 oktober 2002 @ 13:22:
Het moet zo zijn, dat bijv een persoon verwijderd wordt, dat alle gegevens die bij die persoon horen ook verwijderd worden...
dan ben je idd op zoek naar foreign key constraints met ON DELETE CASCADE. Zie Femme's post voor alle info die je zoekt ;)

Verwijderd

Topicstarter
Ik ben nu met InnoDB bezig maar krijg het niet aan de gang, ik verwacht een probleem in my.ini (Win32 versie van MySQL MAX). Iemand die een kant en klare versie van my.ini voor me heeft die werkt? Wellicht zie ik dan wat ik verkeerd doe!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Verwijderd schreef op 09 oktober 2002 @ 13:41:
[...]


dan ben je idd op zoek naar foreign key constraints met ON DELETE CASCADE. Zie Femme's post voor alle info die je zoekt ;)


Ik vind die dingen altijd scary. Zorg liever zelf dat in je code direct alle overige records uit andere tabellen ook geschoond worden. Zo blijft alle 'actie' centraal, ipv dat er allerlei reacties plaats vinden in de DB.

Dat is ook de voornaamste reden dat MySQL het niet (tot dusverre) ondersteunt: Ze zeggen zelf ook dat het iets is dat ook makkelijk code-wise is op te lossen. En het houdt de DB een stuk sneller (een van de voordelen van MySQL).

Maar goed.. al is de mogelijkheid van FK's aanwezig dan ben je nog niet verplicht deze te gebruiken.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Bosmonster schreef op 09 oktober 2002 @ 15:04:
Dat is ook de voornaamste reden dat MySQL het niet (tot dusverre) ondersteunt: Ze zeggen zelf ook dat het iets is dat ook makkelijk code-wise is op te lossen. En het houdt de DB een stuk sneller (een van de voordelen van MySQL).
Maar ze bieden (boden) je geen transacties aan zodat je zeker weet dat ook
daadwerkelijk alles van die persoon verwijderd is uit de database.
Ik vind het een vrij logische redenering, je geeft in de database zelf relaties aan. En zodra je de boom van onderen doorzaagt valt de rest ook om.
Tuurlijk kan je dit via applicaties ook oplossen. Maar stel je voor dat je ad-hoc opeens een gebruiker moet weggooien met bepaalde eigenschappen. Dan hoef je alleen de gebruiker uit de betreffende tabel te gooien via een rechtstreekse query in de database manager en hoef je je niet te bekommeren om wat er nog meer moet gebeuren.

Verwijderd

Orphix schreef op 09 oktober 2002 @ 15:14:
[...]

Maar ze bieden (boden) je geen transacties aan zodat je zeker weet dat ook
daadwerkelijk alles van die persoon verwijderd is uit de database.
Ik vind het een vrij logische redenering, je geeft in de database zelf relaties aan. En zodra je de boom van onderen doorzaagt valt de rest ook om.
Tuurlijk kan je dit via applicaties ook oplossen. Maar stel je voor dat je ad-hoc opeens een gebruiker moet weggooien met bepaalde eigenschappen. Dan hoef je alleen de gebruiker uit de betreffende tabel te gooien via een rechtstreekse query in de database manager en hoef je je niet te bekommeren om wat er nog meer moet gebeuren.
dat is ook een van de redenen dat ik vaak wel FK's met foreign keys gebruik. Niet alleen zorgt dit voor minder fouten, maar het is ook makkelijker programmeren. Je verwijdert 1 rij, en wat daarbij hoort gaat ook pleite. Je kan wel in je php code zelf alles doen, maar handig vind ik dat niet. Bij een model met hooguit een paar tabellen, ok, maar met veel tabellen vind ik bovengenoemde constructie zeer handig.

En zoals al gezegd, je hoeft het niet te gebruiken, maar het heeft imo meer voordelen dan nadelen.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Het grote voordeel van FK is niet dat het je werk bespaart tijdens verwijderen, maar dat je geen records kunt verwijderen waar nog andere records naar verwijzen en dat er geen records toegevoegd kunnen worden die nergens naar verwijzen.
In de praktijk zitten er eigenlijk altijd bugs in een applicatie die er voor zorgen dat je referentiele integriteit om zeep geholpen wordt als er geen FK aanwezig zijn.
En cascaded deletes zijn inderdaad leuk, maar heel vaak zet ik ze bewust niet aan, omdat ik bijvoorbeeld niet wil dat bijvoorbeeld een klant inclusief alle orders verwijderd worden als de gebruiker per ongeluk(?) op verwijderen klikt.

Met een RDBMS waar ik geen FK's kan gebruiken, wil ik niet eens werken.

Never underestimate the power of

Pagina: 1