Dipendenze funzionali e normalizzazione - BCNF e terza forma normale
In questa pagina 5
Uno schema relazionale (Modello relazionale - relazioni, chiavi e vincoliIl modello relazionale (Codd, IBM, 1970) rappresenta i dati con relazioni, cioè tabelle, ed è basato su valori: i legami tra relazioni sono confronti di valori, non puntatori, il che garantisce indipendenza dalle strutture fisiche, portabilità e bidirezionalità. Una relazione matematica è un sottoinsieme del prodotto cartesiano di n domini (insieme di n-uple ordinate, senza duplicati né ordine tra le righe); una relazione del modello è un insieme di tuple, funzioni dagli attributi ai valori del dominio, quindi non posizionale. Si distinguono schema di relazione e istanza, schema di base di dati (relazioni più vincoli) e istanza. NULL è un valore speciale fuori da ogni dominio. I vincoli di integrità sono intra-relazionali (di dominio, di tupla, di chiave) e inter-relazionali (integrità referenziale, con la chiave esterna). Superchiave: insieme di attributi che non ripete mai i valori; chiave: superchiave minimale; ogni relazione ne ha almeno una (tutti gli attributi); la chiave primaria è una chiave scelta, senza NULL.Modello relazionale - relazioni, chiavi e vincoli →) può essere logicamente corretto ma di cattiva qualità: informazioni duplicate, aggiornamenti che richiedono molte modifiche, ricostruzioni sbagliate. La normalizzazione è il processo che analizza uno schema in base alle dipendenze funzionali e alle chiavi per minimizzare ridondanza, anomalie di aggiornamento e dati spuri. Si usa soprattutto quando lo schema è stato disegnato senza passare dall'ER: uno schema ER ben ristrutturato e tradotto (Ristrutturazione dello schema ER e traduzione nel modello relazionaleLa progettazione logica ha due passi. 1) Ristrutturazione dello schema ER, per togliere i costrutti che il modello relazionale non esprime: analisi delle ridondanze (attributi derivati e cicli di relazioni, decisa con volume dei dati e carico, tabelle di frequenza e accessi), eliminazione degli attributi multivalore (nuova entità), composti (appiattiti o nuova entità), delle IS-A (relazione con partecipazione (1,1) dalla sottoclasse) e delle generalizzazioni (opzione 1 relazioni, 2 accorpamento nel padre con attributo discriminante, 3 accorpamento nei figli, solo se completa e disgiunta), scelta degli identificatori principali (niente cicli di identificazione esterna), riscrittura dei vincoli esterni, partizionamento e accorpamento di entità. 2) Traduzione quasi automatica nel modello relazionale: ogni entità diventa una relazione con la chiave primaria data dall'identificatore principale (anche esterno); una relazione molti-a-molti diventa una relazione con le chiavi delle entità; una uno-a-molti con partecipazione obbligatoria si fonde con l'entità dal lato max 1 con una chiave esterna; con partecipazione opzionale si fonde (NULL) o si crea una relazione a parte; le uno-a-uno si fondono sul lato con partecipazione obbligatoria; le ternarie seguono la stessa logica con le chiavi di tutte le entità.Ristrutturazione dello schema ER e traduzione nel modello relazionale →) di solito è già normalizzato.
Linee guida informali
1. Semantica degli attributi. Una relazione deve essere facile da spiegare: non mescolare attributi di più entità o associazioni.
Schema di partenza (Impiegato, Dipartimento, Progetto):
Impiegato(CF, Nome, DataNascita, Indirizzo, NDip), Dipartimento(NDip, Nome, CFDirettore), Progetto(NProg, Nome, Sede), Lavora(CF, NProg, Ore).
Due relazioni logicamente corrette ma di cattivo disegno: ImpDip(CF, Nome, DataNascita, Indirizzo, NDip, NomeDip, CFDirettore) e ImpProg(CF, NProg, Ore, NomeImp, NomeProg, SedeProg): mescolano concetti di entità diverse.
2. Ridondanza e anomalie di aggiornamento. In ImpDip i dati del dipartimento sono ripetuti per ogni impiegato:
| CF | Nome | NDip | NomeDip | CFDirettore |
|---|---|---|---|---|
| 111 | Rossi | 5 | Ricerca | 333 |
| 222 | Verdi | 5 | Ricerca | 333 |
| 333 | Bianchi | 5 | Ricerca | 333 |
| 444 | Neri | 4 | Amministrazione | 444 |
- Anomalia di inserimento: per inserire un impiegato servono i dati del suo dipartimento, coerenti con quelli già presenti (o NULL se non ne ha uno); è difficile inserire un dipartimento senza impiegati.
- Anomalia di cancellazione: cancellando l'ultimo impiegato del dipartimento 4 (Neri) si perde l'informazione sul dipartimento.
- Anomalia di modifica: cambiando il nome del dipartimento 5 bisogna aggiornare tutte le righe dei suoi impiegati, altrimenti i dati sono incoerenti.
Linea guida: progettare in modo che non ci siano anomalie; se ce ne sono, annotarle e fare in modo che i programmi di aggiornamento operino correttamente.
3. Valori NULL. Se molti attributi non si applicano a tutte le tuple, ci sono molti NULL: sprecano spazio, perdono i diversi significati (non applicabile, sconosciuto, assente), complicano join (interno ed esterno danno risultati diversi) e aggregazioni. Non si vogliono togliere i NULL in assoluto, ma quelli sistematici: evitare attributi che spesso valgono NULL.
4. Niente tuple spurie. Si scompone in modo che le relazioni si possano riunire con join di uguaglianza su chiavi primarie o esterne, senza generare tuple inventate.
Esempio verificato. ImpProg(CF, NProg, Ore, NomeProg, SedeProg, NomeImp) con 5 tuple:
| CF | NProg | Ore | NomeProg | SedeProg | NomeImp |
|---|---|---|---|---|---|
| 123456 | 1 | 32.5 | Prodotto X | Bellaire | Rossi |
| 123456 | 2 | 7.5 | Prodotto Y | Sugarland | Rossi |
| 666884 | 3 | 40.0 | Prodotto Z | Houston | Verdi |
| 453453 | 1 | 20.0 | Prodotto X | Bellaire | Bianchi |
| 453453 | 2 | 20.0 | Prodotto Y | Sugarland | Bianchi |
Si scompone in EmpProj1(CF, NProg, Ore, NomeProg, SedeProg) e EmpLocs(NomeImp, SedeProg) (le sedi dove lavora ogni impiegato, senza ripetizioni): 5 e 5 tuple. Il join naturale su SedeProg, che non è né chiave primaria né esterna, restituisce 9 tuple invece di 5: le 4 in più sono spurie, per esempio (123456, 1, 32.5, Prodotto X, Bellaire, Bianchi): Bianchi lavora a Bellaire, ma al progetto 1 con CF 123456 c'è Rossi. La scomposizione fa perdere informazione. Il controllo è stato eseguito con SQLite (5 tuple, join naturale 9 tuple, 4 spurie).
Forme normali: prerequisiti
Chiavi e attributi primi
Ricordare (Modello relazionale - relazioni, chiavi e vincoliIl modello relazionale (Codd, IBM, 1970) rappresenta i dati con relazioni, cioè tabelle, ed è basato su valori: i legami tra relazioni sono confronti di valori, non puntatori, il che garantisce indipendenza dalle strutture fisiche, portabilità e bidirezionalità. Una relazione matematica è un sottoinsieme del prodotto cartesiano di n domini (insieme di n-uple ordinate, senza duplicati né ordine tra le righe); una relazione del modello è un insieme di tuple, funzioni dagli attributi ai valori del dominio, quindi non posizionale. Si distinguono schema di relazione e istanza, schema di base di dati (relazioni più vincoli) e istanza. NULL è un valore speciale fuori da ogni dominio. I vincoli di integrità sono intra-relazionali (di dominio, di tupla, di chiave) e inter-relazionali (integrità referenziale, con la chiave esterna). Superchiave: insieme di attributi che non ripete mai i valori; chiave: superchiave minimale; ogni relazione ne ha almeno una (tutti gli attributi); la chiave primaria è una chiave scelta, senza NULL.Modello relazionale - relazioni, chiavi e vincoli →): superchiave se per ogni istanza e vale ; chiave = superchiave minimale; ogni chiave è candidata, una è la primaria, le altre secondarie. Un attributo è primo se appartiene a almeno una chiave candidata, non primo altrimenti.
Dipendenza funzionale
Definizione (dipendenza funzionale, FD). Siano insiemi di attributi di . La dipendenza funzionale è un vincolo sulle istanze di : . Si dice che determina funzionalmente .
Osservazioni:
- Le FD sono una proprietà dello schema (della semantica), non di una singola istanza: un'istanza può soddisfarle per caso.
- Se è chiave di , allora per ogni insieme di attributi di .
- non implica .
Esempio (ImpProg): ; ; .
Regole di inferenza
Di solito si specificano le FD ovvie; ne valgono altre, che si ricavano con le regole di Armstrong:
| Regola | Enunciato |
|---|---|
| riflessiva | se allora (dipendenza banale) |
| aumento | |
| transitiva | e |
| decomposizione | e |
| unione | e |
| pseudotransitiva | e |
Chiusura di un insieme di attributi
La chiusura è l'insieme degli attributi determinati da con le FD date. Algoritmo: partire da ; finché esiste una FD con e , aggiungere . è una superchiave se contiene tutti gli attributi di ; una chiave è una superchiave minimale.
Esempio. In ImpProg(CF, NProg, Ore, NomeImp, NomeProg, SedeProg): (non basta). : tutti, quindi {CF, NProg} è una superchiave, minimale (né CF né NProg da soli), quindi è l'unica chiave (calcolo verificato con un breve programma). Trucco: gli attributi che non compaiono mai a destra di una FD devono stare in ogni chiave.
Dipendenza completa e parziale
è completa (full) se nessun attributo si può togliere da mantenendo la dipendenza: . È parziale se con .
Nell'esempio: è completa; è parziale perché già .
Dipendenza transitiva
è transitiva se esiste un insieme che non è chiave né sottoinsieme di una chiave, con e .
In ImpDip(CF, Nome, DataNascita, Indirizzo, NDip, NomeDip, CFDirettore): e , quindi è transitiva tramite NDip (che non è chiave).
Le forme normali
Prima forma normale (1NF)
Definizione (1NF). Il dominio di ogni attributo contiene solo valori atomici (semplici, indivisibili) e il valore di ogni attributo di una tupla è un solo valore.
Storicamente vieta attributi multivalore, composti e loro combinazioni, e relazioni annidate (una tupla contiene una relazione). La rimozione di multivalore e composti nella ristrutturazione dell'ER garantisce già la 1NF.
Multivalore. Dipartimento(NDip, Nome, CFDirettore, Sedi) con Sedi = {Bellaire, Sugarland, Houston} non è in 1NF. Tre strategie:
- togliere Sedi e metterlo in
DeptSedi(NDip, Sede)con la chiave del dipartimento (la migliore); - estendere la chiave a {NDip, Sede}: introduce ridondanza;
- se il numero massimo è noto, usare Sede1, Sede2, Sede3: introduce NULL e rende difficili le interrogazioni.
Relazione annidata. Imp(CF, Nome, Progetti(NProg, Ore)): si sposta la relazione annidata in una nuova relazione con la chiave propagata, Imp(CF, Nome) e ImpProg1(CF, NProg, Ore) (ricorsivamente se più livelli).
Seconda forma normale (2NF)
Definizione (2NF). è in 2NF se è in 1NF e ogni attributo non primo è in dipendenza completa da ogni chiave di . Equivalente: nessun attributo non primo dipende da una parte di una chiave. Se ogni chiave ha un solo attributo, la 2NF è garantita.
ImpProg è in 1NF ma non in 2NF: NomeImp dipende da CF (parte della chiave {CF, NProg}), {NomeProg, SedeProg} da NProg. Si scompone, una relazione per ogni chiave parziale con i suoi dipendenti, mantenendo la relazione con la chiave originale e gli attributi completamente dipendenti:
EP1(CF, NProg, Ore), EP2(CF, NomeImp), EP3(NProg, NomeProg, SedeProg).
Terza forma normale (3NF)
Definizione (3NF). è in 3NF se è in 2NF e nessun attributo non primo è in dipendenza transitiva da una chiave. Intuitivamente: ogni FD con parte sinistra parte di una chiave o non chiave è un problema.
ImpDip è in 2NF (la chiave è CF, un solo attributo) ma non in 3NF per . Si scompone: ED1(CF, Nome, DataNascita, Indirizzo, NDip) e ED2(NDip, NomeDip, CFDirettore), con NDip chiave esterna di ED1 verso ED2.
Definizione equivalente (generale). è in 3NF se per ogni FD non banale si ha: è una superchiave oppure è un attributo primo.
Forma normale di Boyce-Codd (BCNF)
Definizione (BCNF). è in BCNF se per ogni FD non banale di , è una superchiave.
La BCNF è più forte della 3NF (ogni relazione in BCNF è in 3NF): la 3NF tollera una FD con non superchiave se è primo. Succede quando ci sono chiavi candidate sovrapposte.
Esempio. Iscrizione(Studente, Materia, Docente), FD: (ogni studente segue un solo docente per materia) e (ogni docente insegna una materia). Chiavi candidate: {Studente, Materia} e {Studente, Docente}; tutti gli attributi sono primi. È in 3NF (A=Materia è primo), ma non in BCNF perché Docente non è superchiave: la coppia (Docente, Materia) è ripetuta per ogni studente. Scomposizione BCNF: DocMat(Docente, Materia) e StDoc(Studente, Docente). Il join è senza perdita (l'intersezione {Docente} determina Materia, vedi sotto), ma la FD non si può più controllare su una sola relazione: non è conservata.
(Calcolato con il programma: per Iscrizione chiavi {Studente, Docente} e {Studente, Materia}; viola la BCNF ma non la 3NF.)
Riepilogo
| NF | Definizione | Come si ottiene |
|---|---|---|
| 1NF | niente attributi non atomici o relazioni annidate | nuova relazione per ogni attributo non atomico |
| 2NF | nessun non primo dipende da parte di una chiave | scomporre: una relazione per ogni chiave parziale con i suoi dipendenti, tenendo la relazione con la chiave originale |
| 3NF | nessuna dipendenza transitiva di non primi da chiavi | scomporre: relazione con gli attributi non chiave che determinano altri non chiave |
| BCNF | ogni FD non banale ha una superchiave a sinistra | scomporre sulla FD violante |
Scomposizioni e proprietà
Scomponendo in si vuole:
- join senza perdita (lossless): , senza tuple spurie. Condizione per due parti: oppure (l'intersezione è chiave di una delle due);
- conservazione delle dipendenze: ogni FD originale è controllabile su una delle relazioni (altrimenti per controllarla serve un join).
Algoritmo di scomposizione in BCNF. Finché esiste una relazione con una FD che viola la BCNF: si sostituisce con e . Il join è sempre senza perdita; le dipendenze possono andare perse.
Sintesi in 3NF. Dato un insieme minimale di FD (parti destre singole, nessuna parte sinistra riducibile, nessuna FD ridondante): si crea una relazione per ogni FD (raggruppando le FD con lo stesso ), si aggiunge una relazione con una chiave di se nessuna relazione contiene una chiave, si eliminano le relazioni contenute in altre. La 3NF si ottiene sempre con join senza perdita e conservazione delle dipendenze.
Per questo si arriva spesso alla 3NF, e alla BCNF solo se non si perdono dipendenze importanti. Il corso precisa che non serve normalizzare alla forma massima: per le prestazioni si può lasciare una relazione in una forma inferiore (per esempio la 2NF).
Un esercizio completo di normalizzazione, con il confronto con la traduzione dall'ER: Esercizio - Normalizzazione di libri, autori e case editrici (esercizio di normalizzazione).
Domande d'esame
1. Qual è la differenza tra 3NF e BCNF? Fare un esempio di relazione in 3NF ma non in BCNF. Traccia. BCNF: ogni FD non banale ha superchiave a sinistra; 3NF ammette anche che il lato destro sia un attributo primo. Esempio: Iscrizione(Studente, Materia, Docente) con {Studente, Materia}→Docente e Docente→Materia. Chiavi sovrapposte. La BCNF può perdere la FD {Studente, Materia}→Docente.
2. Calcolare la chiusura di un insieme di attributi e usarla per trovare le chiavi. Traccia. aggiunge ripetutamente i lati destri delle FD con lato sinistro contenuto in ; è superchiave se è l'intero schema; chiave = superchiave minimale.
3. Perché la scomposizione di EmpProj su Plocation è sbagliata? Traccia. Si unisce su un attributo che non è chiave: il join dà tuple spurie (9 invece di 5 nell'esempio) e perde informazione; una scomposizione deve essere senza perdita, con intersezione che determina una delle parti.
Versione ripasso
- Linee guida: una relazione per concetto; niente ridondanza (anomalie di inserimento, cancellazione, modifica); pochi NULL sistematici; join su chiavi senza tuple spurie (esempio: 5 tuple, join su SedeProg dà 9, 4 spurie).
- FD : ; proprietà dello schema. Armstrong: riflessiva (), aumento, transitiva; derivate: decomposizione, unione, pseudotransitiva.
- Chiusura : aggiungere i lati destri con lato sinistro in ; superchiave se = tutti. Attributi mai a destra stanno in ogni chiave.
- Primo: in qualche chiave. Completa: nessun attributo di si può togliere; parziale: sì. Transitiva: con non chiave né parte di chiave.
- 1NF: atomici (multivalore → nuova relazione; annidate → relazione con chiave propagata). 2NF: ogni non primo completamente dipendente da ogni chiave. 3NF: niente transitive; equivalente: superchiave o primo. BCNF: sempre superchiave.
- Scomposizione senza perdita se o . BCNF: sempre senza perdita, può perdere FD. 3NF: sempre senza perdita e con FD conservate (sintesi da insieme minimale).
- Errori tipici: unire su un attributo non chiave; confondere parziale e transitiva; dire che 3NF e BCNF coincidono; scomporre senza controllare la perdita; non normalizzare mai per prestazioni.
- Collegamenti: Modello relazionale - relazioni, chiavi e vincoliIl modello relazionale (Codd, IBM, 1970) rappresenta i dati con relazioni, cioè tabelle, ed è basato su valori: i legami tra relazioni sono confronti di valori, non puntatori, il che garantisce indipendenza dalle strutture fisiche, portabilità e bidirezionalità. Una relazione matematica è un sottoinsieme del prodotto cartesiano di n domini (insieme di n-uple ordinate, senza duplicati né ordine tra le righe); una relazione del modello è un insieme di tuple, funzioni dagli attributi ai valori del dominio, quindi non posizionale. Si distinguono schema di relazione e istanza, schema di base di dati (relazioni più vincoli) e istanza. NULL è un valore speciale fuori da ogni dominio. I vincoli di integrità sono intra-relazionali (di dominio, di tupla, di chiave) e inter-relazionali (integrità referenziale, con la chiave esterna). Superchiave: insieme di attributi che non ripete mai i valori; chiave: superchiave minimale; ogni relazione ne ha almeno una (tutti gli attributi); la chiave primaria è una chiave scelta, senza NULL.Modello relazionale - relazioni, chiavi e vincoli →, Ristrutturazione dello schema ER e traduzione nel modello relazionaleLa progettazione logica ha due passi. 1) Ristrutturazione dello schema ER, per togliere i costrutti che il modello relazionale non esprime: analisi delle ridondanze (attributi derivati e cicli di relazioni, decisa con volume dei dati e carico, tabelle di frequenza e accessi), eliminazione degli attributi multivalore (nuova entità), composti (appiattiti o nuova entità), delle IS-A (relazione con partecipazione (1,1) dalla sottoclasse) e delle generalizzazioni (opzione 1 relazioni, 2 accorpamento nel padre con attributo discriminante, 3 accorpamento nei figli, solo se completa e disgiunta), scelta degli identificatori principali (niente cicli di identificazione esterna), riscrittura dei vincoli esterni, partizionamento e accorpamento di entità. 2) Traduzione quasi automatica nel modello relazionale: ogni entità diventa una relazione con la chiave primaria data dall'identificatore principale (anche esterno); una relazione molti-a-molti diventa una relazione con le chiavi delle entità; una uno-a-molti con partecipazione obbligatoria si fonde con l'entità dal lato max 1 con una chiave esterna; con partecipazione opzionale si fonde (NULL) o si crea una relazione a parte; le uno-a-uno si fondono sul lato con partecipazione obbligatoria; le ternarie seguono la stessa logica con le chiavi di tutte le entità.Ristrutturazione dello schema ER e traduzione nel modello relazionale →. Linee guida e anomalie.
| Linea guida | Violazione tipica |
|---|---|
| 1 semantica chiara | relazioni che mescolano concetti (ImpDip, ImpProg) |
| 2 niente anomalie | inserimento (dati del dipartimento coerenti), cancellazione (si perde il dipartimento), modifica (tante righe) |
| 3 pochi NULL sistematici | attributi quasi sempre NULL |
| 4 niente tuple spurie | join su un attributo non chiave: ImpProg scomposta su SedeProg dà 9 tuple invece di 5 |
Regole e algoritmi.
- Armstrong: riflessiva (), aumento (), transitiva (); derivate decomposizione, unione, pseudotransitiva.
- Chiusura : parti da , aggiungi se con ; superchiave se . Esempio ImpProg: ; = tutti, chiave.
- Completa/parziale/transitiva: completa; parziale; transitiva.
| Forma | Condizione | Rimedio |
|---|---|---|
| 1NF | attributi atomici, niente relazioni annidate | multivalore → relazione a parte con la chiave |
| 2NF | niente dipendenze parziali di non primi | una relazione per ogni chiave parziale |
| 3NF | superchiave oppure primo | scomporre la transitiva |
| BCNF | sempre superchiave | scomporre sulla FD violante |
- Esempio 3NF non BCNF: Iscrizione(Studente, Materia, Docente) con {Studente, Materia}→Docente e Docente→Materia; chiavi {Studente, Materia} e {Studente, Docente}; scomposizione DocMat(Docente, Materia), StDoc(Studente, Docente) senza perdita ma con FD persa.
- Join senza perdita: oppure . BCNF: , , sempre senza perdita, FD a rischio. 3NF: sintesi da insieme minimale, sempre senza perdita e con FD conservate.
- 1NF in tre modi (Dipartimento con Sedi): relazione a parte (migliore), chiave estesa (ridondanza), colonne Sede1..SedeN (NULL).
- Pratica: per prestazioni si può restare in 2NF; uno schema ER ben tradotto è già normalizzato.
- Anomalie in una riga: inserimento (servono dati coerenti del dipartimento), cancellazione (si perde l'ultimo impiegato e il dipartimento), modifica (tante righe da aggiornare).
- Primo e non primo: un attributo è primo se sta in almeno una chiave candidata; 2NF e 3NF riguardano solo i non primi, la BCNF anche i primi.