Dato uno schema di relazione e un insieme di dipendenze funzionali su esiste sempre una decomposizione di che rispetta i criteri di una buona decomposizione in 3NF, cioè:
- ogni è in 3NF,
- preserva ,
- ha un join naturale senza perdita.
Tale decomposizione può essere calcolata in tempo polinomiale con un algoritmo che riceve in input una qualunque copertura minimale di , che definiamo .
Input: , .
Output: .
- for in : (questa parte serve a selezionare nell‘“accumulatore” tutte le dipendenze funzionali non coinvolte in nessuna dipendenza funzionale in )
- if non è coinvolto in nessuna dipendenza funzionale in :
- if non è coinvolto in nessuna dipendenza funzionale in :
- if : (questa parte rimuove tutti gli attributi di da , inizializzando la decomposizione a )
- if esiste che coinvolge tutti gli attributi in :
- else:
- for in :
- for in :
Esempio
Dato e
Verifica che è una chiave per .
- deve determinare funzionalmente tutto lo schema: vero, perché la chiusura di coincide con .
- Nessun sottoinsieme di deve determinare funzionalmente l’intero schema: vero, perché considerando che la chiave deve avere sicuramente , e non coincidono con .
Sapendo che è l’unica chiave per , verifica che non è in 3NF.
Esistono le dipendenze parziali e , quindi non può essere in 3NF.
Trova una copertura minimale di .
Primo passo: decomporre i determinati in singleton
Secondo passo: rimuovere gli attributi superflui dei determinanti:
- : , quindi . Nessun attributo è ridondante.
- : , quindi . Nessun attributo è ridondante.
- : È atomica, quindi nessun attributo può essere rimosso.
- : , quindi . Nessun attributo è ridondante.
- : , quindi (perché esiste in ). è ridondante, quindi possiamo ridurre la dipendenza a , che esiste già in .
Terzo passo: rimuovere le dipendenze ridondanti:
- Rimuovendo si altererebbe , quindi la dipendenza non è ridondante.
- Rimuovendo si altererebbe , quindi la dipendenza non è ridondante.
- Rimuovendo si altererebbe , quindi la dipendenza non è ridondante.
- Rimuovendo non si altererebbe , quindi la dipendenza è ridondante (tra l’altro è ottenuta per transitività da )
Trova una decomposizione di tale che preserva e ogni schema in è in 3NF.
Iniziamo l’algoritmo: per prima cosa . Non ci sono dipendenze che coinvolgono tutti gli attributi dello schema, quindi eseguiamo l’istruzione 5. dell’algoritmo, ottenendo .
Trova una decomposizione di tale che preserva e ogni schema in è in 3NF.
per avere una decomposizione con join senza perdita, aggiungiamo alla decomposizione precedente un sottoschema che contenga la chiave (che non è già contenuta in alcuno degli schemi ottenuti)
Dimostrazione della correttezza dell’algoritmo
todo pag. 5 pdf 19