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:

  1. usando la decomposizione, le parti destre delle dipendenze vengono ridotte a singleton
  2. 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.

  1. , 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

domande orale

possibili domande orale

  • come si calcola una copertura minimale?
  • la copertura minimale è unica?