Implementare il vincolo d'Integrità Referenziale in un database Access

Giorgio Borelli

Diagramma Entity-Relationship Diagram o ERD, delle relazioni tra le tabelle  Membership User di ASP.NET di un database AccessUn database Relazionale, a differenza di un database "normale", permette di definire delle relazioni tra le varie entità (tabelle) del db in modo tale da correlare i vari dati secondo una logica che astrae la realtà. Le relazioni tra le tabelle, permettono di manipolare i dati più facilmente e soprattutto evitano la ridondanza dei dati, ovvero la duplicazione inevitabile delle informazioni che si avrebbe nel caso di definizione di tabelle indipendenti. Un Diagramma Entità Relazioni (Entity-Relationship Diagram o ERD) come quello mostrato in figura, rende immediatamente idea di come le tabelle del database sono collegate tra di esse e quali siano le loro relazione.

La potenza e la flessibilità delle relazioni tra l'entità del db ci consente di collegare i dati che andremo a gestire con la nostra applicazione, collegando i record delle nostre tabelle in modo da gestire più informazioni (lettura, scrittura, aggiornamento) con una singola query sql, anzichè con molteplici query su singole tabelle indipendenti, ed evitare di fatto la replicazione di record (ridondanza dei dati) ed informazioni già presenti. Tutti i più moderni e diffusi database  quali: Sql Server, MySql, Oracle, Postgree SQL sono relazionali, e sebbene meno potente di quest'ultimi anche Microsoft Access è un database relazionale e permette di definire le relazioni tra le tabelle sia in maniera manuale che in modo guidato con estrema semplicità.

Un'altro aspetto fondamentale da tenere in considerazione durante la progettazione di un database e per la definizione delle relazioni tra le tabelle e se queste devono soddisfare o meno determinate regole di unicità e vincoli d'integrità, che assicurino la correttezza e la consistenza dei dati. Uno dei vincoli sicuramente più usato e diffuso è quello d'integrità referenziale.

Il Vincolo d'Integrità Referenziale è una "regola" che stabilisce che la presenza dei record tra le entità relazionate soddisfi necessariamente la presenza delle chiavi nell'una e nell'altra tabella. Tale vincolo assume pertanto il significato di predicato, che può assumere il valore di vero o falso, a seconda che la base di dati definita lo soddisfi o meno. Il Vincolo d'Integrità Referenziale (uno dei più diffusi ed usato), assicura la consistenza e la correttezza dei record presenti in un database, evitando che ci siano record orfani, ovvero che non hanno riferimento nella tabella collegata.

Anche con Access è possibile definire il Vincolo d'Integrità Referenziale, peremettendo di specificare anche quali azioni (effetto a catena) intraprendere sui record nel caso venga modificato o cancellato un record relazionato con record di altre tabelle.

Un Database ben progettato, con una implementazione accorta e pensata delle sue entità e rispettivi tipi, e con le definizioni opportune delle relazioni tra di esse è la base di partenza per lo sviluppo di una buona applicazione funzionale manutenibile. Un'adeguata architettura del database consente una più facile gestione e manutenzione ed evita il sovraccarico dei dati. 

Prima di chiarire però come specificare il vincolo d'integrità referenziale in un database Access, facciamo un breve sunto di quali siano le relazioni tra le tabelle e di come s'implementino in un database tramite la specifica delle chiavi primarie e secondarie.

 

Definizioni delle Relazioni tramite la specifica delle Chiavi

Ancor prima di definire i tipi di relazioni possibili, diciamo cosa sono i campi chiave, i quali ci permettono di specificare i collegamenti e le relazioni tra le tabelle di un database. La definizione delle relazioni tra l'entità di un database è possibile solo grazie alla specifica di particolari campi tra le tabelle coinvolte, dette chiavi. Le chiavi di una tabella di un db non sono altro che campi definiti appositamente per fungere da collegamento, e devono essere dello stesso tipo e presenti in entrambe le tabelle relazionate. Possiamo definire due tipi di chiave per creare le nostre relazioni, e queste sono:

Chiave Primaria (PRIMARY KEY)

La chiave primaria deve essere unica in una tabella, e solitamente viene definita tramite un campo contatore (incrementale) in Access, mentre in Sql Server si usano spesso i tipi GUID (Global Unique Identifier). In Access il tipo GUID non è presente. La chiave primaria viene indicata con il simbolo della chiave affianco al campo in cui è definita.

 

Chiave Secondaria o Esterna (FOREIGN KEY)

La chiave secondaria o esterna invece è quella che identifica la chiave primaria della tabella collegata, ed è possibile definirne più di una all'interno della stessa tabella basta che questa sia dello stesso tipo della chiave primaria a cui fà riferimento. Anche per la Foreign KEY si usano quasi solitamente i tipi numerici per il corrispondente

 

I tipi di Relazioni definibili tra le Tabelle di un Database

Le relazioni per mettere in correlazioni i record delle tabelle di un database possono essere di tre tipi, e sono:

Uno a Uno

Si ha una relazione uno a uno quando ad un record di una tabella corrisponde un solo record della seconda tabella. Questa relazione è poco usata, in quanto solitamente l'informazione può essere contenuta nella stessa tabella poichè riguarda lo stesso elemento, trova utilità quando si vuole differenziare un'informazione sullo stesso elemento su due diverse tabelle, come ad esempio nel caso si vogliano differenziare i dati globali su un libro in quelli riguardanti l'autore e quelli sulla casa editrice. Viene rappresentato nel diagramma ERD con una linea uno ad uno.

La creazione di una relazione uno ad uno avviene tramite la specifica di una chiave primaria nelle due tabelle relazionate.

 

Uno a Molti

Si ha una relazione uno a molti quando ad un record della prima tabella corrispondono più record della seconda tabella. Sicuramente è la relazione più diffusa ed usata, ed il più classico degli esempi è quello tra mamma e figli, ad una mamma possono corrispondere più figli, ma non il contrario, o ancora ad un cliente possono corrispondere più ordini e così via. Viene rappresentato nel diagramma ERD con una linea uno ad infinito.

La creazione di una relazione uno a molti avviene tramite la specifica di una chiave primaria nelle prima tabella e della corrispondente chiave secondaria nella tabella collegata, ad un record della prima tabella che possiede una chiave primaria univoca possono corrispondere più record della seconda tabella con la chiave secondaria che possiede lo stesso valore di quella primaria.

 

Molti a Molti

La relazione molti a molti è sicuramente la più complessa, in quanto collega due tabelle in modo che al record di una corrispondano più record dell'altra e viceversa. Per implementare la relazione molti a molti bisogna avvalersi di una terza tabella che metta in relazione le prime due con due relazioni uno a molti in entrambi i sensi verso la tabella intermediaria. Un esempio potrebbe essere quello relativo ai prodotti e agli ordini, un prodotto può essere ordinato più volte ed un'ordine può contenere più prodotti. Viene rappresentato nel diagramma ERD con una linea infinito ad infinito.

La creazione di una relazione molti a molti, avviene tramite la specifica delle chiavi secondarie in entrambe le tabelle collegate, mentre nella tabella intermediaria sono presenti i valori delle chiavi primarie che le uniscono. 

 

Interrogare le tabelle relazionate con il Join

Il Join non è altro che la parola chiave usata nel linguaggio delle query sql, che esprime la relazione tra le tabelle, in caso quindi di una interrogazione sul database con una SELECT, per estrapolare più dati da due o più tabelle collegate, faremo uso del Join per esprimere tale collegamento. Il Join può essere di tre tipi, e sono:

Join Interno o Naturale

Il Join Naturale come detto serve per ricavare i dati tra due tabelle collegate, la sua caratteristica è che estrapola solo i record in cui i campi corrispondenti presentino entrambi i dati sia nella prima che nella seconda tabella. In altre parole se abbiamo due tabelle, A e B, collegate tra di loro, con un join naturale vengono selezionati i soli record che possiedono dei dati in entrambe le tabelle al soddisfacimento della condizione sulle chiavi;

Esiste anche un Join Naturale definito come Tetha Join per il quale la condizione di verifica sulle chiavi è diversa dall'uguagliana, come potrebbe essere un maggiore di o diverso da.

 

Join esterno sinistro

Il Join sinistro è come il Join Naturale solamente che vengono  prelevati tutti i record soddisfacenti la condizione sulle chiavi appartenenti alla tabella sinistra (tabella A per intenderci) anche se non vi è il corrispondente valore nel record della tabella di destra.

 

Joi esterno destro

Il Join destro è l'inverso di quello sinistro, vengono prelevati tutti i record soddisfacenti la condizione sulle chiavi appartenenti alla tabella destra (tabella B) anche se non vi è il corrispondente valore nel record della tabella sinistra.

 

Definire il Vincolo d'Integrità Referenziale in Access

Per definire il Vincolo d'integrità referenziale in Access in modo che i dati siano sempre consistenti ed evitare che vi siano record orfani (non esiste più la chiave primaria corrispondente), basta aprire il nostro database e dal menù strumenti selezionare la voce "Relazioni" (il bottone relazioni compare anche nella barra degli strumenti se siamo sulla maschera tabelle). Selezionando le Relazioni, si apre una finestra che mostra il diagramma entità-relazioni del vostro db (come nella figura in alto), per specificare il vincolo d'integrità referenziale basta cliccare su un link costituente la relazione tra due tabelle, si aprirà un'ulteriore finestra modale, nel quale specificare se usare o meno il vincolo e le azioni a catena da intraprendere nel caso della modifica o cancellazione di una chiave, come mostrato in figura:

finestra per la modifica delle relazioni e dell'integrità referenziale in un database accessQuesta finestra ci consente non solo di modificare le relazioni tra le tabelle, selezionando opportunamente le chiavi conivolte, ma presenta dei check che se spuntati applicano l'integrità referenziale e le azioni da intraprendere, in particolare sono:

- Applica integrità referenziale: se spuntata le tabelle collegate devono soddisfare tale vincolo e non sarà possibile avere record in una delle due che non abbia record con chiave primaria nell'altra.

- Aggiorna campi correlati a catena: se spuntata i record delle tabelle collegate vengono aggiornati automaticamente al variare di una delle chiavi, se ad esempio modifico il valore della chiave primaria nella prima tabella, tutte le chiavi esterne dell seconda tabella a cui faceva riferimento verranno automaticamente aggiornate.

- Elimina record correlati a catena: se spuntata ci garantisce che non possano esistere record con chiavi orfane, ogni qual volta si cancella un record avente una chiave primaria, conseguentemente si cancellano i record della seconda tabella la cui chiave secondaria era collegata a quella primaria cancellata, ad esempio per due tabelle categoria e prodotti, collegate tra di loro da una relazione uno a molti, cancellando un record specificante una categoria (con chiave primaria) si cancellano automanticamente tutti i prodotti collegati a quella categoria dalla relativa chiave esterna, in questo esempio il comportamento a catena di eliminazione è ragionevolmente corretto.

 

Conclusioni

Anche con Access è possibile definire le relazioni tra le entità, vincoli e soddisfare l'Integrità Referenziale, ma sebbene quest'ultima è spesso un requisito necessario, precisiamo che non è obbligatoria e vi sono casi in cui non và definita. Bisogna fare un'attenta analisi di quello che si vuole realizzare, mettendo appunto un'architettura del database più consona e vicina all'astrazione della realtà che si vuole rappresentare, questo è sicuramente il punto di partenza per sviluppare un'applicazione corretta.

Chiunque volesse aggiungere qualcosa in merito all'argomento o porre una domanda può farlo benissimo tramite i commenti.

Categorie: Access | database

Tags:

Commenti (8) -

Ciao!!Ho un problema nel trovare la soluzione riguardante l'integrità referenziale, per una domanda di esame ECDL.
La domanda e' la seguente:
Crea la relazione tra la tebella dipendenti e la tabella pratiche.
Tieni presente che nel campo funzionario e' inserito il codice del dipendente.
Applica l'integrità referenziale.

Ho tentato diversi passaggi, ma se seleziono relazioni, mi apre già lui le due tabelle dove sembrano appunto bloccate, e non riesco a procedere per inserire l'integrita referenziale!
Grazie per l'aiuto!

Rispondi

Ciao Simona e benvenuta su Informaticando.NET,
se ho ben capito, la chiave primaria della tabella "Dipendenti" è la chiave secondaria (funzionario) della tabella "Pratiche", per impostare il Vincolo d'Integrità Referenziale tra queste due tabelle, devi chiamare la voce Relazioni (come dici tu stessa), dopodichè una volta che ti visualizza le tabelle collegate (diagramma ERD), per impostare il vincolo, clicca sulla linea che le collega, a questo punto ti si aprirà la finestra "Modifica Relazioni" e da lì metti la spunta sulla voce "Applica Integrità Referenziale", conferma, ed il gioco è fatto.

Le tabelle non sono bloccate, ripeto, devi semplicemente cliccare sui link che le collegano per modificarne le loro relazioni; rileggi l'ultima parte dell'articolo, spiega proprio questo aspetto.

Spero sia questa la risposta che cercavi, per qualsiasi altro chiarimento, non esitare a chiedere ancora.

P.S. imbocca al lupo per l'esame! Smile

Rispondi

enzo gravina
enzo gravina says:

ciao,
sto riscontrando un problema:
ho le tabelle in un file MSACCESS "tabelle.mdb"
il codice del programma è in un altro file PROGRAMMA.MDE
programma.mde eredita le relazioni di tabelle.mdb, PERò:
l'intergrità referenziare rimane
L'AGGIORNAMENTO E CANCELLAZIONE A CATENA no! non viene erediatata da PROGRAMMA.MDE, e quindi se tento di modificare il contenuto del campo chiave nella tabella principale (o eliminare il record) mi viene segnalato che è impossibile in quanto esistono delle relazioni
ciao e grazie

Rispondi

Ciao Enzo,
il tuo "problema" non credo sia un "problema", anzi è il modo corretto con cui funzionano i database relazionali ed in questo particolare caso delle regole d'integrità referenziale.
Vedi, nel tuo caso, non credo sia un problema di non ereditare correttamente dal file mdb al file mde, credo piuttosto (per quel che mi dici) che violi palesemente l'integrità referenziale, cerco di spiegarmi:

L'errore che fai è concettuale, l'integrità referenziale è un insieme di regole che garantiscono la validità delle relazioni tra righe di tabelle correlate e impediscono l'eliminazione o la modifica accidentale dei dati correlati, quindi se cerchi di cancellare un record con chiave primaria nella tabella principale (lo dici tu), proprio per rispettare la correttezza dell'integrità referenziale non ti viene permesso, in quanto non può esistere una chiave esterna orfana, vieni a perdere proprio uno dei principi fondamentali che regolano l'integrita. Prova invece a cancellare un record su una tabella con chiave secondaria (ed eventuale chiave primaria non correlata) vedrai che te lo fa fare.
Inoltre per quel che concerne le modifiche sulla struttura, anche lì penso che violi l'integrità referenziale la quale esige che le colonne correlate debbano essere dello stesso tipo e dimensione.


Riguarda con attenzione il diagramma relazioni del tuo database, ed accertati di fare operazioni che non violino l'integrità referenziale ivi definita.

Non farti problemi a chiedere nuovamente se il problema è diverso da quello che ho intuito o se c'è dell'altro.

Rispondi

Federica
Federica says:

Ciao! Anche io ho un problema riguardante l'integrità referenziale in Access...
Ho creato Già tabelle e relazioni tra queste, ma al momento di inserire l'integrità referenziale il programma mi dice che la mia tabella è già utilizzata da un altro utente e non posso bloccarla.
Come posso risolvere il mio problema??
Ciao, grazie per l' aiuto!!

Rispondi

Ciao Federica,
non è che semplicemente la tabella risulta già aperta, magari la finestra che ne visualizza i record è ridotta ad icona all'interno di Access stesso. Oppure c'è un "client" che la sta utilizzando, ad esempio hai il programma/web-application che opera sul db access contenente la tua tabella aperto su quella tabella. Assicurati di avere tutto chiuso insomma.
Infine tra le opzioni avanzate di Access, assicurati di avere la modalità di apertura delle tabelle su condiviso e non su esclusivo, la prima opzione prevede la possibilità di aprire le tabelle da parte di più utenti, magari stai lavorando in rete o su una macchina con più utenti, chi lo sa.

Controlla e fammi sapere, ciao.

Rispondi

Federica
Federica says:

Grazie mille! Sì il problema era che le tabelle risultavano già aperte....
Ora avrei un altro problema immagino banalissimo...dove trovo l'icona per riuscire a riaprire le tabelle? Mi scuso già in anticipo per l'ignoranza ma è la prima volta che provo ad usare Access...
Ciao e grazie

Rispondi

Le finestre si riducono ad icona nella parte bassa, all'interno sempre di Access, esattamente come succede in Windows quando le finestre vengono ridotte ad icone sulla barra degli strumenti/stato (la fascia blu posta solitamente in basso).
Se non riesci a vederle riduci o chiudi la finestra attualmente aperta in access, vedrai le altre riportate sotto.

Rispondi

Pingbacks and trackbacks (1)+

Aggiungi Commento

biuquote
Loading