Normalizzazione
La normalizzazione di una base di dati assicura il rispetto di regole all’interno della base di dati stessa.
In pratica, consideriamo gli schemi di relazione prodotti nella fase di progettazione logica e controlliamo che essi rispettino certi requisiti.
Esistono diversi livelli di normalizzazione:
- prima forma normale (1NF)
- seconda forma normale (2NF)
- terza forma normale (3NF)
Prima forma normale (1NF)
Una relazione si dice in prima forma normale (1NF) se e solo se rispetta entrambi questi requisiti:
- ogni attributo è atomico, ovvero non composto
- ogni attributo è singolo, ovvero non multiplo
Se una base di dati è stata costruita seguendo le regole di progettazione concettuale e logica già studiate, è certo che essa sia già in prima forma normale.
Seconda forma normale (2NF)
Una relazione si dice in seconda forma normale (2NF) se e solo se rispetta entrambi questi requisiti:
- è in prima forma normale
- ogni attributo non chiave dipende completamente dalla chiave primaria, ovvero dipende non solo da una parte della chiave primaria
Per normalizzare, si procede in questo modo:
- nello schema di relazione originario rimangono la chiave primaria e gli eventuali attributi non chiave completamente dipendenti da essa
- si crea un nuovo schema di relazione per ogni parte di chiave primaria da cui dipendono completamente altri attributi non chiave
Si consideri, ad esempio, la seguente base di dati, in cui la chiave primaria è (nomeProgetto, cognome):
| cognome | stipendio | nomeProgetto | budget | ruolo |
|---|---|---|---|---|
| Rossi | 2 | biella | 300 | tecnico |
| Verdi | 3 | valvola | 500 | progettista |
| Verdi | 3 | albero | 1500 | progettista |
| Neri | 7 | albero | 1500 | direttore |
| Neri | 7 | valvola | 500 | consulente |
| Neri | 7 | biella | 300 | consulente |
| Mori | 6 | biella | 300 | direttore |
| Bianchi | 6 | biella | 300 | progettista |
| Mori | 6 | albero | 1500 | progettista |
| Bianchi | 6 | albero | 1500 | progettista |
Notiamo che:
- si ripete più volte che un impiegato percepisce un certo stipendio, ovvero: l’attributo
stipendionon dipende dall’intera chiave primaria, ma solo dall’attributocognome - si ripete più volte che un progetto ha un certo budget, ovvero: l’attributo
budgetnon dipende dall’intera chiave primaria, ma solo dall’attributonomeProgetto - l’attributo
ruolodipende completamente dalla chiave primaria(nomeProgetto, cognome)
Se lasciassimo la base di dati così com’è, ci sarebbero dei problemi nelle fasi di:
- aggiornamento di dati:
- poiché si ripete più volte la notizia che un impiegato percepisce un certo stipendio, se lo stipendio viene aggiornato questo deve essere fatto su tutte le tuple che riguardano un certo impiegato
- poiché si ripete più volte che un progetto ha un certo budget, se il budget viene aggiornato lo si deve fare su tutte le tuple che riguardano un certo progetto
- cancellazione di dati:
- supponendo che un impiegato lasci l’azienda o non partecipi a progetti rischiamo di perdere i dati sui progetti se era l’ultimo impiegato del progetto
- analogo ragionamento per i dati degli impiegati se un progetto viene eliminato
- inserimento di dati:
- se la chiave è (nomeProgetto, cognome) non è possibile inserire i dati di un impiegato se non è stato assegnato ad almeno un progetto, analogamente per un nuovo progetto a cui non è stato ancora assegnato un impiegato
Per risolvere il problema, possiamo decomporre lo schema di relazione precedente nei seguenti tre schemi:
-
lo schema
Funzione:cognome nomeProgetto ruolo Rossi biella tecnico Verdi valvola progettista Verdi albero progettista Neri albero direttore Neri valvola consulente Neri biella consulente Mori biella direttore Bianchi biella direttore Mori albero progettista Bianchi albero progettista -
lo schema
Impiegato:cognome stipendio Rossi 2 Verdi 3 Neri 7 Mori 6 Bianchi 6 -
lo schema
Progetto:nomeProgetto budget biella 300 valvola 500 albero 1500
Nota che il risultato ottenuto sarebbe stato frutto di una corretta traduzione del seguente diagramma ER:
Infatti, nella stragrande maggioranza dei casi, una buona fase di progettazione concettuale porta a schemi di relazione che già rispettano la seconda forma normale.
Terza forma normale (3NF)
Una relazione si dice in terza forma normale (3NF) se e solo se rispetta entrambi questi requisiti:
- è in seconda forma normale
- ogni attributo non chiave dipende direttamente dalla chiave, ovvero non esistono dipendenze funzionali tra attributi non chiave.
Per normalizzare, si procede in questo modo:
- nello schema di relazione originario rimangono la chiave primaria e gli eventuali attributi non chiave direttamente dipendenti da essa
- si crea un nuovo schema di relazione per ogni attributo da cui dipendono direttamente altri attributi non chiave
Ad esempio, consideriamo il seguente schema di relazione:
Tragitto(bici, cittadino, km, utilizzo, tipo_bici, fornitore_bici)
In cui:
kmindica la lunghezza del tragitto,utilizzoquanti chilometri ha fatto il cittadino durante l’anno, ogni tipo di bici è fornito da uno specifico fornitoretipo_bicidipende solo dabiciutilizzodipende solo dacittadinofornitore_bicidipende solo datipo_bici
Si può constatare che lo schema di relazione è in 1NF. Trasformandolo in 2NF, otteniamo:
Tragitto(bici, cittadino, km)
Bici(bici, tipo_bici, fornitore_bici)
Uso(cittadino, utilizzo)
Lo schema ottenuto è in 2NF, ma non in 3NF, poiché l’attributo fornitore_bici non dipende direttamente dalla chiave bici.
Bisogna quindi creare un nuovo schema di relazione, in cui fornitore_bici dipenda direttamente dalla chiave tipo_bici:
Tragitto(bici, cittadino, km)
Bici(bici, tipo_bici)
Tipo(tipo_bici, fornitore_bici)
Uso(cittadino, utilizzo)
Tutti gli schemi di relazione ottenuti sono ora in 3NF.
Infatti, nella stragrande maggioranza dei casi, una buona fase di progettazione concettuale porta a schemi di relazione che già rispettano la seconda forma normale.