L’integrità referenziale

Correlazione di tabelle

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

quantita
100 20 60 25 0

Supponiamo che l’azienda 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 nell’aggiungere alla tabella prodotto due colonne che riportano il nome e l’indirizzo 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é l’avere 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

1

Il secondo approccio (corretto) consiste nell’aggiungere 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

2

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 nell’esempio). 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 dell’inserimento delle clausole FOREIGN KEY e REFERENCES è che verrà impedito l’inserimento di record nella tabella esame i cui valori della chiave esterna non siano già presenti nella tabella paziente. Per esempio, l’inserimento di un esame per “Rossi Mario” viene impedita perché il paziente non è presente nella tabella paziente. Per registrare l’esame 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 l’eliminazione (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 L’ordine in cui compaiono ON DELETE e ON UPDATE è indifferente.

Bocchi Cinzia Ultimo aggiornamento: 15/09/2012

4

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 l’inserimento 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

Sign up to vote on this title
UsefulNot useful