Per eliminare definitivamente la ridondanza dalle relazioni e quindi dal database, si ricorre ad un processo di normalizzazione: si tratta di un procedimento di tipo graduale, che realizza un’ottimizzazione progressiva a partire da relazioni non normalizzate fino a raggiungere un certo livello di normalizzazione.
Questo processo si fonda su un semplice criterio: se una relazione presenta più concetti tra loro indipendenti, la si decompone in relazioni più piccole, una per ogni concetto. Questo tipo di processo non è sempre applicabile in tutte le tabelle, dato che in taluni casi potrebbe comportare una perdita d'informazioni.
Prima di entrare in merito alla normalizzazione è bene introdurre alcuni particolari concetti:
Definizione di ridondanza:
Si ha ridondanza dei dati ogni volta che vengono memorizzati inutilmente dei dati ripetuti.
Esempio:
Si supponga di disporre di una tabella in cui vengono registrati tutti gli acquisti di merci effettuati da un’impresa mercantile.
Acquisti (Cod_fornitore, Nome_fornitore, Codice_fiscale, Merce, Quantità)
In un caso come questo i dati di Fornitore e Codice_ficale vengono ripetuti inutilmente ogni volta che compare la registrazione di un acquisto. Si può ovviare ad una tale problema separando le informazioni ridondanti della tabella acquisti:
Acquisti (Merce, Cod_fornitore, Quantità)
Fornitori (Cod_fornitore, Nome_fornitore, Codice_fiscale)
In questo modo se gli acquisti effettuati da un certo fornitore compaiono mille volte, non dovremo per mille volte ripetere inutilmente l’informazione Nome_fornitore, Codice_fiscale.
Dipendenza funzionale:
Si ha dipendenza funzionale tra un attributo x e una chiave se i valori di x dipendono dai valori assunti dalla chiave, ovvero se si viene a determinare una relazione biunivoca tra i valori di x e i valori della chiave.
Esempio:
Stabiliamo che nella relazione di esempio abbiamo come chiave primaria Nome e Cognome.
ANAGRAFICA (Nome, Cognome, Indirizzo)
È evidente che Indirizzo è dipendente funzionalmente dalla chiave, ciò significa che per ogni persona corrisponde un indirizzo.
Dipendenza funzionale transitiva:
Si verifica una dipendenza funzionale transitiva quando un attributo J appartenente alla relazione r dipende da un attributo K della relazione che non è chiave candidata e che a sua volta dipende da un attributo A, che è chiave candidata o primaria.
Data la relazione: r (A, B, K, J) con A chiave primaria o candidata e avendo che: (il simbolo -> significa : ” determina il valore di:”): A -> K e K -> J si verifica una dipendenza transitiva tra A e J , in quanto J dipende da A tramite K.
Esempio:
Nella seguente relazione possiamo renderci conto come il valore di Collocazione dipenda da Genere e come il valore di Genere dipenda da Identificativo_videocassetta:
VIDEOCASSETTE (Identificativo_videocassetta, Genere, Collocazione)
Identificativo_videocassetta è la chiave primaria, essa identificando la videocassetta determina il Genere; le videocassette vengono collocate raggruppandole per genere.
Prima forma normale:
Una relazione si dice in prima forma normale (1NF) se e solo se tutti i suoi attributi sono valori atomici.
Ciò implica che né gli attributi, né i valori da questi assunti possono essere scomposti ulteriormente.
La relazione che segue non è in prima forma normale:
NOME | INDIRIZZO |
---------------------------------------- | -------------------------- |
Rossi & C. s.p.a | Via Verdi, 5 Roma |
Martini s.n.c. | Via Centrale, 4 Milano |
Paoli s.a.s. | P.za Libertà, 12 Pisa |
................................... | ................................... |
in quanto l’attributo INDIRIZZO non è atomico: può essere suddiviso in Indirizzo e Città. La relazione si normalizza trasformandola in:
NOME | INDIRIZZO | CITTA' |
----------------------------- | -------------------------- | ----------- |
Rossi & C. s.p.a | Via Verdi, 5 | Roma |
Martini s.n.c. | Via Centrale, 4 | Milano |
Paoli s.a.s. | P.za Libertà, 12 | Pisa |
................................... | ................................... | ............ |
Seconda forma normale:
Una relazione è in seconda forma normale se e solo se soddisfa la 1NF e inoltre ciascun attributo che non fa parte della chiave è indipendente funzionalmente da una qualunque chiave candidata.
Per normalizzare la relazione è necessario estrarre la dipendenza funzionale riscontrata tra un sottoinsieme della chiave e l’attributo in questione, che darà luogo ad un’altra relazione.
Se applichiamo quanto detto alla relazione r (A, B, C, V, Z) con ABC chiave primaria, V dipende funzionale da ABC e Z dipende funzionale da AB, per normalizzare la relazione dobbiamo realizzare due nuove relazioni come segue:
r’ (A, B, C, V) e r’’ (A, B, Z)
Esempio:
Abbiamo una relazione che rappresenta delle scrivanie da ufficio prodotte da una azienda industriale, la chiave primaria è data Tipo_tavolo e Tipo_legno.
Tipo_tavolo | Tipo_ legno | Tipo_finitura |
------------------------ | ----------------------- | ------------------------- |
Manager | Mogano | Ottone |
Manager | Ciliegio | Acciaio inox |
Montecarlo | Noce | Sughero |
Montecarlo | Mogano | Ottone |
Top | Noce | Sughero |
Tipo_finitura è dipendente funzionalmente da un sottoinsieme della chiave primaria, ovvero da Tipo_legno, dunque la tabella non è in 2NF.
È possibile normalizzare la relazione trasformandola in:
Tipo_tavolo | Tipo_legno |
---------------------------------------- | ----------------------------- |
Manager | Mogano |
Manager | Ciliegio |
Montecarlo | Noce |
Montecarlo | Mogano |
Top | Noce |
Tipo_legno | Tipo_finitura |
------------------------------ | --------------------------------------- |
Mogano | Ottone |
Ciliegio | Acciaio inox |
Noce | Sughero |
Terza forma normale:
La terza forma normale ha come scopo l’eliminazione dalla relazione delle dipendenze funzionali transitive.
Una relazione è in terza forma normale (3NF) se, oltre ad essere in 2NF, ciascun attributo che non partecipa alla chiave non è transitivamente dipendente da una qualunque chiave candidata.