bisogna formalizzare il concetto di decomposizione che preserva un insieme di dipendenze funzionali.
definizione di decomposizione
Sia uno schema di relazione. Una decomposizione di è una famiglia di sottoinsiemi di che ricopre , ovvero:
- essenzialmente, decomporre significa definire dei sottoschemi che contengono ognuno un sottoinsieme degli attributi di .
La proiezione di su un certo elemento contiene:
- le dipendenze funzionali di la cui unione di determinante e determinato fa parte di (quindi le dipendenze con elementi in )
Visto che due insiemi di dipendenze si possono scambiare quando hanno la stessa chiusura, una decomposizione preserva se la chiusura di è uguale alla chiusura dell’insieme .
equivalenza tra due insiemi di dipendenze funzionali
Siano e due insiemi di dipendenze funzionali. e sono equivalenti se .
- ovvero non sono uguali ma hanno la stessa chiusura.
lemma 2
Siano e due insiemi di dipendenze funzionali. .
dimostrazione
Sia (una dipendenza di che non compare in ).
- noi sappiamo che ogni dipendenza funzionale in è derivabile da mediante gli assiomi di Armstrong (perché , e , quindi le dipendenze di sono dipendenze di )
- anche (e quindi ) è derivabile da tramite gli assiomi di Armstrong.
- quindi, si ha
- (ottengo da mediante Armstrong e poi, sempre mediante Armstrong, anche .)
- Il punto cruciale è che, applicando solo gli assiomi di Armstrong su un sottoinsieme di , non “esco” mai da
- quindi, è derivabile da con gli assiomi di Armstrong, e
preservare le dipendenze
definizione
Sia uno schema di relazione, un insieme di dipendenze funzionali su , e una decomposizione di . Diciamo che preserva se: dove
- ogni è un insieme di dipendenze funzionali dato dalla proiezione di su
- proiettare un insieme di dipendenze su un sottoschema significa prendere tutte e sole le dipendenze in che hanno tutti gli attributi in
verifica
Supponiamo di avere una decomposizione e voler verificare se preserva le dipendenze funzionali. Questo corrisponde a verificare che , ovvero che e che .
utilità del lemma 2 per la verifica
Grazie al lemma 2, per verificare che mi basta verificare che e che .
La verifica di è superflua, perché tutti gli elementi di sono necessariamente in
- (infatti è definito come l’unione della proiezione di sulle varie decomposizioni, quindi l’unione di tutte le dipendenze di che hanno determinante e dipendente in → è possibile che in non ci siano alcune dipendenze di , ma non il contrario)
Quindi, bisogna solo verificare che .
Grazie al lemma 1, mi basta verificare che
Si può fare con l’algoritmo che segue:
- basta verificare che una sola dipendenza non appartiene alla chiusura di G per affermare che l’equivalenza non sussiste
algoritmo
- input - due insiemi , di dipendenze funzionali su
- output - la variabile
successo
, che indica se
- se , allora per il lemma, ovvero per il Teorema
basta fare i controlli solo per le dipendenze “a cavallo” - quelle che hanno sia determinante che dipendente in una decomposizione sono rispettate per forza
Nasce un problema: come calcoliamo ? Potremmo usare l’algoritmo per il calcolo della chiusura di un insieme di attributi, ma dovremmo prima calcolare , e quindi , il che richiederebbe tempo esponenziale.
Per questo, esiste un algoritmo:
calcolo della chiusura di X rispetto a G a partire da F
- input - uno schema , un insieme di dipendenze funzionali su , una decomposizione , un sottoinsieme di .
- output - la chiusura di rispetto a
- partendo da un sottoinsieme di attributi di , per prima cosa definiamo come stesso per riflessività.
- dopodiché, ad ogni iterazione:
fa:
- prima l’interzezione tra e , per considerare solo gli elementi di che riguardano quello specifico sottoinsieme
- poi la chiusura di quell’intersezione rispetto ad , per trovare tutti gli attributi che ci interessano (tutti quelli determinati da dipendenze in )
- dopodiché l’intersezione con , perché dobbiamo tenere solo gli attributi che sono effettivamente in (per la questione dipendenze con det e dip in )
- e infine l’unione con l’accumulatore , dove salviamo questo passo fatto per tutti i sottoinsiemi
- nota: ad ogni iterazione (prima dell’unione con ), potremo ottenere massimo stesso (per l’intersezione con )
- ho trovato quindi la chiusura rispetto a ogni singolo , e quindi rispetto a
- quindi, avremo gli attributi che dipendono funzionalmente da , anche se appartengono a sottoschemi in cui non è incluso - perché dipendono da attributi che si trovano nello stesso sottoschema di e dipendono da , e anche in altri sottoschemi
esempio inventato del passo cruciale
cerchiamo
- il passo prima dell’unione con :
- trovo
- poi aggiungo a
(anche qui il latex dell’algoritmo rubato a flavio, che si diverte a fare queste cose)
dimostrazione
dimostrare che l’algoritmo funziona significa mostrare che, alla fine dell’algoritmo, conterrà tutta e sola la chiusura di rispetto a . Quindi, che .
Dimostriamo solo .
ricordiamo:
- , con
- (passo fondamentale dell’algoritmo)
Si dimostra per induzione sui ()
- caso base (): , e , quindi
- ipotesi induttiva:
passo induttivo: Sia (aggiunto all’ultimo passo). Se è stato aggiunto, vuol dire che deve esistere un sottoschema della decomposizione tale che: , ovvero .
Abbiamo quindi:
- (per il lemma 1 e teorema ).
Sappiamo che , ma anche . Notiamo quindi che la dipendenza ha sia determinante che dipendente in un sottoschema , e quindi, per definizione di , appartiene a e, per costruzione di , appartiene a .
- quindi
In più, , e, per ipotesi induttiva . Quindi si ha (decomposizione) e, per il lemma 1, . Per transitività, da , si ha , cioè (l.1) .
abbiamo quindi dimostrato che , ovvero
domande orale
possibili domande
- cosa vuol dire che una decomposizione preserva un insieme di dipendenze?
- dimostrazione Lemma 2
- (forse) quali dipendenze bisogna controllare e quali no per l’algoritmo?
- dimostrazione calcolo di a partire da