Normalizzazione di schemi relazionali

Problema generale

La progettazione concettuale e logica produce uno schema relazionale che rappresenta la realtà dei dati nella nostra applicazione, ma alcune volte ci sono delle cose che possono essere ottimizzate, si seguito vedremo delle tecniche che ci permettono di farlo

Ridondanze

Abbiamo la seguente identità: StudenteEsami(Matricola, Nome, Telefono, Corso, Voto) Notiamo subito che ci sono dei problemi:

  • Anomalia di aggiornamento: se il telefono dello studente cambia allora deve essere cambiato in ogni suo esame
  • Anomalia della cancellazione: se vengono annullati gli esami dati non rimane traccia dello studente
  • Anomalia di inserimento: se uno studente non ha ancora dato esami non può essere inserito La soluzione a tutte queste anomalie è decomporre in due relazioni.
Dipendenze funzionali

Una dipendenza funzionale è un particolare vincolo di integrità che esprime legami funzionali tra gli attributi di una relazione

Esempio: prendendo in esame l’entità StudenteEsami descritta prima abbiamo che:

  • Matricola Nome, Telefono
  • Matricola, Corso Voto

Dati:

  • uno schema di relazione
  • e sottoinsiemi di

Diciamo che X implica funzionalmente Y in simboli per ogni relazione dello schema , se due tuple e di coincidono su tutti gli attributi di allora devono anche coincidere su tutti gli attributi di

Notazione: di seguito la notazione

  • attributi
  • insieme di attributi
  • schema di relazione, relazione
  • sta per
  • sta per
  • e stanno per
Definizioni

Soddisfazioni di dipendenze funzionali: diciamo che una relazione soddisfa la dipendenza funzionale se per ogni coppia di tuple e in si ha che:

  • implica

Logica delle dipendenze funzionali:

  • Sia un insieme di dipendenze funzionali per uno schema
  • Sia una dipendenza funzionale. Diciamo che F logicamente implica e si scrive se per ogni relazione r di che soddisfa tutte le dipendenze di , soddisfa anche Esempio:

Chiusura di un insieme di dipendenze funzionali: Dato un insieme di dipendenze funzionali la sua chiusura è l’insieme delle dipendenze funzionali che sono implicate logicamente da in simboli: Chiavi per uno schema con insieme di dipendenze funzionali: Sia:

  • un insieme di dipendenze su
  • sottoinsieme di . Si dice che è una chiave di se:

Commenti:

  • Un istanza di uno schema che rispetti una data dipendenza funzionale viene detta istanza legale
  • Se è una chiave in uno schema allora ogni altro attributo di dipende funzionalmente da
  • Dire che significa asserire che i valori della componente dipendono e da i valori della componente
  • Se non necessariamente risulta anche
Necessità di calcolo logico

Il problema è quello di calcolare la chiusura di un insieme di dipendenze funzionali.

Per fare ciò definiamo un calcolo logico tale che se e soltanto se si può sintatticamente dedurre da nel calcolo logico.

Assiomi di Armstrong

Di seguito i vari assiomi:

  • un universo di attributi
  • Riflessività:
  • Aumento:
  • Transitività:
Deducibilità di dipendenze funzionali

Diciamo che se si può dedurre da applicando un numero finito di volte gli assiomi di Armstrong. Esempio: applicando 2 volte la transitività il risultato dovrà rispetta le due proprietà di seguito:

  • Correttezza: Se allora
  • Completezza: allora Se gli assiomi di Armstrong sono dimostrabili allora siamo in grado di capire se una dipendenza funzionale è valida

Di seguito le dimostrazioni:

Lemmi per derivare le dipendenze funzionali

Regola di decomposizione: Se e allora Regola dell’unione: Se e allora Regola di pseudotransitività: Se e allora Lemma fondamentale: Definiamo e diciamo che

Dimostrazione di completezza

Chiusure, equivalenze e ricoprimenti minimi

Calcolo delle chiusure

Ricordiamo che il calcolo di può essere particolarmente costoso

Ad esempio se allora include per ogni sottoinsieme di . Quindi ha cardinalità almeno .

Invece calcolare è molto più semplice e lo si fa attraverso il seguente algoritmo:

Equivalenze di dipendenze funzionali

Siano insiemi di dipendenze funzionali allora diciamo che sono equivalenti se . La relazione di equivalenza tra insiemi di dipendenze ci permette di capire quando due schemi di relazione rappresentano gli stessi fatti, e si fa usando il seguente algoritmo:

  • Per ogni in controlliamo se essa è in calcolando e controllando se questo implica
  • Viceversa in maniera analoga si può controllare se
Insieme di dipendenze minimali

Un insieme di dipendenze funzionali è minimale se:

  1. Ogni lato destro di una dipendenza è un singolo attributo
  2. Per ogni dipendenza in , non è equivalente a
  3. Per ogni A in e non è equivalente a Dato si dice che è un suo ricoprimento minimale se è minimale ed è equivalente a .

Teorema: Ogni insieme di dipendenze funzionali ha un ricoprimento minimale Dimostrazione:

Decomposizione di uno schema, decomposizioni che preservano i dati

Decomposizione di uno schema

Dato uno schema una sua decomposizione è un insieme di sottoinsiemi di tali che: Esempio:

Preservazione dei dati

Decomporre lo schema iniziale comporta il vantaggio di evitare ridondanze nella rappresentazione. Nel nostro caso specifico basta fare una natural join per ottenere la composizione iniziale, questa proprietà della decomposizione si chiama loss-less joins

Definizione:

  • Dato uno schema con un insieme di dipendenze funzionali,
  • una sua decomposizione si dice che preserva i dati se per ogni relazione di che soddisfa tutte le dipendenze di si ha: Osservazioni: siano
  • ed come sopra
  • e sia allora
  • è sempre vero
  • non è sempre vero Esempio

Per controllare se una decomposizione preserva i dati facciamo in questo modo: Esempio: Sappiamo che questo metodo è valido per la seguente dimostrazione:

Decomposizioni che conservano le dipendenze funzionali

Conservazione delle dipendenze

La proiezione di su un insieme di attributi è l’insieme delle dipendenze Y appartenenti a tali che

Algoritmo per il calcolo della proiezione di un insieme di dipendenze

Conservazione delle dipendenze II

Dato uno schema relazionale ed una sua decomposizione si dice che essa conserva le dipendenze funzionali se è implicata logicamente dall’unione delle proiezioni

Di seguito l’algoritmo per controllare se una decomposizione preserva le dipendenze funzionali:

Forma normale

Una relazione è detta in forma normale di Boyce-Codd (BCNF) se per ogni dipendenza funzionale definita su di essa, contiene una chiave di , cioè è superchiave per

Terza forma normale

Una relazione è detta in terza forma normale (3NF) se per ogni dipendenza funzionale definita su di essa si ha almeno una delle due seguenti condizioni:

  1. contiene una chiave di
  2. appartiene ad almeno una chiave di
Perché scegliamo queste forme normali?

BCNF: lo scopo di questa forma normale è quello di eliminare ridondanze causate dalle dipendenze 3NF:

Lemmi

Decomposizioni che preservano i dati con componenti in BCNF

Input: Schema e dipendenze Output: Decomposizione che preserva i dati tale che ogni componente sia in BCNF rispetto alla proiezione di su quella componente

Preservazione delle dipendenze e 3NF

Input: con ricoprimento minimale Output: Una decomposizione di che conserva le dipendenze e tale che ogni suo elemento è in 3NF