I vincoli di integrità del DBMS

Nel modello relazionale un DBMS (Data Base Management System) può limitare l'inserimento di informazioni non corrette nella base dati tramite i vincoli di integrità.

I vincoli di integrità sono regole decise dal progettista per evitare l'inserimento di dati non corretti da parte di chi si occupa del data entry.

Soltanto le istanze che rispettano i vincoli di integrità, dette istanze legali, possono essere aggiunte al database.

    Esistono due categorie di vincoli:
  • Vincoli intrarelazionali
    Sono vincoli dentro una stessa relazione. Ad esempio, vincoli di tupla e i vincoli di chiave
  • Vincoli interrelazionali
    Sono vincoli tra relazioni diverse. Ad esempio, i vincoli referenziali.

I vincoli di tupla

Un vincolo di tupla è una condizione applicata a ogni tupla di una tabella (relazione).

In genere la condizione è un'espressione booleana o aritmetica che verifica i valori degli attributi dentro la tupla.

Se il vincolo di tupla riguarda un solo attributo della tabella è anche detto vincolo sui valori o vincolo di dominio.

un esempio di funzionamento dei vincoli di tupla

Come funziona un vincolo di tupla

Il vincolo di tupla analizza una tupla prima dell'inserimento nella base dati.

  • Se la tupla soddisfa i vincoli di tupla, viene inserita nella base dati (istanza legale).
  • Se la tupla non soddisfa i vincoli di tupla, non viene inserita nella base dati.

In questo modo si evita l'inserimento errato dei dati nella base dati.

Nota. Un vincolo di tupla è una condizione sui valori di ciascuna tupla, indipendentemente dal valore delle altre tuple.

Un esempio pratico

In un database possono essere inserite solo le persone con cittadinanza italiana minorenni.

Ci sono due vincoli di tupla

  • L'attributo cittadinanza deve essere uguale a "Italia"

    cittadinanza = "Italia"

  • L'attributo età deve essere minore di 18 e maggiore di 0

    (età>0) AND (età<18)

Sono due vincoli di dominio perché limitano il range dei valori nel dominio di un attributo.

Poiché entrambi i vincoli devono essere soddisfatti, devo costruire un'unica espressione booleana usando l'operatore logico AND.

( cittadinanza ="Italia") AND ( (età>0) AND (età<18) )

Ecco un esempio pratico di vincolo di tupla.

un esempio pratico di tabella con vincolo di tupla

La prima istanza rispetta i vincoli di tupla e viene aggiunta alla tabella.

Le altre tre istanze non sono aggiunte alla tabella perché non rispettano i vincoli di tupla.

I vincoli di chiave

I vincoli di chiave sono gli attributi scelti come chiave della tabella (relazione).

Cosa sono le chiavi

La chiave è l'attributo o l'insieme di attributi che permette di accedere univocamente a ogni tupla della tabella.

Esistono diversi tipi di chiavi, la più importante è la chiave primaria che non ha valori duplicati, né valori nulli.

La differenza tra chiave e chiave primaria. Ogni chiave non contiene valori duplicati al suo interno. Una chiave è detta primaria se non ha valori nulli. Una tabella può avere una sola chiave primaria. Pertanto, se diverse chiavi rispondono a questa caratteristica, ne dovrò scegliere una.
la differenza tra chiave e chiave primaria

Oltre alla chiave primaria, una tabella può avere anche diverse chiavi secondarie o superchiavi.

Pertanto, in una tabella possono esserci diversi vincoli di chiave.

Nota. Poiché una tabella è una relazione e una relazione non può contenere valori duplicati, anche la tabella non ha tuple duplicate. Pertanto, in una tabella c'è sempre almeno una chiave. Non è però detto che sia una chiave primaria.

Un esempio pratico

Questa tabella è composta da cinque attributi.

un esempio di chiave primaria

Lo schema della tabella è

R(matricola, cognome, nome, data di nascita)

Un vincolo di chiave possibile è l'attributo matricola perché non ha valori duplicati.

Non avendo valori nulli al suo interno, l'attributo matricola è anche una potenziale chiave primaria.

R{matricola}

Un altro vincolo di chiave possibile è l'insieme di attributi cognome, nome, data di nascita

R{cognome, nome, data di nascita}

I vincoli di integrità referenziale

I vincoli di integrità referenziale collegano diverse tabelle (relazioni) tramite i valori in comune. Sono anche detti chiavi esterne (foreign key).

La prima tabella è la relazione referenziante mentre la seconda è la relazione referenziata.

Il valore in comune delle tabelle deve essere dello stesso tipo e compatibile.

Può trattarsi di un attributo o di un insieme di attributi.

Nota. In genere si usano le chiavi primarie come valore comune delle tabelle. Ma non solo.

Come funziona

Un vincolo di integrità referenziale associa ogni tupla della tabella referenziante R1 con la tupla/e della tabella referenziata R2 se ha in comune lo stesso valore nella chiave primaria.

R1{chiave1} ⊆ R2(chiave2)

Dove in ogni tupla della relazione referenzante R1 vale l'uguaglianza

t1(chiave1) = t2(chiave2)

Se il vincolo di integrità referenziale non è soddisfatto in una tupla, si verifica una violazione del vincolo.

Nota. La presenza del valore Null in una chiave della tabella referenziante non viola il vincolo di integrità referenziale.

Un esempio pratico

Queste due tabelle hanno il vincolo di integrità referenziale nell'attributo Cliente.

un esempio di riferimento

In questo semplice caso il vincolo di integrità referenziale è

Ordini(Cliente)⊆Clienti(CodiceCliente)

I codici della tabella referenziante (Ordini) sono un sottoinsieme proprio o improprio dei codici della tabella referenziata (Clienti).

Nota. Se un codice clienti della tabella referenziante (Ordini) non è presente nella tabella referenziata (Clienti) si verifica una violazione del vincolo di integrità referenziale. Ad esempio, il codice 4871 della tabella Ordini non esiste nella tabella Clienti.
un esempio di violazione del vincolo di integrità referenziale
Tuttavia, se il codice referenziante è nullo (Null) non viola il vincolo di integrità referenziale.
il codice referenziante è Null
Infine, se è la tabella referenziata (Clienti) ad avere dei codici in più rispetto alla tabella referenziante, il vincolo è comunque soddisfatto. Ad esempio, il codice 4871 della tabella Clienti non è usato nella tabella Ordini ma il vincolo Ordini(Cliente) ⊆ Clienti(CodiceCliente) è soddisfatto.
un esempio di vincolo soddisfatto

E così via.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

Basi di dati