Avanti Indietro Indice

Vincoli di integrità

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:

teatro
nomecittàemail
CSSUdinecss@gmail.com
NULLMilanolitta@gmail.com
EliseoRomaNULL


dipendente
cfnomecognomedataDiNascitaetà
ELSDLL72ElisaD'Allarche31/04/197235
FRNDPP76FernandaD'Ippoliti11/03/197631
FRNDPP76MarcoDall'Aglio09/01/197047


lavoro
teatrodipendenteruolo
CSSELSDLL72relazioni
LittaFRNDPP76finanza
EliseoFRNDPP76controllo
EliseoMRCDLL70direzione

I dati inconsistenti sono stati evidenziati in rosso nell'istanza che segue:

teatro
nomecittàemail
CSSUdinecss@gmail.com
NULLMilanolitta@gmail.com
EliseoRomaNULL


dipendente
cfnomecognomedataDiNascitaetà
ELSDLL72ElisaD'Allarche31/04/197235
FRNDPP76FernandaD'Ippoliti11/03/197631
FRNDPP76MarcoDall'Aglio09/01/197047


lavoro
teatrodipendenteruolo
CSSELSDLL72relazioni
LittaFRNDPP76finanza
EliseoFRNDPP76controllo
EliseoMRCDLL70direzione

Le situazioni inconsistenti sono le seguenti:

  1. la seconda riga della tabella teatro ha una chiave primaria (nome) con valore nullo. Ciò non è possibile perchè la chiave primaria è costituita da attributi obbligatori;
  2. la prima riga della tabella dipendente ha un valore non ammesso per data di nascita. Infatti non esiste il 31 Aprile;
  3. la seconda e la terza riga della tabella dipendente hanno lo stesso valore per la chiave primaria (cf). Ciò è inammissibile perchè la chiave identifica le tuple.
  4. la terza riga della tabella dipendente ha valori inconsistenti, rispetto alla data odierna, per data di nascita e età;
  5. la seconda riga della tabella lavoro ha un valore per teatro che non corrisponde ad alcun teatro nella tabella teatro;
  6. la quarta riga della tabella lavoro ha un valore per dipendente che non corrisponde ad alcun dipendente nella tabella dipendente.

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.

Avanti Indietro Indice
Basi di dati - Massimo Franceschet