Ci si serve di una base dati (o database) per memorizzare un certo gruppo di informazioni di interesse in maniera ordinata ed efficiente. Una delle funzionalitร tipiche offerte da un database consente di estrarre dalla base dati tutti e soltanto i dati che corrispondano ad un certo criterio, specificato dallโutente.
Ad esempio, immaginiamo di memorizzare in un database i dati anagrafici relativi ai frequentatori di una certa palestra. Supponiamo poi di essere interessati a conoscere i nomi e i cognomi di tutti gli iscritti che non abbiano ancora compiuto trenta anni.
ร possibile ottenere tale informazione tramite una semplice interrogazione del database, chiamata piรน comunemente anche query, che consente per lโappunto lโidentificazione e la visualizzazione dei dati desiderati.
Un database dunque รจ uno strumento per il raggruppamento e la gestione di informazioni di varia natura tramite lโuso di tabelle, in cui i dati vengono messi in relazione tra loro. Ma in che modo le informazioni vengono raggruppate? Secondo quale criterio vengono costruite le tabelle?
La soluzione piรน immediata puรฒ essere lโinserimento di tutti i dati di interesse in unโunica tabella. Tale operazione, perรฒ, contribuisce a costruire una tabella con un numero di righe (record) e di colonne (campi) molto alto in rapporto alla mole di dati trattata.
Il problema generato dallโutilizzo di unโunica tabella, inoltre, รจ anche di tipo concettuale. Lโutilizzo di una singola tabella non consente di evidenziare in modo puntuale e chiarificatore quali siano le specifiche relazioni che in genere coinvolgono anche uno o piรน sottogruppi del gruppo di dati presi in esame.
Immaginando invece che le informazioni siano contenute in piรน tabelle, diventa necessario e non semplice garantire che non vi siano informazioni duplicate, con conseguente spreco di memoria e necessitร di piรน operazioni di aggiornamento.
Proprio per fornire linee guida per queste scelte, garantendo efficienza e completezza nella strutturazione dei dati, vengono definite le cosiddette forme normali di un database.
Un database strutturato in forma normale, infatti, facilita e rende piรน rapide le operazioni sui dati, riducendo il rischio di ridondanza ed incoerenza dei dati. Vediamo quindi di capire cosa sโintende per forme normali e normalizzazione dei database.
La Prima Forma Normale (1NF)
La prima forma normale definita per un database esprime un concetto semplice ma fondamentale: ogni riga di ciascuna tabella deve poter essere identificata in modo univoco tramite un gruppo di dati in essa contenuti. In altre parole, in una tabella del tipo:
Nome | Etร | Professione |
Alberto | 30 | Impiegato |
Gianni | 24 | Studente |
Giulia | 50 | Insegnante |
non รจ possibile distinguere il dato inserito nella prima riga da quello inserito nella terza: le due righe sono infatti identiche. LโAlberto della prima riga, di 30 anni impiegato, non รจ infatti distinguibile dallโAlberto, 30 anni, impiegato, della terza riga.
Il problema potrebbe essere risolto inserendo un altro campo nella tabella, con valore diverso per ogni riga, ad esempio il codice fiscale. A questo punto, il database sarebbe in prima forma normale.
Il campo o lโinsieme di campi diversi per ciascuna riga e sufficienti ad identificarla sono detti chiave primaria della tabella (in questo caso il codice fiscale).
Codice Fiscale | Nome | Etร | Professione |
LBRRSS79Y12T344A | Alberto | 30 | Impiegato |
GNNBNCT84A11L611B | Gianni | 24 | Studente |
GLSTMT59U66P109B | Giulia | 50 | Insegnante |
Il miglioramento delle prestazioni in questo caso รจ piuttosto evidente: la presenza di righe uguali allโinterno di una tabella รจ infatti un evidente sintomo di inefficienza, che viene cosรฌ eliminato. Proprio per questo tutti i principali software di gestione database (come ad esempio SQL Server e Oracle) richiedono allโutente di definire una chiave primaria per ogni tabella creata.
Si noti che la presenza di una chiave primaria รจ requisito indispensabile ma non sufficiente affinchรจ una base dati sia in prima forma normale; infatti รจ altresรฌ necessario che non vi siano gruppi di attributi che si ripetono (ossia ciascun attributo deve essere definito su un dominio con valori atomici).
La tabella vista poco sopra รจ in 1NF; per chiarezza facciamo un esempio di una tabella che, seppur munita di una chiave primaria, non puรฒ essere considerata in forma normale:
Codice Fiscale | Nome | Dettagli |
LBRRSS79Y12T344A | Alberto | etร : 30; professione: Impiegato |
GNNBNCT84A11L611B | Gianni | etร : 24; professione: Studente |
La tabella qui sopra NON รจ in 1NF in quanto, pur avendo una chiave primaria, presenta un campo (dettagli) che non contiene dati in forma atomica.
La Seconda Forma Normale (2NF)
Un ulteriore miglioramento รจ possibile passando alla seconda forma normale. Perchรจ una base dati possa essere in 2NF รจ necessario che:
- si trovi giร in 1NF;
- tutti i campi non chiave dipendano dallโintera chiave primaria (e non solo da una parte di essa).
Per fare un esempio, si supponga di avere a che fare con il database di una scuola con una chiave primaria composta dai campi โCodice Matricolaโ e โCodice Esameโ:
Codice Matricola | Codice Esame | Nome Matricola | Voto Esame |
1234 | M01 | Rossi Alberto | 6 |
1234 | L02 | Rossi Alberto | 7 |
1235 | L02 | Verdi Mario | 8 |
Il database qui sopra si trova in 1NF ma non in 2NF in quanto il campo โNome Matricolaโ non dipende dallโintera chiave ma solo da una parte di essa (โCodice Matricolaโ). Per rendere il nostro database 2NF dovremo scomporlo in due tabelle:
Codice Matricola | Codice Esame | Voto Esame |
1234 | M01 | 6 |
1234 | L02 | 7 |
1235 | L02 | 8 |
e
Codice Matricola | Nome Matricola |
1234 | Rossi Alberto |
1235 | Verdi Mario |
Nella prima tabella il campo โVotoโ dipende correttamente dalla chiave primaria composta da โCodice Matricolaโ e โCodice Esameโ, mentre nella seconda tabella il campo โNome Matricolaโ dipende correttamente dalla sola chiave primaria presente (โCodice Matricolaโ). Ora il nostro database รจ normalizzato in seconda forma normale.
La Terza Forma Normale (3NF)
Anche la terza forma normale, che definisce in modo ancora piรน puntuale ed efficiente la struttura delle tabelle di un database, si basa sul concetto di dipendenza funzionale giร esposto. Un database รจ in 3NF se:
- รจ giร in 2NF (e quindi, necessariamente, anche 1NF);
- tutti gli attributi non chiave dipendono direttamente dalla chiave (quindi non ci sono attributi โnon chiaveโ che dipendono da altri attributi โnon chiaveโ).
Per fare un esempio, torniamo allโipotetico database della palestra; supponiamo di avere una base dati che associ il codice fiscale dellโiscritto al corso frequentato ed allโinsegnante di riferimento. Si supponga che il nostro DB abbia unโunica chiave primaria (โCodice Fiscaleโ) e sia cosรฌ strutturato:
Codice Fiscale | Codice Corso | Insegnante |
LBRRSS79Y12T344A | BB01 | Marco |
GNNBNCT84A11L611B | BB01 | Marco |
GLSTMT59U66P109B | AE02 | Federica |
Il nostro database non รจ certamente in 3NF in quanto il campo โinsegnanteโ non dipende dalla chiave primaria ma dal campo โCodice Corsoโ (che non รจ chiave). Per normalizzare il nostro DB in 3NF dovremo scomporlo in due tabelle:
Codice Fiscale | Codice Corso |
LBRRSS79Y12T344A | BB01 |
GNNBNCT84A11L611B | BB01 |
GLSTMT59U66P109B | AE02 |
e
Codice Corso | Insegnante |
BB01 | Marco |
AE02 | Federica |
Il nostro database รจ ora in terza forma normale.
In conclusione, la normalizzazione dei database รจ un processo fondamentale per garantire lโintegritร e lโefficienza della gestione dei dati. Attraverso le varie forme normali, i progettisti di database possono ottimizzare la struttura delle tabelle, minimizzando la ridondanza e semplificando le operazioni di aggiornamento. La corretta implementazione delle forme normali contribuisce non solo a migliorare le performance del database, ma anche a preservare la coerenza e lโaffidabilitร dei dati nel tempo.