Una decomposizione con lossless join garantisce che non vengono generate tuple spurie applicando un’operazione di NATURAL JOIN
alle relazioni nella decomposizione
<aside> <img src="/icons/exclamation-mark_purple.svg" alt="/icons/exclamation-mark_purple.svg" width="40px" />
Una decomposizione $D=\{R_1,..,R_m\}$ di $R$ ha la proprietà di lossless join rispetto all’insieme di dipendenze di $F$ su $R$ se per ogni stato di relazione $r$ di $R$ che soddisfa $F$ vale $^*(\Pi_{R_1}(r),..,\Pi_{R_m}(r)) = r$
</aside>
<aside> <img src="/icons/thought-alert_purple.svg" alt="/icons/thought-alert_purple.svg" width="40px" />
creare una matrice $S$ con una riga $i$ per ogni relazione $R_i$ nella decomposizione $D$ e una colonna $j$ per ogni attributo $A_j$ in $R$
porre $S(i,j) = b_{ij}$ per tutte le entrate della matrice
per ogni riga $i$ che rappresenta lo schema di relazione $R_i$
per ogni colonna $j$ che rappresenta l’attributo $A_j$
se $R_i$ include l’attributo $A_j$
allora porre $S(i,j) =a_j$
ripetere quanto segue finché l’esecuzione del ciclo non modifica più $S$
per ogni dipendenza funzionale $X \\to Y$ in $F$
per tutte le righe in $S$ che hanno gli stessi simboli nelle colonne corrispondenti agli attributi in $X$
rendere uguali i simboli in ogni colonna che corrispondono ad un attributo in $Y$ come segue
se una riga ha un simbolo $a$ nella colonna, porre le altre righe allo stesso simbolo $a$ nella colonna
se non esiste in nessuna riga un simbolo $a$ per l’attributo, scegliere uno dei simboli $b$ che appaiono in una delle righe e porre le altre righe a quel simbolo $b$ nella colonna
se una riga contiene solo simboli $a$
allora la decomposizione ha la proprietà di lossless join
altrimenti no
</aside>
Una decomposizione $D= \{R_1,R_2\}$ di $R$ ha la proprietà di lossless join rispetto a un insieme di dipendenze funzionali $F$ su $R$ se e solo se:
Se una decomposizione $D=\{R_1,..,R_m\}$ di $R$ ha la proprietà LJ rispetto a un insieme di FD $F$ su $R$, se se una decomposizione $D_1 = \{Q_1,..,Q_k\}$ di $R_i$ ha la proprietà LJ rispetto alla proiezione di $F$ su $R_i$, allora la decomposizione $D_2 =\{R_1,..,R_{i-1},Q_1,..,Q_k,R_{i+1},..,R_m\}$ di $R$ ha la priprietà LJ rispetto a $F$
<aside> <img src="/icons/thought-alert_purple.svg" alt="/icons/thought-alert_purple.svg" width="40px" />
porre $D:=R$
finché c’è uno schema di relazione $Q$ in $D$ che non è in BCNF
{
si scelga uno schema di relazione $Q$ in $D$ che non sia in BCNF
si trovi una dipendenza funzionale $X \to Y$ che violi BCNF
si sostituisca $Q$ in $D$ con due schemi di relazione $(Q\backslash Y)$ e $(X \cup Y)$
}
</aside>
<aside> <img src="/icons/thought-alert_purple.svg" alt="/icons/thought-alert_purple.svg" width="40px" />
<aside> <img src="/icons/thought-alert_purple.svg" alt="/icons/thought-alert_purple.svg" width="40px" />
porre $K := R$
per ogni attributo $A$ in $K$
{
calcolare $(K \backslash A)^+$ rispetto all’insieme di FD
se $(K\backslash A)^+$ contiene tutti gli attributi in $R$
allora $K =K \backslash \{A\}$
}
</aside>
Nessun valore null è ammesso per gli attributi di join