Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
senza perdita
Parte del materiale è tratto dal materiale preparato dalla prof.ssa Moscarini per il canale A-L
Cosa significa
join senza perdita
Quando uno schema di relazione viene di solito decomposto:
• quando non è in 3NF
• per motivi di efficienza degli accessi
– più piccola è la taglia delle tuple maggiore è il numero che riusciamo a
caricare in memoria nella stessa operazione di lettura
– se le informazioni della tupla non vengono utilizzate dallo stesso tipo di
operazioni nella base di dati meglio decomporre lo schema
– Esempio: lo schema Studente potrebbe essere decomposto separando le
informazioni anagrafiche (CF, Nome, Cognome, DataNascita,
LuogoNascita, ecc.) da quelle accademiche (Matricola, CorsoLaurea,
AnnoCorso, ecc.)
2
Cosa significa
join senza perdita
3
Cosa vogliamo ottenere –
La 3NF non basta
4
Cosa vogliamo ottenere –
La 3NF non basta
• Consideriamo l’istanza legale di R
R A B C
sono veri i due fatti (a1,b1,c1)
a1 b1 c1
e (a2,b1,c2) e non altri
a2 b1 c2
•In base alla decomposizione data, questa istanza si
decompone in
R1 A B R2 B C
a1 b1 b1 c1
a2 b1 b1 c2
5
Cosa vogliamo ottenere –
La 3NF non basta
9
Cosa vogliamo ottenere –
La 3NF non basta
10
Definizione
11
Problema
12
Teorema
Teorema Sia R uno schema di relazione e R1, R2,…, Rk una decomposizione di
R. Per ogni istanza legale r di R, indicato con m(r) R1(r) R2(r) …Rk(r), si
ha:
a)r m(r)
b)Ri(m(r))Ri(r)
c)m(m(r)) m(r).
Dim.
Prova di a). Sia t una tupla di r. Per ogni i, i1,…,k, t[Ri]Ri(r) e quindi tm(r).
• una qualsiasi, quindi vale per ogni tupla di r
• Il sottoinsieme dei suoi valori su attributi di Ri sarà sicuramente in una tupla della
proiezione Ri(r)
• quindi OGNI sottoinsieme dei suoi valori corrispondente ad un elemento della
decomposizione dello schema comparirà in una tupla di un elemento della
decomposizione dell’istanza
• poiché anche la proiezione è un insieme di tuple al più i duplicati corrisponderanno
ad una unica tupla nella proiezione
• Quindi ogni tupla potrà essere ricostruita tramite il join naturale …
• … anzi il join naturale potrebbe ottenere tuple che non erano in r
13
ricomponendo pezzi di tuple diverse!
Digressione
a1 b1 c1
a1 b1 c2
tuple estranee alla realtà di interesse
m(r) R1(r) R2(r) a2 b1 c1
quindi
a2 b1 c2 perdita di informazione (ma non di
tuple!)
a3 b1 c1
a3 b1 c2 rm(r)
Insiemi di tuple
Procediamo provando la doppia inclusione
Prova di b). Ri(m(r))Ri(r)
16
Digressione
R A B C
a1 b1 c1
R A B C
a1 b1 c2
r a1 b1 c1
a2 b1 c1
m(r) R1(r) R2(r) a2 b1 c1
a2 b1 c2
a3 b1 c2
a3 b1 c1
a3 b1 c2
R1 A B
R1(r) a1 b1
A B B C
R R
a2 b1
a1 b1 b1 c1
a3 b1
R1(m(r) a1 b1 R2(m(r) b1 c2
duplicati
= vengono
a2 b1 b1 c1 eliminati
R2 B C
dalla
R2(r) b1 c1
a2 b1 b1 c2 proiezione
a3 b1 b1 c1
b1 c2
17
a3 b1 b1 c2
Teorema
Per b) si ha Ri(m(r))Ri(r).
Pertanto , applicando la definizione dell’operatore m (join delle
proiezioni) avremo
m(m(r))R1(m(r))R2(m(r)) …Rk(m(r))
R1(r) R2(r) …Rk(r)m(r).
18
Digressione
A B C A B C
a1 b1 c1 a1 b1 c1
a1 b1 c2 a1 b1 c2
a2 b1 c2 a2 b1 c2
a3 b1 c1 a3 b1 c1
a3 b1 c2 a3 b1 c2
R1(m(r) a2 b1 R2(m(r) b1 c2
a3 b1
19
Che si fa?
Algoritmo – verifica che una decomposizione abbia del join senza perdita
Input uno schema di relazione R, un insieme F di dipendenze funzionali su R, una
decomposizione R1, R2,…, Rk di R;
Output decide se ha un join senza perdita;
begin
una colonna per ogni attributo di R e una riga per
Costruisci una tabella r nel modo seguente: ogni elemento della decomposizione (sottoschema)
r ha R colonne e righe
all’incrocio dell’i-esima riga e della j-esima colonna metti
il simbolo aj se l’attributo Aj Ri l’attributo Aj fa parte del sottoschema Ri
il simbolo bij altrimenti Indice i = elemento della decomposizione = riga
repeat Indice j = attributo = colonna
for every XYF
do if ci sono due tuple t1 e t2 in r tali che t1[X]t2[X] e t1[Y]t2[Y] gestiamo correttamente
then for every attribute Aj in Y do if t1[Aj]=’aj‘ then t2[Aj]:t1[Aj] anche il caso in cui t2[Aj]=’aj‘
else t1[Aj]:t2 [Aj]
until r ha una riga con tutte ‘a’ or r non è cambiato; anche in questo caso
if r ha una riga con tutte ‘a’ then ha un join senza perdita l’algoritmo termina sempre!
else non ha un join senza perdita occorre poi verificare se 21
in r
c’è la tupla che cerchiamo
end
Osservazioni
23
Osservazioni
25
Teorema: dimostrazione
26
Teorema: dimostrazione
•Parte se
•Per uno sketch della prova della parte “se” consultare il testo
J. D. Ullman, “Principles of database and knowledge-base
systems”, vol. I, Computer Science Press, 1988.
27
Corollario