Database: relazioni tra tabelle e integrità referenziale
Uno degli obiettivi di una buona strutturazione del database è eliminare la ridondanza dei dati, ovvero i dati duplicati. Per raggiungere tale obiettivo, è possibile suddividere i dati in più tabelle in base all’argomento in modo che ogni fatto sia rappresentato solo una volta.
Una relazione si definisce facendo corrispondere i dati nei campi chiave, in genere, ma non necessariamente, un campo con lo stesso nome per entrambe le tabelle.
Esistono tre tipi di relazioni tra tabelle.
Relazione uno-a-molti
Si consideri un database che tiene traccia degli Articoli composto da una tabella Categorie e una tabella Articoli.
Una categoria può essere associata a un numero qualsiasi di articoli; di conseguenza, per qualsiasi categoria rappresentata nella tabella Categorie possono essere rappresentati numerosi articoli nella tabella Articoli.
Tra la tabella Categorie e la tabella Articoli esiste pertanto una relazione uno-a-molti.

Per rappresentare una relazione uno-a-molti nella progettazione del database, aggiungere la chiave primaria del lato uno
della relazione come ulteriore campo o campi nella tabella sul lato molti
della relazione.
In questo caso si aggiunge un nuovo campo alla tabella Articoli (Categoria), corrispondente al campo chiave della tabella Categorie (ID).
Relazione molti-a-molti
Si consideri la relazione tra una tabella Articoli e una tabella Ordini.
Un singolo ordine può includere più prodotti, mentre un singolo prodotto può essere incluso in molti ordini.
A ogni record della tabella Ordini possono pertanto corrispondere numerosi record della tabella Articoli e a ogni record della tabella Articoli possono corrispondere numerosi record della tabella Ordini.
Questo tipo di relazione viene denominata relazione molti-a-molti, poiché a qualsiasi prodotto possono corrispondere molti ordini e a qualsiasi ordine possono corrispondere molti prodotti.
Per rilevare le relazioni molti-a-molti esistenti tra le tabelle, è importante considerare entrambi i lati della relazione.
Per rappresentare una relazione molti-a-molti è necessario creare una terza tabella
, in genere denominata tabella di collegamento, che consente di suddividere la relazione molti-a-molti in due relazioni uno-a-molti.
Nella terza tabella viene inserita la chiave primaria di ognuna delle due tabelle, registrando così ogni occorrenza o istanza della relazione.

La tabella Ordini e la tabella Prodotti, per esempio, hanno una relazione molti-a-molti definita creando due relazioni uno-a-molti per la tabella chiamata ad esempio Dettagli_Ordini.
Un ordine può includere diversi articoli e ciascun articolo può apparire in molti ordini.
Relazione uno-a-uno
In una relazione uno-a-uno ogni record della prima tabella può avere solo un record
corrispondente nella seconda tabella e viceversa.
Questo tipo di relazione non è comune, in quanto le informazioni correlate vengono in genere memorizzate nella stessa tabella.
È possibile utilizzare una relazione uno-a-uno per dividere una tabella con molti campi, per isolare parte di una tabella per ragioni di protezione o per memorizzare le informazioni valide solo per un sottoinsieme della tabella principale.
Per un cittadino, per esempio, è possibile dividere le informazioni che riguardano i dati anagrafici da quelli lavorativi.
Per ottenere ciò occorre “collegare” le chiavi primarie delle due tabelle.
L’integrità referenziale
Quando si struttura un database, si suddividono le informazioni in molte tabelle in base all’argomento in modo da ridurre al minimo la ridondanza dei dati.
Si supponga di avere una relazione uno-a-molti tra Corrieri e Ordini e che si desideri eliminare un corriere. Se al corriere che si desidera eliminare sono associati ordini nella tabella Ordini, quando si elimina la relativa tupla i relativi ordini diventeranno “orfani”. Gli ordini continueranno a contenere un ID corriere ma l’ID non sarà più valido poiché il record a cui fa riferimento è stato eliminato.
Scopo dell’integrità referenziale è di impedire l’esistenza di record orfani e di mantenere in sincronia i riferimenti in modo che tale situazione ipotetica non possa mai verificarsi.

Dopo aver applicato l’integrità referenziale, sono valide le regole seguenti:
- Non è possibile immettere un valore in un campo chiave esterna di una tabella correlata se tale valore non esiste nel campo chiave primaria della tabella primaria, poiché in tal caso verrebbero creati record orfani.
- Non è possibile eliminare un record da una tabella primaria se esistono record corrispondenti in una tabella correlata. Non è ad esempio possibile eliminare il record di un dipendente da una tabella Dipendenti se vi sono ordini assegnati a tale dipendente nella tabella Ordini. È tuttavia possibile scegliere di eliminare un record primario e tutti i record correlati in un’unica operazione se è attiva la proprietà Elimina record correlati a catena.
- Non è possibile modificare un valore di chiave primaria, poiché in tal modo verrebbero creati record orfani. Non è ad esempio possibile modificare un numero di ordine nella tabella Ordini se vi sono voci assegnate a tale ordine nella tabella Dettagli sugli ordini. È tuttavia possibile scegliere di aggiornare un record primario e tutti i record correlati in un’unica operazione se è attiva la proprietà Aggiorna campi correlati a catena.
Visite: 39