bisogna affrontare il problema di come ottenere una decomposizone che soddisfi le nostre condizioni.
è sempre possibile ottenerla?
sì. dato uno schema su cui è definito un insieme di dipendenze funzionali , è sempre possibile decomporlo in modo da ottenere che:
- ogni sottoschema è 3NF
- la decomposizione preserva le dipendenze funzionali
- è possibile ricostruire ogni istanza legale dello schema originale tramite join naturale
attenzione
- la decomposizione che si ottiene dall’algoritmo non è l’unica possibile che soddisfi le condizioni richieste
- lo stesso algoritmo, a seconda dell’input di partenza, può fornire risultati diversi ma tutti corretti
- potrebbe essere possibile che una decomposizione non sia stata generata dall’algoritmo
copertura minimale
- ci serve introdurre il concetto di copertura minimale, che servirà da input all’algoritmo di decomposizione
- dato un insieme di dipendenze funzionali , possono esserci più coperture minimali equivalenti (cioè con la stessa chiusura, uguale a quella di ).
definizione
Sia un insieme di dipendenze funzionali. Una copertura minimale di è un insieme di dipendenze funzionali equivalente a tale che:
- per ogni dipendenza funzionale in , la parte destra è un singleton - (ogni attributo nella parte destra è non ridondante)
- per nessuna dipendenza funzionale esiste tale che - (ogni attributo nella parte sinistra non è ridondante) (quindi, se elimino la dipendenza , non “recupero” ciò che essa determina attraverso )
- per nessuna dipendenza funzionale , - (ogni dipendenza non è ridondante)
riformulato in modo più informale:
- i dipendenti devono essere singleton
- può trovarsi nella copertura minimale solo se nella chiusura di e di non si trova (in caso contrario viene sostituito da o )
- posso eliminare una dipendenza se è possibile ricostruirla in tramite altre dipendenze
come si calcola
Per ogni insieme di dipendenze funzionali esiste una copertura minimale equivalente ad che si può ottenere in tempo polinomiale in tre passi:
- usando la decomposizione, le parti destre delle dipendenze vengono ridotte a singleton
- si rendono le parti sinistre non ridondanti:
- se si trova tale che , viene sostituita con o, se appartiene già a , viene direttamente eliminata
- durante questo passo, è inutile ricalcolare le chiusure per gli attributi per cui sono già state calcolate
passo 2: osservazione
Chiamiamo l’insieme originale, e con . Voglio verificare se , ovvero .
I due insiemi differiscono per una sola dipendenza, quindi basta verificare e .
Non ci serve tuttavia mostrare , perchè:
- (riflessività)
- per transitività con , otteniamo
Per verificare se , dobbiamo verificare (lemma 1) - lo facciamo con l’algoritmo per il calcolo della chiusura di un attributo.
- , devo verificare che
- al contrario del passo 2, in questo caso le chiusure degli attributi vanno ricalcolate
- se , ma non esiste un’altra dipendenza con , è inutile provare a eliminare , in quanto non saremmo più in grado di determinare .
passo 3: osservazione
Chiamiamo l’insieme che contiene e . Anche in questo caso i due insiemi differiscono per una sola dipendenza. Abbiamo anzi addirittura , e quindi .
Resta da verificare , ovvero (lemma 2) . In particolare, basta verificare (l’unica non comune ai due insiemi), ovvero (lemma 1)
esempi
esempio 1
passo 1 riduciamo le parti destre a singleton
passo 2 dobbiamo verificare se ci sono ridondanze nelle parti sinistre.
- cominciamo da , e verifichiamo se , ovvero se
- non ci sono dipendenze che hanno a sinistra solo , quindi .
- stesso discorso per ,
- la stessa cosa vale per e .
- proviamo a ridurre .
- nell’insieme di dipendenze esiste , quindi possiamo eliminare ma anche tutta la dipendenza risultante, che sarebbe uguale a .
a fine passo abbiamo quindi che diventa il nostro
passo 3 vediamo se il nostro nuovo contiene dipendenze ridondanti
- come prima cosa notiamo che viene determinato solo da , e la stessa cosa vale per .
- proviamo a eliminare .
- la chiusura di per il nuovo insieme di prova è , quindi la dipendenza deve rimanere
- proviamo ad eliminare . - compare, quindi possiamo eliminare la dipendenza (perché otterremmo in un altro modo)
quindi, la copertura minimale di è
esempio 2
passo 1
passo 2
- possiamo sicuramente eliminare , perché in abbiamo
- passiamo a - dobbiamo vedere se o
- le chiusure sono: , e
- notiamo che avremmo potuto direttamente dire solo che è determinato funzionalmente solo da , quindi sappiamo che non sarà nella chiusura di nessun attributo
- passiamo a - abbiamo già calcolato le chiusure di e (e non è cambiato, ma altrimenti sarebbe comunque un insieme equivalente), e si trova in entrambe
attenzione e non sono in , quindi non possiamo semplicemente eliminare - dobbiamo sostituirla con una delle due
in questo caso, le dipendenze
- scegliamo quindi per esempio
- abbiamo quindi:
- continuiamo con
- abbiamo già calcolato le chiusure di e , e in nessuna delle due è presente , quindi non possiamo eliminare elementi a sinistra
passo 3
- non possiamo toccare la dipendenza , perché è determinato unicamente da quella dipendenza
- proviamo con → la chiusura di è , quindi deve rimanere
- proviamo con → , quindi deve rimanere
- proviamo con → , quindi deve rimanere
- proviamo con → , quindi deve rimanere
- proviamo con → la chiusura di rispetto al nuovo schema è - compare, quindi la dipendenza può essere eliminata
la copertura minimale di è quindi:
domande orale
possibili domande orale
- come si calcola una copertura minimale?
- la copertura minimale è unica?