Table of Contents
Relazione
Una relazione è un insieme di attributi legati tra loro da dipendenze funzionali.
Dipendenza funzionale
La dipendenza funzionale implica che ci siano un determinante e un determinato. Se il determinante è uguale in due tuple, anche il determinato deve essere uguale.
Esempio: il codice fiscale determina il numero di telefono, significa che se in due righe contengono lo stesso CF, anche il numero di telefono è uguale.
Chiusura
Combinando più DF è possibile determinare anche le dipendenze non esplicite.
Esempio: R❬(A, B, C), {A→B, B→C}❭ significa "la relazione R ha attributi A, B, C e le dipendenze funzionali A determina B e B determina C. È evidente che A determina - sia pure in maniera indiretta - anche C.
La chiusura di un attributo o di un insieme di attributi rende espliciti tutti gli attributi che sono ricavabili esplicitamente o indirettamente. Si indica con un piccolo segno più dopo l'elenco degli attributi.
Esempio: R❬(A, B, C, D, E), {AB→B, BCD→DE, E→ABCD}❭
- AB+ = {AB}
- con la parte destra della chiusura, quali altri attributi posso determinare? Nessuno, quindi mi fermo.
- BCD+ = {BCD}
- Con BCD posso determinare DE (ma D ce l'ho già), quindi BCD+ = {BCDE}
- Con BCDE posso determinare ABCD, quindi BCD+ = {ABCDE}
- BCD è una superchiave
- E+ = {E}
- E+ = {ABCDE}
- E è una superchiave
Superchiave
Una superchiave è un insieme di attributi che determinano tutti gli attributi.
Chiave
Una chiave è una superchiave minima, cioè una chiave a cui non posso togliere alcun attributo mantenendola chiave.
Esempio: R❬(A, B, C, D, E), {AB→B, BCD→DE, E→ABCD}❭
ABCD è una superchiave, perché posso determinare tutti gli attributi con questi quattro.
Però se tolgo A ottengo comunque una superchiave, quindi ABCD non è una chiave.
BCD è una superchiave solo se mantengo tutti e tre gli attributi (potrei provarlo calcolando la chiusura di BC, CD e BD e vedendo che non copro tutto l'insieme di attributi), quindi è una chiave.
Terza forma normale (solo algoritmo)
Per comodità mi riferirò al determinante come "parte sinistra" e al determinato come "parte destra", quindi per es. BCD→DE, dove BCD è il determinante e DE il determinato, mi riferirò a BCD chiamandolo "sinistra" e DE con "destra".
- copertura canonica
- semplifico la parte destra
- verifico se posso eliminare attributi a sinistra
- verifico se ci sono DF comprese all'interno di altre DF
- semplifico le DF: se la parte sinistra è identica, raggruppo
- a questo punto creo tante relazioni quante sono le DF
- se una relazione include tutti gli attributi di un'altra, le unisco (massimo comune tra gli attributi e riporto tutte le DF)
- ci sono chiavi di R nelle relazioni che ho creato?
- gli attributi che stanno solo a sinistra sono sicuramente parte di una chiave
- se in nessuna delle relazioni è presente una chiave di R, allora aggiungo un attributo e provo a vedere se così diventa una chiave. Se sì, creo un'ulteriore relazione contenente la chiave
Esempio
R❬(A,B,C,D,E,F,G,H), {DHC→AG, ED→C, BD→EF, C→E}❭
Calcolo delle chiusure:
DHC+
- DHC+ = {CDH}
- DHC+ = {ACDGH}
- DHC+ = {ACDEGH}
- fine
CDH non è superchiave
ED+
- ED+ = {DE}
- ED+ = {CDE}
- fine
ED non è superchiave
BD+
- BD+ = {BD}
- BD+ = {BDEF}
- BD+ = {BCDEF}
- fine
BD non è superchiave
C+
- C+ = {C}
- C+ = {CE}
- fine
C non è superchiave
Semplificazione della parte destra
- DHC→AG
- ED→C
- BD→EF
- C→E
Meccanicamente, diventa:
- DHC→A
- DHC→G
- ED→C
- BD→E
- BD→F
- C→E
Semplificazione della parte sinistra
Se BD determina E e ED determina C, forse possiamo dire che la D in ED→C è ridondante.
Proviamo a calcolare la chiusura di BD cambiando ED→C in E→C:
BD+
- BD+ = {BD}
- BD+ = {BDEF}
- BD+ = {BCDEF}
- fine
non è cambiato niente, quindi possiamo semplificare le DF in:
- DHC→A
- DHC→G
- E→C
- BD→E
- BD→F
- C→E
Verifico che non ci siano DF comprese in altre: non ce ne sono
Creo le relazioni in 3nf:
R1: ❬(ACDGH), {CDH→AG}❭
R2: ❬(CE), {E→C, C→E}❭
R3: ❬(BDEF), {BD→EF}❭
In una delle relazioni è presente una chiave? No.
Devo scoprire qual è una chiave e creare una relazione con quella.
BDH compaiono solo a sinistra, quindi fanno sicuramente parte della chiave. Calcoliamo la chiusura di BDH:
BDH+
- BDH+ = {BDH}
- BDH+ = {BDEFH}
- BDH+ = {BCDEFH}
- BDH+ = {ABCDEFGH}
- fine
BDH è chiave.
R4: ❬(BDH)❭