back to top

Normalizzazione di un database

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.

Pubblicitร 

รˆ 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:

NomeEtร Professione
Alberto30Impiegato
Gianni24Studente
Giulia50Insegnante

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 FiscaleNomeEtร Professione
LBRRSS79Y12T344AAlberto30Impiegato
GNNBNCT84A11L611BGianni24Studente
GLSTMT59U66P109BGiulia50Insegnante

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 FiscaleNomeDettagli
LBRRSS79Y12T344AAlbertoetร : 30; professione: Impiegato
GNNBNCT84A11L611BGiannietร : 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 MatricolaCodice EsameNome MatricolaVoto Esame
1234M01Rossi Alberto6
1234L02Rossi Alberto7
1235L02Verdi Mario8

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 MatricolaCodice EsameVoto Esame
1234M016
1234L027
1235L028

e

Codice MatricolaNome Matricola
1234Rossi Alberto
1235Verdi 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 FiscaleCodice CorsoInsegnante
LBRRSS79Y12T344ABB01Marco
GNNBNCT84A11L611BBB01Marco
GLSTMT59U66P109BAE02Federica

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 FiscaleCodice Corso
LBRRSS79Y12T344ABB01
GNNBNCT84A11L611BBB01
GLSTMT59U66P109BAE02

e

Codice CorsoInsegnante
BB01Marco
AE02Federica

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.

Altri contenuti interessanti

Pubblicitร 

Leggi anche...

Come ottenere lโ€™ID dellโ€™ultimo record inserito in MySQL, PostgreSQL, SQL Server e Oracle?

Ottenere l'ID dell'ultimo record inserito in una tabella, dopo...

Database completo regioni, province e comuni italiani (in formato SQL)

Quando si sviluppa un sito web o un'applicazione in...

File CSV: cosa sono, come si aprono e come crearli

In questo articolo cercheremo di capire cos'รจ il formato...

Confrontare due tabelle e trovare i record senza corrispondenza

all'interno di un database relazionale puรฒ essere utile poter...

Eseguire comandi SQL online con SQL Fiddle

Sรฌ. E' possibile testare codice SQL senza aver installato...

SQL: Calcolare la media dei valori di piรน campi

Attraverso una semplice query SQL รจ possibile calcolare dinamicamente...
Pubblicitร