Un 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:
Questa 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.