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 :

center

Con i sottoschemi , , si decompone in:

center

(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:

center

teorema

Sia uno schema di relazioni e . Per ogni istanza legale di e per il “suo” si ha:

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

esempio

dati e dire se la decomposizione ha un join senza perdite

center

prima iterazione: center

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: center

  • è già soddisfatta
  • : prima, seconda e quarta riga coincidono su , quindi cambiamo e in
  • è già soddisfatta

terza iterazione (fine): center

  • 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:

center

Quindi ogni proiezione della tabella su un sottoschema avrà una tupla di tutte ‘a’ (la riga che corrisponde a .)

per esempio, proiezione su :

center

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