Sei sulla pagina 1di 5

Lintegrit referenziale

Correlazione di tabelle

Consideriamo la seguente tabella, che riporta i prodotti di unazienda: prodotto codice nome
1 2 3 4 5 prodotto1 prodotto2 prodotto3 prodotto4 prodotto5

quantita
100 20 60 25 0

Supponiamo che lazienda disponga di 2 magazzini e che si voglia indicare, per ogni prodotto, in quale magazzino collocato. magazzino codice nome
1 2 magazzino1 magazzino2

indirizzo
indirizzo1 indirizzo2

Gli approcci per risolvere questo problema sono due e solo uno di essi corretto. Il primo approccio (errato) consiste nellaggiungere alla tabella prodotto due colonne che riportano il nome e lindirizzo del magazzino in cui collocato il prodotto. prodotto codice nome
1 2 3 4 5 prodotto1 prodotto2 prodotto3 prodotto4 prodotto5

quantita nomeMag
100 20 60 25 0 magazzino1 magazzino2 magazzino2 magazzino1 magazzino1

indirizzo
indirizzo1 indirizzo2 indirizzo2 indirizzo1 indirizzo1

Questa soluzione da evitare perch determina ridondanza dei dati. Un dato detto ridondante quando viene ripetuto inutilmente pi volte nella base dati. Ogni dato dovrebbe essere memorizzato in un solo posto nel database perch lavere pi copie della stessa informazione determina i seguenti svantaggi: vi un maggior uso di memoria; le modifiche alla stessa informazione devono essere effettuate pi volte, su tutte le copie; si possono verificare fenomeni di inconsistenza dei dati qualora le informazioni ripetute vengano aggiornate separatamente, in tempi diversi; in questo caso, potrebbe infatti accadere che la stessa informazione assuma valori diversi. Una certa ridondanza (controllata) accettabile solo se ha lo scopo di migliorare le prestazioni delle interrogazioni.

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

Il secondo approccio (corretto) consiste nellaggiungere alla tabella prodotto una sola colonna contenente la chiave primaria (il codice) del magazzino in cui si trova il prodotto. prodotto codice nome
1 2 3 4 5 prodotto1 prodotto2 prodotto3 prodotto4 prodotto5

quantita codiceMag
100 20 60 25 0 1 2 2 1 1

Utilizzando il codice del magazzino possibile risalire al record della tabella magazzino che contiene le ulteriori informazioni (nome e indirizzo). Operando con questa modalit si riduce la ridondanza e il rischio di inconsistenza: sono ripetuti solo i codici, che oltretutto non cambiano. Le due tabelle prodotto e magazzino risultano quindi correlate sulla base del codice del magazzino. prodotto codice nome
1 2 3 4 5 prodotto1 prodotto2 prodotto3 prodotto4 prodotto5

quantita codiceMag
100 20 60 25 0 1 2 2 1 1

magazzino codice nome


1 2 magazzino1 magazzino2

indirizzo
indirizzo1 indirizzo2

La colonna codiceMag della tabella prodotto, che contiene il riferimento al record della tabella magazzino, viene detta chiave esterna o straniera (foreign key).

Vincolo di integrit referenziale

Il principio di integrit referenziale afferma che se una tabella T1 correlata ad una tabella T2 mediante una chiave esterna, ogni tupla di T1 deve soddisfare una sola delle seguenti condizioni: deve esistere una tupla nella tabella T2 che abbia come valori della chiave primaria i valori assunti dalla chiave esterna in T1; i valori della chiave esterna sono nulli. Posto T1 e T2 coincidenti rispettivamente con prodotto e magazzino, possiamo verificare che per ogni valore della chiave esterna di prodotto esiste la corrispondente chiave primaria in magazzino.

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

Istruzione CREATE TABLE e clausole REFERENCES e FOREIGN KEY

Per indicare che una colonna chiave esterna si utilizza un vincolo di colonna, secondo la seguente sintassi: REFERENCES nome_tabella (nome_colonna) dove nome_tabella il nome della tabella correlata e nome_colonna la colonna che assume il ruolo di chiave primaria nella tabella correlata. Esempio CREATE TABLE magazzino ( codice smallint PRIMARY KEY AUTO_INCREMENT, nome varchar(30) NOT NULL UNIQUE, indirizzo varchar(50) NOT NULL ) CREATE TABLE prodotto ( codice smallint PRIMARY KEY AUTO_INCREMENT, nome varchar(30) NOT NULL UNIQUE, quantita integer NOT NULL, codiceMag smallint REFERENCES magazzino (codice) ) Si osservi che chiave primaria e chiave esterna devono essere definite sullo stesso dominio (smallint nellesempio). Nel caso in cui la chiave esterna sia costituita da pi colonne, occorre utilizzare un vincolo di tabella, con la seguente sintassi: FOREIGN KEY (nome_colonna,...,nome_colonna) REFERENCES nome_tabella (nome_colonna,...,nome_colonna) Esempio paziente cognome nome
Verdi Rosi Verdi Mario Lucia Stefano

esame numEsame cognPaz


1 2 3 4 Verdi Verdi Rosi Verdi

nomePaz
Mario Stefano Lucia Stefano
3

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

CREATE TABLE paziente ( cognome varchar(30), nome varchar(30), PRIMARY KEY (cognome, nome) ) CREATE TABLE esame ( numEsame smallint PRIMARY KEY AUTO_INCREMENT, cognPaz varchar(30), nomePaz varchar(30), FOREIGN KEY (cognPaz, nomePaz) REFERENCES paziente (cognome, nome) ) La conseguenza dellinserimento delle clausole FOREIGN KEY e REFERENCES che verr impedito linserimento di record nella tabella esame i cui valori della chiave esterna non siano gi presenti nella tabella paziente. Per esempio, linserimento di un esame per Rossi Mario viene impedita perch il paziente non presente nella tabella paziente. Per registrare lesame dovremo prima inserire il paziente.

Le CASCADE RULES

Consideriamo le tabelle paziente ed esame. Se si modifica o si elimina un record di paziente, occorre decidere cosa fare delle tuple correlate presenti in esame. Le possibilit sono tre: impedire la cancellazione/modifica del record della tabella paziente (RESTRICT); cancellare/modificare anche tutte le righe correlate della tabella esame (CASCADE); assegnare alle chiavi esterne delle righe correlate della tabella esame i valori di default previsti (SET DEFAULT); assegnare alle chiavi esterne delle righe correlate della tabella esame il valore NULL (SET NULL). Per ogni chiave esterna di una tabella pertanto possibile specificare una di queste regole per leliminazione (ON DELETE) e per la modifica (ON UPDATE) della correlata chiave primaria. Le regole devono essere aggiunte alla fine della clausola REFERENCES, con la seguente sintassi: ON UPDATE regola ON DELETE regola Lordine in cui compaiono ON DELETE e ON UPDATE indifferente.

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

Esempio CREATE TABLE esame ( numEsame smallint PRIMARY KEY AUTO_INCREMENT, cognPaz varchar(30), nomePaz varchar(30), FOREIGN KEY (cognPaz, nomePaz) REFERENCES paziente (cognome, nome) ON DELETE CASCADE ON UPDATE RESTRICT ) La cancellazione di una tupla di paziente determina la cancellazione delle tuple correlate di esame (se esistono). La modifica di una tupla di paziente non consentita se esistono tuple correlate in esame. Esempio CREATE TABLE prodotto ( codice smallint PRIMARY KEY AUTO_INCREMENT, nome varchar(30) NOT NULL UNIQUE, quantita integer NOT NULL, codiceMag smallint REFERENCES magazzino (codice) ON DELETE SET NULL ON UPDATE CASCADE ) La cancellazione di una tupla di magazzino determina linserimento del valore NULL nella chiave esterna delle tuple correlate di prodotto (se esistono). La modifica di una tupla di magazzino determiona la modifica delle tuple corelate in prodotto.

Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. 5

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

Potrebbero piacerti anche