Normalizzazione di schemi relazionali
Problema generale
La progettazione concettuale e logica produce uno schema relazionale che rappresenta la realtà dei dati nella nostra applicazione, ma alcune volte ci sono delle cose che possono essere ottimizzate, si seguito vedremo delle tecniche che ci permettono di farlo
Ridondanze
Abbiamo la seguente identità: StudenteEsami(Matricola, Nome, Telefono, Corso, Voto) Notiamo subito che ci sono dei problemi:
- Anomalia di aggiornamento: se il telefono dello studente cambia allora deve essere cambiato in ogni suo esame
- Anomalia della cancellazione: se vengono annullati gli esami dati non rimane traccia dello studente
- Anomalia di inserimento: se uno studente non ha ancora dato esami non può essere inserito La soluzione a tutte queste anomalie è decomporre in due relazioni.
Dipendenze funzionali
Una dipendenza funzionale è un particolare vincolo di integrità che esprime legami funzionali tra gli attributi di una relazione
Esempio: prendendo in esame l’entità StudenteEsami descritta prima abbiamo che:
- Matricola Nome, Telefono
- Matricola, Corso Voto
Dati:
- uno schema di relazione
- e sottoinsiemi di
Diciamo che X implica funzionalmente Y in simboli per ogni relazione dello schema , se due tuple e di coincidono su tutti gli attributi di allora devono anche coincidere su tutti gli attributi di
Notazione: di seguito la notazione
- attributi
- insieme di attributi
- schema di relazione, relazione
- sta per
- sta per
- e stanno per
Definizioni
Soddisfazioni di dipendenze funzionali: diciamo che una relazione soddisfa la dipendenza funzionale se per ogni coppia di tuple e in si ha che:
- implica
Logica delle dipendenze funzionali:
- Sia un insieme di dipendenze funzionali per uno schema
- Sia una dipendenza funzionale. Diciamo che F logicamente implica e si scrive se per ogni relazione r di che soddisfa tutte le dipendenze di , soddisfa anche Esempio:
Chiusura di un insieme di dipendenze funzionali: Dato un insieme di dipendenze funzionali la sua chiusura è l’insieme delle dipendenze funzionali che sono implicate logicamente da in simboli: Chiavi per uno schema con insieme di dipendenze funzionali: Sia:
- un insieme di dipendenze su
- sottoinsieme di . Si dice che è una chiave di se:
Commenti:
- Un istanza di uno schema che rispetti una data dipendenza funzionale viene detta istanza legale
- Se è una chiave in uno schema allora ogni altro attributo di dipende funzionalmente da
- Dire che significa asserire che i valori della componente dipendono e da i valori della componente
- Se non necessariamente risulta anche
Necessità di calcolo logico
Il problema è quello di calcolare la chiusura di un insieme di dipendenze funzionali.
Per fare ciò definiamo un calcolo logico tale che se e soltanto se si può sintatticamente dedurre da nel calcolo logico.
Assiomi di Armstrong
Di seguito i vari assiomi:
- un universo di attributi
- Riflessività:
- Aumento:
- Transitività:
Deducibilità di dipendenze funzionali
Diciamo che se si può dedurre da applicando un numero finito di volte gli assiomi di Armstrong. Esempio: applicando 2 volte la transitività il risultato dovrà rispetta le due proprietà di seguito:
- Correttezza: Se allora
- Completezza: allora Se gli assiomi di Armstrong sono dimostrabili allora siamo in grado di capire se una dipendenza funzionale è valida
Di seguito le dimostrazioni:

Lemmi per derivare le dipendenze funzionali
Regola di decomposizione: Se e allora
Regola dell’unione: Se e allora
Regola di pseudotransitività: Se e allora
Lemma fondamentale: Definiamo e diciamo che

Dimostrazione di completezza

Chiusure, equivalenze e ricoprimenti minimi
Calcolo delle chiusure
Ricordiamo che il calcolo di può essere particolarmente costoso
Ad esempio se allora include per ogni sottoinsieme di . Quindi ha cardinalità almeno .
Invece calcolare è molto più semplice e lo si fa attraverso il seguente algoritmo: 
Equivalenze di dipendenze funzionali
Siano insiemi di dipendenze funzionali allora diciamo che sono equivalenti se . La relazione di equivalenza tra insiemi di dipendenze ci permette di capire quando due schemi di relazione rappresentano gli stessi fatti, e si fa usando il seguente algoritmo:
- Per ogni in controlliamo se essa è in calcolando e controllando se questo implica
- Viceversa in maniera analoga si può controllare se
Insieme di dipendenze minimali
Un insieme di dipendenze funzionali è minimale se:
- Ogni lato destro di una dipendenza è un singolo attributo
- Per ogni dipendenza in , non è equivalente a
- Per ogni A in e non è equivalente a Dato si dice che è un suo ricoprimento minimale se è minimale ed è equivalente a .
Teorema: Ogni insieme di dipendenze funzionali ha un ricoprimento minimale
Dimostrazione: 
Decomposizione di uno schema, decomposizioni che preservano i dati
Decomposizione di uno schema
Dato uno schema una sua decomposizione è un insieme di sottoinsiemi di tali che:
Esempio:

Preservazione dei dati
Decomporre lo schema iniziale comporta il vantaggio di evitare ridondanze nella rappresentazione. Nel nostro caso specifico basta fare una natural join per ottenere la composizione iniziale, questa proprietà della decomposizione si chiama loss-less joins
Definizione:
- Dato uno schema con un insieme di dipendenze funzionali,
- una sua decomposizione si dice che preserva i dati se per ogni relazione di che soddisfa tutte le dipendenze di si ha: Osservazioni: siano
- ed come sopra
- e sia allora
- è sempre vero
- non è sempre vero
Esempio

Per controllare se una decomposizione preserva i dati facciamo in questo modo:
Esempio:
Sappiamo che questo metodo è valido per la seguente dimostrazione:

Decomposizioni che conservano le dipendenze funzionali
Conservazione delle dipendenze
La proiezione di su un insieme di attributi è l’insieme delle dipendenze Y appartenenti a tali che
Algoritmo per il calcolo della proiezione di un insieme di dipendenze

Conservazione delle dipendenze II
Dato uno schema relazionale ed una sua decomposizione si dice che essa conserva le dipendenze funzionali se è implicata logicamente dall’unione delle proiezioni
Di seguito l’algoritmo per controllare se una decomposizione preserva le dipendenze funzionali:

Forma normale
Una relazione è detta in forma normale di Boyce-Codd (BCNF) se per ogni dipendenza funzionale definita su di essa, contiene una chiave di , cioè è superchiave per
Terza forma normale
Una relazione è detta in terza forma normale (3NF) se per ogni dipendenza funzionale definita su di essa si ha almeno una delle due seguenti condizioni:
- contiene una chiave di
- appartiene ad almeno una chiave di
Perché scegliamo queste forme normali?
BCNF: lo scopo di questa forma normale è quello di eliminare ridondanze causate dalle dipendenze
3NF:
Lemmi

Decomposizioni che preservano i dati con componenti in BCNF
Input: Schema e dipendenze
Output: Decomposizione che preserva i dati tale che ogni componente sia in BCNF rispetto alla proiezione di su quella componente

Preservazione delle dipendenze e 3NF
Input: con ricoprimento minimale
Output: Una decomposizione di che conserva le dipendenze e tale che ogni suo elemento è in 3NF
