Se si decompone uno schema di relazione , si vuole che la decomposizione ottenuta sia tale che che ogni istanza legale di sia ricostruibile mediante join naturale da un’istanza legale dello schema decomposto .
definizione
Sia uno schema di relazione. Una decomposizione di ha un join senza perdita se per ogni istanza legale di si ha:
introduciamo
definiamo
join naturale delle proiezioni dei sottoschemi su (che deve quindi essere uguale a stessa)
in pratica
Dato uno schema , un sottoschema è un suo sottoinsieme (es. ). La proiezione di un’istanza legale su un sottoschema prende ogni tupla di e mantiene solo gli attributi che appartengono a .
Per esempio, se ho con le dipendenze funzionali con quest’istanza legale :
Con i sottoschemi , , si decompone in:
(le tuple manterranno solo gli attributi di )
(nella proiezione su , si “perde” una tupla perché risulta duplicata).
In questo caso, effettuando il join delle due decomposizioni, non otteniamo l’istanza legale di partenza:
teorema
Sia uno schema di relazioni e . Per ogni istanza legale di e per il “suo” si ha:
- - non serve dimostrarlo perché non potrà mai contenere istanze in meno, quindi al minimo è
-
- deriva da (1)
- : per ogni tupla ne esiste un’altra tale che (altrimenti non avremmo in e quindi nel join)
(dimostrazioni non richieste per l’orale)
verifica
esiste un algoritmo che permette di verificare se una decomposizione data ha un join senza perdita in tempo polinomiale:
- input: uno schema di relazione , un insieme di dipendenze funzionali su , una decomposizione
- output: decide se ha un join senza perdita
quando finisce l’algoritmo, o:
- sono arrivato alla fine e non posso più cambiare cose (è un’istanza legale)
- mi fermo in anticipo - le a non possono diventare b, e ho trovato una tupla di tutte a (so già che l’istanza diventerà legale alla fine dell’algoritmo, e posso fermarmi perché non ho perdite)
spieghiamo meglio
- costruiamo una tabella in modo da evere un numero di colonne pari al numero di attributi in e un numero di righe pari al numero di sottoschemi nella decomposizione
- nelle celle ad indice per le righe e per le colonne, inseriamo se l’attributo della colonna appartiene al sottoschema della riga - altrimenti inseriamo
- adesso, per ogni dipendenza , controlliamo se nella tabelle i sono tuple che non rispettano la dipendenza (ovvero e ) - le “facciamo diventare legali”: se in una tupla è presente una nell’attributo , la propaghiamo a tutte le altre, altrimenti scegliamo un a piacere e lo propaghiamo su tutte le altre (due attributi sono uguali se hanno entrambi o una con lo stesso pedice)
esempio
dati e dire se la decomposizione ha un join senza perdite
prima iterazione:
in ordine rispetto alle dipendenze funzionali:
- : la prima e la terza riga coincidono su - cambiamo in in modo che la dipendenza funzionale sia soddisfatta
- è già soddisfatta
- : nelle prime quattro righe, , quindi cambiamo , , in
seconda iterazione:
- è già soddisfatta
- : prima, seconda e quarta riga coincidono su , quindi cambiamo e in
- è già soddisfatta
terza iterazione (fine):
- non c’è più nulla da cambiare quindi l’algoritmo termina.
Bisogna verificare se c’è una tupla con tutte - non c’è, quindi il join non è senza perdita.
teorema
Sia uno schema di relazione, un insieme di dipendenze funzionali su e una decomposizione di . L’algoritmo di verifica decide correttamente se ha un join senza perdita.
dimostrazione
Occorre dimostrare che ha un join senza perdita (ovvero per ogni legale) quando l’algoritmo termina, la tabella ha una tupla con tutte ‘a’.
Si dimostra solo la parte “join senza perdita tupla con tutte ‘a’“.
Supponiamo per assurdo che abbia un join senza perdita e che al termine dell’algoritmo la tabella non abbia una tupla con tutte ‘a’. La tabella (finale) può essere interpretata come un’istanza legale di , in quanto al termine dell’algoritmo non ci sono violazioni di dipendenze in .
La tabella iniziale contiene ‘a’ in ogni riga per gli attributi che appartengono al sottoschema a cui fa riferimento quella riga.
esempio:
Quindi ogni proiezione della tabella su un sottoschema avrà una tupla di tutte ‘a’ (la riga che corrisponde a .)
per esempio, proiezione su :
Quando si fa il join naturale tra due proiezioni ed (con le loro tuple con tutte ‘a’ che chiamiamo e ), ci sono due casi:
- o e condividono (almeno) un attributo ⇒ sappiamo che e avranno lo stesso valore su quell’attributo (‘a’), e quindi saranno unite, formando un’unica tupla con tutte ‘a’
- o le due proiezioni non hanno attributi in comune ⇒ in questo caso il join naturale degenererà in prodotto cartesiano, e tutte le tuple di e saranno unite (quindi anche e )
In entrambi casi, il join naturale ci porterà ad unire e e ad avere una tupla con tutte ‘a’.
Visto che è il join naturale di tutte le proiezioni, esso contiene quindi sicuramente una tupla con tutte ‘a’. L’ipotesi di partenza, per cui abbiamo un join senza perdita ci impone che , contraddicendo quindi la supposizione per cui non ha tuple con tutte ‘a’.
Abbiamo quindi dimostrato che “join senza perdita tupla con tutte ‘a‘“.
domande orale
possibili domande orale
- come definiamo ?
- quando una decomposizione ha join senza perdita?
- teorema su
- dimostrazione join senza perdita riga con tutte a