I vincoli di integrità servono per mantenere la consistenza della base di dati. Infatti, non tutte le istanze della base di dati sono lecite. Sono ammissibili solo quelle che soddisfano tutti i vincoli di integrità specificati per la base di dati. Riprendiamo lo schema di base di dati:
teatro(nome, città, email)
dipendente(cf, nome, cognome, dataDiNascita, età)
lavoro(teatro, dipendente, ruolo)
Consideriamo la seguente istanza di base di dati definita sullo schema precedente:
nome | città | |
---|---|---|
CSS | Udine | css@gmail.com |
NULL | Milano | litta@gmail.com |
Eliseo | Roma | NULL |
cf | nome | cognome | dataDiNascita | età |
---|---|---|---|---|
ELSDLL72 | Elisa | D'Allarche | 31/04/1972 | 35 |
FRNDPP76 | Fernanda | D'Ippoliti | 11/03/1976 | 31 |
FRNDPP76 | Marco | Dall'Aglio | 09/01/1970 | 47 |
teatro | dipendente | ruolo |
---|---|---|
CSS | ELSDLL72 | relazioni |
Litta | FRNDPP76 | finanza |
Eliseo | FRNDPP76 | controllo |
Eliseo | MRCDLL70 | direzione |
I dati inconsistenti sono stati evidenziati in rosso nell'istanza che segue:
nome | città | |
---|---|---|
CSS | Udine | css@gmail.com |
NULL | Milano | litta@gmail.com |
Eliseo | Roma | NULL |
cf | nome | cognome | dataDiNascita | età |
---|---|---|---|---|
ELSDLL72 | Elisa | D'Allarche | 31/04/1972 | 35 |
FRNDPP76 | Fernanda | D'Ippoliti | 11/03/1976 | 31 |
FRNDPP76 | Marco | Dall'Aglio | 09/01/1970 | 47 |
teatro | dipendente | ruolo |
---|---|---|
CSS | ELSDLL72 | relazioni |
Litta | FRNDPP76 | finanza |
Eliseo | FRNDPP76 | controllo |
Eliseo | MRCDLL70 | direzione |
Le situazioni inconsistenti sono le seguenti:
Alcuni delle inconsistenze evidenziate corrispondono a vincoli tipici del modello relazionale. Questi sono:
Un vincolo di chiave esterna è specificato associando una sequenza di attributi X1, X2,..., Xn, che formano la chiave esterna di una tabella T, ad una sequenza di attributi Y1, Y2,..., Yn, che formano la chiave (primaria o candidata) di una tabella R. T e R possono essere la stessa tabella. Un tale vincolo si rappresenta in questo modo:
T(X1, X2,..., Xn) --> R(Y1, Y2,..., Yn)
Il vincolo è soddisfatto se per ogni sequenza di valori x1, x2,..., xn, ognuno dei quali è non nullo, per gli attributi X1, X2,..., Xn di T esiste una uguale sequenza di valori y1, y2,..., yn per gli attributi Y1, Y2,..., Yn di R.
Ad esempio, i vincoli di chiave esterna per lo schema di sopra vengono scritti come segue:
lavoro(teatro) --> teatro(nome)
lavoro(dipendente) --> dipendente(cf)
Ulteriori vincoli di integrità possono essere specificate mediante le regole aziendali contenute nello schema concettuale. Ad esempio, il fatto che l'età di una persona sia calcolata come differenza tra la data odierna e la data di nascita (l'inconsistenza numero 4 viola tale vincolo). Un qualsiasi altro vincolo che regoli l'applicazione può essere asserito. Ad esempio, il fatto che un dipendente che si occupa di controllo deve avere almeno 40 anni.
Solitamente, i vincoli del modello relazionale (di dominio, di chiave, di chiave esterna) vengono controllati automaticamente dal DBMS dopo ogni aggiornamento (inserimento, modifica, cancellazione) della base di dati. Gli altri vincoli devono essere implementati dal progettista nel linguaggio di definizione dei dati o, se ciò non è possibile, in un linguaggio di programmazione.
Ad esempio, immaginiamo una applicazione che permette di inserire via Web dati in una base. Quando i dati vengono inseriti dall'utente, l'applicazione verifica i vincoli di integrità che non sono codificabili nel linguaggio di definizione dei dati del DBMS. Se tali vincoli sono soddisfatti, l'informazione viene passata al DBMS per l'inserimento nella base di dati. Prima di inserire i dati, il DBMS verifica i vincoli implementati nel linguaggio di definizione dei dati e i vincoli tipici del modello relazionale. Se anche questi vincoli sono soddisfatti, l'inserimento viene effettuato e la base di dati rimane in uno stato consistente. Altrimenti l'aggiornamento è rifiutato avvisando l'utente delle inconsistenze.