Regole di inferenza fondamentali


Algoritmo di copertura minimale

<aside> <img src="/icons/thought-alert_purple.svg" alt="/icons/thought-alert_purple.svg" width="40px" />

  1. porre $G := F$

  2. rimpiazzare ogni dipendenza funzionale $X \to \{A_1,..,A_n\}$ in $G$ con $n$ dipendenze funzionali $X \to A_1,..,X\to A_n$

  3. per ogni dipendenza funzionale $X\to A$ in $G$

      per ogni attributo $B$ che è un elemento di $X$
    

    {

    se $\{\{G \backslash\{X \to A\}\} \cup \{(X \backslash \{B\}) \to A\}\}$ è equivalente a $G$

    allora sostituire $X \to A$ con $(X \backslash\{B\}) \to A$ in $G$

    }

  4. per ogni dipendenza funzionale rimanente $X \to A$ in $G$

    {

    se $\{G \backslash\{X\to A\}\}$ è equivalente a $G$

    allora rimuovere $X\to A$ da $G$

    }

</aside>


Test della proprietà di LJ

<aside> <img src="/icons/thought-alert_purple.svg" alt="/icons/thought-alert_purple.svg" width="40px" />

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

  2. porre $S(i,j) = b_{ij}$ per tutte le entrate della matrice

  3. 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$
    
  4. 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

  5. se una riga contiene solo simboli $a$

    allora la decomposizione ha la proprietà di lossless join

    altrimenti no

</aside>


Algoritmo di decomposizione LJ e dependency preserving in 3NF

<aside> <img src="/icons/thought-alert_purple.svg" alt="/icons/thought-alert_purple.svg" width="40px" />

  1. trovare una copertura minimale $G$ per $F$
  2. per ogni parte sinistra $X$ di una FD in $G$, creare uno schema di relazione in $D$ con attributi $\{X \cup A_1 \cup ..\cup A_m\}$ dove $X \to A_1,..,X\to A_m$ sono le sole dipendenze in $G$ aventi $X$ come parte sinistra
  3. se nessuno degli schemi di relazione in $D$ contiene una chiave di $R$, creare un altro schema di relazione che contiene attributi che formano una chiave per $R$ </aside>

Trovare una chiave $K$ di $R$

<aside> <img src="/icons/thought-alert_purple.svg" alt="/icons/thought-alert_purple.svg" width="40px" />

  1. porre $K := R$

  2. 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>