|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jul 2006
Messaggi: 242
|
[MySQL] Foreign Key quali vantaggi porta?
Ciao.
Sto imparando da poco ad usare il database mysql. Vorrei sapere quali sono i vantaggi/svantaggi nel creare le foreign keys in una tabella, poiché non mi è chiaro il loro utilizzo. esempio: TABELLA CITTA ID_CITTA NOME ID_NAZ FOREIGN KEY (ID_NAZ) REFERENCES NAZIONE (ID_NAZIONE) TABELLA NAZIONE ID_NAZIONE NOME L'esempio è calzante (sintassi a parte)? Quali vantaggi/svantaggi ho? Le ricerche con INNER JOIN non sono indipendenti dalla presenza delle F. Keys? Grazie e ciao. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Non ci sono vantaggi prestazionali.
E' parte dei vincoli di disegno. Se imponi quella FK tra citta' e nazione sarai SICURO sempre che ogni citta' apparterra' ad una nazione, e potrai permetterti di scrivere le query di conseguenza. P.Es. potrai usare una INNER JOIN. Altrimenti potresti essere costretto ad usare una OUTER JOIN, proprio perche' non saresti sicuro di trovare sempre una nazione a capo di una citta'. I vincoli e' bene che siano gestiti a livello di database. Poi sara' cura delle tue GUI, dei tuoi programmi o di quanto'altro fare in modo che non vengano violati. Ma se qualora mai venissero violati (errore di programmazione), il database rifiuterebbe le istruzioni che non li rispettano mantenendo il dati in uno stato di consistenza, che altrimenti verrebbe violata e neppure te ne accorgeresti. Ci sono altri vincoli, non solo le FK. Tra i principali ci sono anche i "NOT NULL" e gli "UNIQUE"
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jul 2006
Messaggi: 242
|
Ciao.
Si tratta quindi di una semplice istruzione che garantisce la relazione ad ogni città con un ed un solo record della tabella delle nazioni ed automaticamente ID_NAZ è NOT NULL. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
non e' automaticamente NOT NULL, meglio forzarglielo se ti serve.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quoto tutto quanto detto da gugoXX, in più ti consiglio anche di mettere un indice sulle FK. Non so con mysql (in particolare con innoDB, immagino tu stia utilizzando quel meccanismo e non MyISAM che credo manco le supporti le FK...lol!), ma in oracle gli indici sulle fk servono per evitare il table lock e usare invece il row lock...se mi ricordo bene...
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
![]() |
![]() |
![]() |
#6 | ||
Member
Iscritto dal: Jul 2006
Messaggi: 242
|
Quote:
Quote:
![]() PS: se inserissi un valore ID_NAZ non esistente in ID_NAZIONE il db mi darebbe errore, corretto? Grazie comunque, davvero rapidi ed utili. |
||
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
No, quella è la PK della tabella NAZIONI e l'indice unique dovrebbe venir da sè (spero! comunque ci vuole.)
Io dico l'indice su ID_NAZ nella tabella CITTA. Quote:
Quote:
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
||
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jan 2002
Città: Napoli
Messaggi: 1727
|
Quote:
Una colonna FK potrebbe essere tranquillamente NULL, quind iil tuo discorso sulle JOIN cade. Cmq i grossi vantaggi delle FK sono le ON UPDATE, ON DELETE.
__________________
Se buttassimo in un cestino tutto ciò che in Italia non funziona cosa rimarrebbe? Il cestino. Ultima modifica di dupa : 14-04-2008 alle 12:53. |
|
![]() |
![]() |
![]() |
#9 | |||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Quote:
E' chiaro, comunque, che con un valore NULL la JOIN non potrà eseguire il "match".
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:02.