(X (X
− → Y ∈ F F ⊢ − → Y
2. è una dipendenza ridondante se e solo se
X → Y , cioè
{X {X
(F − → Y}) = F F − → Y} ⊢ X → Y
F è detta copertura canonica se e solo se:
1. La parte destra di ogni DF in F è un attributo
2. Non esistono attributi estranei
3. Non esistono dipendenze ridondanti
Esiste un teorema che ci permette di utilizzare gli insiemi di dipendenze che sono coperture canoniche.
TH: Per ogni insieme di dipendenze F, esiste una copertura canonica. È presente un algoritmo per calcolare
la copertura canonica dove vengono trasformate le dipendenze nella forma elimina gli attributi
X → A,
estranei e le dipendenze ridondanti. In generale per eliminare le anomalie da uno schema occorre
decomporlo in piccoli schemi equivalenti. DEF: Dato uno schema con è una
{R (T ), (T )}
R(T) = … , R
decomposizione di R se e solo se Sono due le proprietà desiderabili di una decomposizione:
U T = T.
1. Conservazione dei dati
2. Conservazione delle dipendenze
Che sono entrambe due proprietà indipendenti. Preservazione dei dati: è una
{R (T ), (T )}
= … , R
decomposizione di che preserva i dati se e solo se per ogni istanza valida r di R:
() . Dalla definizione di giunzione naturale scaturisce il seguente risultato.
r = π r ⋈ ⋯ ⋈ π r
TH: se è una decomposizione di allora per ogni istanza r di R:
{R (T ), (T )}
= … , R R(T),
. TH decomposizioni binarie: sia R<T, F> uno schema relazionale, la
⊆ π r ⋈ ⋯ ⋈ π r
decomposizione preserva i dati se e solo se o .
(T ), (T )}
= {R R T ∩ T → T ∈ F T ∩ T → T ∈ F
Esistono anche dei criteri per le decomposizioni in più di due schemi. Dato lo schema R<T, F>, la
decomposizione preserva le dipendenze se e solo se l’unione delle dipendenze in è
{R }
= , … , R π (F)
una copertura di F. Dato lo schema R<T, F>, il problema di stabilire se la decomposizione {R }
= , … , R
preserva le dipendenze ha complessità in tempo polinomiale. Ora parliamo di un teorema importante.
TH: Sia una decomposizione di R<T, F> che preservi le dipendenze e tale che un sia
{R
= < T , F >} T
una superchiave per R. Allora preserva i dati. Definizione di proiezione delle dipendenze: Dato lo schema
R<T, F>, e la proiezione di F su è Durante lo sviluppo sono
{X |XY }.
(F)
T ⊆ T, T π = → Y ∈ F ⊆ T
state individuate varie categorie di anomalie che hanno portato alla definizione di diverse forme normali
intese come PROPRIETA’ che devono essere soddisfatte dalle dipendenze da attributi di schemi ben fatti.
Ne abbiamo diverse:
1. Prima forma normale: Impone una restrizione sul tipo di una relazione, richiede che i valori di tutti i
domini di una relazione siano atomici. Questa è stata inglobata nei moderni modelli relazionali, è
un vincolo integrato
2. Seconda forma normale: impone dei vincoli sulle dipendenze
3. Terza forma normale: è un criterio per valutare la qualità di uno schema che è restrittivo della
FNBC. DEF: R<T, F> è in 3FN se per ogni X→A F+, con A X, X è una superchiave o A è primo.
∈ ∉
Essendo restrittiva, la 3FN accetta anche schemi con anomalie. La 3FN ammette una dipendenza
non banale e non-da-chiave se gli attributi a destra sono primi; la BCNF non ammette mai nessuna
dipendenza non banale e non-da-chiave. TH: R<T, F> è in 3FN se per ogni X → A F non banale,
∈
allora X è una superchiave oppure A è primo.
4. Forma normale di Boyce-Codd (FNBC): Una dipendenza non banale indica l’esistenza di una
X → A
collezione di entità identificate da X. Se esiste in R una dipendenza non banale ed X non è
X → A
chiave, allora X modella l’identità di un’entità diversa da quelle modellate dall’intera R. DEF: R<T, F>
è in BCNF per ogni X→A F+, con A∉X (non banale), X è una superchiave. Quindi la FNBC
⇔ ∈
dipende dalla chiusura delle dipendenze. TH: R<T, F> è in BCNF per ogni X→A F non
F ⇔ ∈
banale, X è una superchiave.
Le FNBC risolvono le anomalie delle dipendenze funzionali, ma possono essere presenti altre anomale non
associabili alle DF. La coesistenza di due proprietà multivalore indipendenti, fa sì che per ogni impiegato
esistano tante ennuple quante sono le possibili coppie di valori. Dopo la progettazione logica può essere
opportuno reintrodurre nello schema fisico delle anomalie.
Lezione 10
Il linguaggio SQL viene sviluppato nel 1973 dai ricercatori della IBM, intorno agli anni ’80 inizia un processo
di standardizzazione. Le implementazioni nei vari DBMS relazionali commerciali, includono funzionalità
non previste dallo standard, non includono funzionalità previste dallo standard. Implementano funzionalità
previste dallo standard ma in modo diverso. SQL è un linguaggio dichiarativo basato sul calcolo relazionale
su ennuple e sull’algebra relazionale. Le relazioni possono avere righe duplicate (tabella è un multinsieme),
eliminare i duplicati costa . Se lo guardiamo dal punto di vista della flessibilità può essere utile
O nlog(n)
avere duplicati, perché potrebbero servire per le funzioni di aggregazione. Il linguaggio comprende:
1. DML (Data Manipulation Language): ricerche e/o modifiche interattive con le interrogazioni o
query
2. DDL (Data definition Language): definizione (e amministrazione) della base di dati
È possibile usare SQL in altri linguaggi di programmazione. Come sappiamo, SQL è un calcolo su
multiinsiemi e i comandi base sono:
- SELECT: fa la proiezione dei campi
- FROM: si specificano le tabelle dove prelevare i dati
- WHERE: si specifica la condizione per cui filtrare le tabelle, può essere una combinazione booleana
(AND, OR, NOT) e disuguaglianza tra attributi
È previsto l’uso del valore null a meno che non si impone il vincolo di integrità not null. Il comando
DISTINCT si usa nella SELECT per non avere dei duplicati. SELECT fa la proiezione. Se si opera con più tabelle
e con degli attributi omonimi bisogna qualificarli. Adesso prendiamo in considerazione gli alias che
permettono di fare la ricorsività su più livelli. A più attributi possono essere associati gli Alias.
Le funzioni di aggregazione vengono usate per fare varie operazioni:
- COUNT: letteralmente conta il numero di tuple
- MIN, MAX, AVG: minimo, massimo e media
Ma ricorda, non si usano insieme funzioni di aggregazione e attributi. La clausola FROM permette di
costruire, nella versione base, il prodotto cartesiano di tabelle, con la clausola WHERE, FROM permette di
esprimere la giunzione. Una giunzione può essere: [CROSS, NATURAL], [LEFT|RIGHT|FULL]JOIN. Per le
tabelle, poi, esistono anche [using(attributi)|ON(Condizione)]. JOIN realizza il prodotto cartesiano. Se faccio
LEF JOIN viene fatta la giunzione esterna. Se facciamo la JOIN semplice compariranno tutti gli studenti con i
loro relativi esami, con la LEF JOIN compariranno anche gli studenti che non hanno fatto neanche un
esame, cioè NULL, e compaiono una sola volta. Abbiamo poi la clausola ORDER BY che fa si che la tabella sia
ordinata secondo gli attributi elencati: ORDER BY Attributo [(DESC|ASC)] {, Attributo [(DESC)|(ASC)]}. SQL
comprende degli operatori insiemistici: UNION, INTERSECTION ed EXCEPT. Questi vengono usati per
combinare i risultati di tabelle con colonne di ugual nome e ugual tipo. Essendo operatori insiemistici per
definizione eliminano i duplicati, a meno che non ci sia esplicitamente richiesto il contrario con l’opzione
ALL la quale viene messa alla UNION.
Lezione 11
I valori nulli sono rappresentati dal valore speciale NULL che può essere il valore di un attributo di
qualunque tipo a meno che non ci sia il vincolo NOT NULL. Il valore di un campo di un’ennupla può mancare
per molte ragioni. Per questo SQL fornisce il valore speciale NULL. La clausola BETWEEN si applica a valori
numerici. Il pattern può contenere caratteri e simboli speciali tra cui:
- %: sequenza di 0 o di più caratteri qualsiasi
- _: un carattere qualsiasi
La clausola WHERE può essere una condizione booleana di predicati. Alcune interrogazioni richiedono di
estrarre dati dal DB e usarli in operazioni di confronto. È possibile specificare query annidate inserendo
nella clausola WHERE una condizione che usi una query (che a sua volta può contenere un’altra query
annidata). Le query annidate sono spesso chiamate “SQL Select Annidate” o “sottoselect”. Le query
annidate possono:
1. Fare confronti con l’insieme dei valori ritornati dalla sottoselect
2. Verificare la presenza/assenza di valori nell’insieme ritornato dalla sottoselect
3. Verificare se l’insieme ritornato dalla sottoselect è vuoto
Tutte le interrogazioni su di una associazione multivalore vanno quantificate. La sintassi del where di SQL è
una combinazione booleana di predicati tra cui:
- Expr Comp Expr
- Expr Comp (sottoselect che torna un valore)
- [NOT] EXISTS (sottoselect)
Un altro costrutto che permette una quantificazione esistenziale è il costrutto ANY. ANY e EXIST esprimono
la stessa cosa ma vengono espresse in due forme diverse.
Lezione 12
Un’alternativa agli insiemi vuoti è il groupby. Se per ogni materia ci interessa trovare il nome e una
funzione aggregata (media), poi ci interessa trovare il nome della materia e il voto medio degli esami
selezionando solo le materie per le quali sono stati sostenuti più di tre esami dovremo utilizzare il
costrutto groupby: esegue le clausole FROM-WHERE, partiziona la tabella risultante rispetto all’uguaglianza
su tutti i campi, elimina i gruppi che non rispettano la clausola HAVING, da ogni gruppo estrae una riga
usando la clausola SELECT. In sintesi i passi sono:
1. Raggruppamento
2. Valuta HAVING e SELECT
Di base NULL = NULL significa “unknown”, però nel groupby NULL = NULL, se un attributo può assumere un
valore NULL tutte le tuple che hanno valore NULL associate saranno così. Per la modifica dei datti abbiamo
tre tipi:
- Insert
- Update
- Delete
Lezione 13
SQL oltre ad essere un linguaggio per fare interrogazioni, è anche un linguaggio per la definizione di basi di
dati (DDL – Data Definition Language) in quanto permette la creazione della base di dati e della struttura
logica della tabella. Presenta dei vincoli di integrità su attributi di una ennupla, intrarelazionali,
interrelazionali. Per la modifica dello
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Basi di dati
-
Basi di Dati Teoria Completa
-
Appunti Basi di dati
-
Gestione dell'informazione e basi di dati - basi di dati relazionali