Praticamente quello che sta nelle dispense ma ho bisogno di scrivere le cose per studiarle, poi boh aggiungerò qualcosa sulle dimostrazioni.
3NF
Nelle basi di dati voglia evitare 3 situazioni:
- Anomalie di Inserimento: Vogliamo inserire un dato ma per farlo dobbiamo inserirne anche altri
- Anomalie di Cancellazione: Come l’inserimento quindi vogliamo cancellare un dato ma per farlo ne perdiamo anche altri
- Anomalie di Aggiornamento: Se vogliamo aggiornare un dato dobbiamo farlo in ogni tupla dove compare
- Ridondanza nella rappresentazione dei dati
Definizione 1: Dato uno schema di relazione , una dipendenza funzionale su è una coppia ordinati di sottoinsiemi non vuoti di e viene denotata con .
Si dice che un’istanza di soddisfa la dipendenza funzionale se per ogni coppia di tuple si ha che se allora .
Se è un insieme di dipendenze funzionali su ed è un’istanza di che soddisfa tutte le dipendenze di , diciamo che è un’istanza legale di .
La chiusura di denotata con è l’insieme di dipendenze funzionali che sono soddisfatte da ogni istanza legale di .
Banalmente si ha che .
Definizione 2: Dato uno schema di relazione , un insieme di dipendenze funzionali su e un sottoinsieme di diciamo che è una chiave per se:
- Per ogni sottoinsieme proprio di si ha che (quindi non devono esserci sottoinsiemi che sono chiave a loro volta)
Info su 3NF
Uno schema di relazione in cui non ci sono attributi che dipendono parzialmente né transitivamente dalla chiave è detto in terza forma normale.
Più formalmente:
Definizione 3: Dati uno schema di relazione e un insieme di dipendenze funzionali su diciamo che:
- Un attributo di è primo se appartiene ad una chiave di
- Un sottoinsieme di è una superchiave se contiene una chiave di
Definizione 4: Siano uno schema di relazione e un insieme di dipendenze funzionali su :
-
tale che è una dipendenza parziale su se non è primo ed è contenuto propriamente in una chiave di . In modo discorsivo non abbiamo dipendenze parziali se gli attributi che non appartengono alla chiave devono dipendere dall’intera chiave
-
tale che è una dipendenza transitiva su se non è primo e per ogni chiave di si ha che non è contenuto propriamente in e . Non abbiamo dipendenze transitive se gli attributi che non appartengono alla chiave, dipendono direttamente dalla chiave e non da altri attributi non chiave.
Definizione 5: Siano uno schema di relazione e un insieme di dipendenze funzionali su . è in 3NF se per ogni dipendenza funzionale tale che si ha che:
- è primo, oppure
- è una superchiave.
Teorema 1: Siano uno schema di relazione e un insieme di dipendenze funzionali su . Uno schema è in 3NF se e solo se non esistono né dipendenze parziali né dipendenze transitive in .
Dimostrazione
-
Parte SOLO SE: Se non abbiamo dipendenze parziali e transitive, tutte le nostre dipendenze avranno chiave o che ne contiene una e quindi verificano sempre la condizione vista prima superchiave.
-
Parte SE: Lo schema è in 3NF quindi abbiamo che primo oppure superchiave, quindi ci sono diversi casi:
- Se è primo viene a mancare la condizione per avere dipendenze parziali e transitive, quindi abbiamo terminato
- Se non è primo allora è superchiave per l’altra condizione, in quanto tale può contenere una chiave ma non essere contenuto propriamente e quindi non possiamo avere dipendenze parziali (dove la chiave deve contenere propriamente X). Inoltre essendo superchiave non possono verificarsi, per ogni chiave, le condizioni di dipendenza transitive dato che almeno una è contenuta in .
Abbiamo quindi dimostrato che le due condizioni di 3NF sono equivalenti.
Decomposizioni che preservano le dipendenze.
Quando si decompone uno schema è importante che questa decomposizioni preservi tutte le dipendenze presenti in ovvero la chiusura di . Come si calcola questo insieme? Introduciamo un altro insieme .
Sia uno schema di relazione e un insieme di dipendenze funzionali, sia l’insieme di dipendenze funzionali definito nel modo seguente:
- se allora
- se allora riflessivitá
- se allora per ogni aumento
- se e allora transitività
Dimostreremo che ovvero che la chiusura di insieme di dipendenze può essere ottenuta applicando ricorsivamente gli assiomi di Armstrong, sono utili inoltre altre regole utile che ci permettono di ricavare da delle dipendenze in altre dipendenze di :
- se e allora unione
- se e allora decomposizione
- se e allora pseudotransitività
Teorema 2: Sia un insieme di dipendenze funzionali, valgono le 3 regole viste sopra.
Dimostrazione
-
Unione: Se , per l’aumento si ha che . Analogamente se sempre per aumento si ha che quindi dato che abbiamo per transitività possiamo dire che .
-
Decomposizione: Se allora per riflessività si ha che quindi poiché e per transitività abbiamo che .
-
Pseudotransitività: Se , per l’aumento possiamo dire che quindi poiché e per transitività abbiamo che .
Definizione 6: Siano uno schema di relazione, un insieme di dipendenze funzionali su e un sottoinsieme di . La chiusura di rispetto ad denotata con è definito come
Lemma 1: Siano uno schema di relazione ed un insieme di dipendenze funzionali su . Si ha che se e solo se .
Dimostrazione: Sia .
-
Parte SE: Poiché , per la decomposizione possiamo dire che si ha che e questo significa che . Dove per ogni sono gli attributi presenti in e quindi .
-
Parte SOLO SE: Dato che , per ogni si ha che pertanto per l’unione .
Teorema 3: Siano uno schema di relazione ed un insieme di dipendenze funzionali su si ha .
Dimostrazione
- Dimostriamo che
Sia una dipendenza funzionale in dimostriamo per induzione sul numero di applicazioni di uno degli assiomi di Armstrong.
Base Induzione: in questo caso e quindi banalmente sarà anche in
Induzione: Per l’ipotesi induttiva, ogni dipendenza funzionale ottenuta a partire da applicando armstrong un numero di volte minore o uguale a è in , per si presentano 3 casi:
- è stata ottenuta mediante l’assioma della riflessività, in tal caso . Quindi sia un’istanza di e siano due tuple di tali che allora banalmente si ha anche che .
- è stata ottenuta applicando l’aumento ad una dipendenza tale che e per qualche . Sia un’istanza legale di e siano e due tuple di tali che si avrà anche che e . Per ipotesi induttiva porta a e insieme portano a e quindi otteniamo che .
- è stata ottenuta applicando la transitività a due dipendenze funzionali . Sia un’istanza di e siano due tuple di tali che per ipotesi induttiva si ha che e sempre per ipotesi induttiva .
- Dimostriamo che
Supponiamo per assurdo che esista una dipendenza funzionale tale che . Mostreremo che esiste un’istanza legale di che non soddisfa (contraddice il fatto che ).
Consideriamo la seguente istanza :
Mostriamo che:
- è un’istanza legale di . Sia una dipendenza funzionale in e supponiamo per assurdo che non sia soddisfatta da . In tal caso le due tuple devono avere valori uguali su e diversi per , questo implica che e . Poiché , per il lemma 1 si ha che e quindi per transitività si ha che e quindi per il lemma 1 che contraddice quanto detto prima ovvero che .
- In quanto istanza legale, soddisfa tutte le dipendenze in , in particolare . Poiché le due tuple di coincidono sugli attributi e quindi poiché soddisfa devono coincidere anche gli attributi di , questo implica che e quindi per il lemma 1 che .
Calcolare richiede tempo esponenziale in , più precisamente esponenziale sul numero di attributi in . Per i nostri scopi è sufficiente determinare se una dipendenza appartiene ad , questo si fa calcolando e verificando se , il calcolo di può essere fatto tramite un algoritmo.
Algoritmo 1: Prende come input uno schema , un insieme di dipendenze su e un sottoinsieme di . Come output fornisce la chiusura di rispetto ad all’interno della variabile .
Teorema 4: L’algoritmo 1 calcola correttamente la chiusura di un insieme di attributi rispetto ad un insieme di dipendenze funzionali.
Dimostrazione: Indichiamo con il valore iniziale di () e con ed , i valori di ed dopo l’i-esima esecuzione del ciclo, si vede ad occhio che , proveremo che esiste tale che se e solo se .
- Parte SE, mostriamo per induzione su che per ogni .
Base Induzione: se dato che e si ha che .
Induzione: , per ipotesi abbiamo che . Sia un attributo in , significa che lo abbiamo aggiunto all’ultima iterazione e quindi deve esistere una dipendenza tale che e . Dato che otteniamo per ipotesi induttiva che e per il lemma 1 possiamo dire che , inoltre dato che possiamo dire per transitività che e quindi per il lemma 1 otteniamo , quindi per ogni si ha , e quindi per l’ipotesi induttiva .
- Parte SOLO SE: Sia un attributo in e sia tale che ( è il valore di quando l’algoritmo termina). Mostreremo che . Poiché si ha per il teorema 3, pertanto deve essere soddisfatta da ogni istanza legale di . Consideriamo le seguente istanza :
Mostriamo che è legale, se per assurdo esistesse in una dipendenza funzionale non soddisfatta da , si dovrebbe avere e ma in tal caso si avrebbe (contraddizione, significa che non siamo ancora arrivati all’ultima iterazione, ma prima o poi aggiungeremo ). Poiché è un’istanza legale di deve soddisfare che si trova in e per il teorema 3 in , ma allora poiché , deve essere in .
Definizione 7 Sia uno schema di relazione. Una decomposizione di è una famiglia di sottoinsiemi di che ricopre ovvero .
Definizione 8: Siano e due insiemi di dipendenze funzionali. e sono equivalenti se .
Verificare l’equivalenza richiederebbe tempo esponenziale dato che dovremmo calcolare , usiamo il seguente lemma.
Lemma 2 Siano e due insiemi di dipendenze funzionali, se allora
Dimostrazione Sia , poiché per il teorema 3 è derivabile fa mediante gli assiomi di Armstrong e ogni dipendenza funzionale in è derivabile da mediante gli assiomi di armstrong, è derivabile da mediante gli assiomi di Armstrong.
Essenzialmente dato che significa che dentro alla chiusura di ho anche ma gli assiomi continuo ad applicarli finché posso e quindi all’interno di troverò anche
Definizione 9 Sia uno schema di relazione, un insieme di dipendenze funzionali su e una decomposizione di diciamo che preserva se dove
Verificare che una decomposizione preservi quindi richiede la verifica dell’equivalenza dei due insiemi e . Per definizione quindi ci basta verificare che .
Algoritmo 2
L’algoritmo richiede che venga calcolato ma noi non conosciamo , usiamo il prossimo algoritmo:
Algoritmo 3
Teorema 5: Sia uno schema di relazione, un insieme di dipendenze funzionali su e una decomposizione di e un sottoinsieme di . L’algoritmo 3 calcola correttamente .
Dimostrazione
Indichiamo con il valore iniziale di e con il valore dopo la i-esima iterazione dell’assegnazione , quindi si nota che per ogni . Inoltre indichiamo con il valore di quando l’algoritmo termina.
Mostriamo che
Dimostriamo per induzione soltanto .
Base Induzione: Abbiamo che infatti e quindi è vero per riflessività.
Ipotesi Induttiva: Fino a quello che abbiamo in (questo significa che ).
Passo Induttivo: Banalmente abbiam che e per ipotesi induttiva quelli in sono già nella chiusura di . Controlliamo quindi le ovvero aggiunte al passo .
Questo significa che esiste un tale che , questo significa dire che appartiene ad entrambi i pezzi dell’intersezione, quindi:
La parte a destra per ora non ci interessa, la parte a sinistra implica che:
Adesso siccome sappiamo che , poi sappiamo che e inoltre la dipendenza si trova in , ricordando la definizione di possiamo dire che la dipendenza si trova anche in , infatti:
Adesso, abbiamo:
- Per ipotesi
- per riflessività
- Applicando la transitività otteniamo
- Applicando di nuovo la transitività con otteniamo che
Definizione 10: Sia uno schema di relazione. Una decomposizione di ha un join senza perdita se per ogni istanza legale di si ha .
Teorema 6: Sia uno schema di relazione e una decomposizione di . Per ogni istanza legale di , indicato con si ha:
- questa è la parte importante, ovvero finché abbiamo significa che abbiamo perdita nel join, ovvero il join contiene più tuple dell’istanza, nel momento in cui sono allora abbiamo join senza perdita. (per ogni istanza legale)
Possiamo capire se una decomposizione ha un join senza perdita tramite il seguente algoritmo:
Algoritmo 4 (Quello con cui costruiamo la tabella):
Teorema 7: Sia uno schema di relazione, un insieme di dipendenze funzionali su e una decomposizione di , l’algoritmo 4 funziona.
Dimostrazione: Dobbiamo dimostrare che ha un join senza perdita se e solo se quando l’algoritmo termina la tabella ha una tupla con tutte a
.
- Dimostriamo soltanto che se la decomposizione ha un join senza perdita allora la tabella deve avere una riga con tutte
a
.
Supponiamo per assurdo che abbia un join senza perdita e che con l’algoritmo terminato la tabella non abbia una tupla con tutte a
.
La tabella possiamo vederla come un’istanza legale di dato che l’algoritmo termina quando non ci sono più violazioni delle dipendenze in .
Poiché nessun simbolo a
che compare nella tabella iniziale viene modificato dall’algoritmo, per ogni abbiamo che contiene una tupla con tutte a
, quindi questo significa che contiene una tupla con tutte a
dato che prima o poi quelle tuple iniziali si incontreranno nel join. Questo significa che almeno per questa istanza infatti abbiamo detto che la tabella non ha una riga con tutte a
come ipotesi ma abbiamo trovato un’istanza legale che invece le ha.
Essenzialmente non sappiamo come funziona l’algoritmo perché serve la seconda parte, però, in ci sarà sempre una riga con tutte dato che è il join fra i sottoschemi, infatti accade sempre che . Noi però stiamo supponendo che dato che abbiamo join senza perdita e che, per assurdo, in non ci sia una riga con tutte ma questo appunto implicherebbe che . Quindi non stiamo dicendo il “come” funziona l’algoritmo ma soltanto che nel caso di un join senza perdita questo viene rilevato. (Ci ho messo un po’ per capirlo spero di ricapirlo leggendo)
Esiste sempre una decomposizione che:
- È in 3NF
- Preserva
- ha un join senza perdita
Possiamo calcolarla in tempo polinomiale tramite un algoritmo ma ci serve il concetto di copertura minimale di un insieme di dipendenze
Definizione 11 Sia un insieme di dipendenze funzionali, una copertura minimale di è un insieme di dipendenze funzionali equivalente ad e tale che:
- Ogni dipendenza in ha la parte a destra singleton
- Per nessuna dipendenza esiste tale che (gli attributi a sinistra non devono essere ridondanti)
- Per nessuna dipendenza deve accadere (ogni dipendenza non è ridondante).
La copertura non è unica.
Possiamo calcolare una copertura in tempo polinomiale con il seguente algoritmo
Algoritmo 5: Prende in input , e permette di calcolare una decomposizione che:
- Preserva
- Ogni sottoschema è 3NF
Teorema 8: L’algoritmo funziona
Dimostrazione
- preserva
Se preserva la copertura minimale allora preserva anche l’insieme di partenza dato che sono equivalenti.
Sia . Per ogni dipendenza funzionale otteniamo un sottoschema (l’algoritmo lo ha creato), quindi queste dipendenze saranno sicuramente in quindi .
Invece per definizione, quindi preserva .
- Ogni schema è in 3NF
Abbiamo i 3 casi dell’algoritmo da dimostrare.
-
Se allora ogni attributo in fa parte della chiave di quel sottoschema e quindi è in 3NF, non ci serve controllare sottoschemi dato che stiamo usando una copertura minimale.
-
Se allora esiste una dipendenza funzionale che coinvolge tutti gli attributi in . Siccome è una copertura minimale tale dipendenza avrà la forma e sempre perché è una copertura minimale non può esistere una dipendenza con , quindi è chiave del sottoschema . Adesso se prendiamo una qualunque dipendenza , se allora siccome è minimale otteniamo che dato che é chiave e quindi superchiave non viola la 3NF. Se invece allora e quindi è primo e non viola la 3NF.
-
Se invece siccome è minimale non ci possono essere dipendenze tali che e quindi è chiave in . Prendendo quindi una qualsiasi dipendenza tale che abbiamo che se allora e quindi è superchiave e non viola la 3NF se invece allora necessariamente e quindi è primo e non viola la 3NF.
Se vogliamo ottenere un join senza perdita ci basta aggiungere un sottoschema che contiene una chiave, non facciamo la dimostrazione.
Definizione 12: Uno schema è in forma normale Boyce-Codd se per ogni dipendenza funzionale tale che si ha che è una superchiave.
Se uno schema è in 3NF Boyce Codd allora è anche in 3NF ma non è vero il contrario.
Non esiste sempre una decomposizione che:
- Tutti schemi in Boyce Codd
- preserva F
- Join senza perdita
Invece esiste sempre:
- Tutti schemi in Boyce Codd
- Join Senza perdita. Ed esiste anche un algoritmo che genera tale decomposizione.