mercoledì 11 dicembre 2024
BASI DI DATI - CALCOLO RELAZIONALE
Cos’è il calcolo relazionale?
Una famiglia di linguaggi dichiarativi, basati sul calcolo dei predicati del
primo ordine
Ci sono diverse versioni:
- calcolo relazionale su domini
- calcolo su tuple con dichiarazioni di range
Calcolo su domini
Le espressioni del calcolo relazionale hanno la seguente forma:
{A1:x1,…,Ak:xk | f}, dove A1,…,Ak sono attributi distinti (possono anche
non comparire nello schema di Basi di Dati su cui si formula
l’interrogazione), x1,…,xk sono variabili e f è una formula
A1:x1,…,Ak:xk è chiamata Target List.
La formula f può essere:
- formula atomica. Esistono due tipi :
• R(A1:x1,…,Ap:xp) dove R(A1,…,Ap) è uno schema di relazione e
x1,…,xp sono variabili
• x ϑ y oppure x ϑ c, dove x e y sono variabili, c è una costante e ϑ è
un operatore di confronto (=,≠,<,>,≤,≥)
- formula composta per mezzo dei connettivi logici ¬ (NOT) ∧ (AND)
∨ (OR)
- formula nella forma ∃x (f) o ∀x (f) dove x è una variabile, f è una
formula, ∃ è il quanti catore esistenziale, e ∀ è il quanti catore
universale
Il risultato dell’espressione {A1:x1,…,Ak:xk | f} è una relazione su
A1,…,Ak che contiene le tuple i cui valori sostituiti alle variabili x1,…,xk
rendono vera la formula f.
R(A1:x1,…,Ap:xp) è vera sui valori di x1,…,xp che formano una tupla di
R; gli operatori di confronto hanno il signi cato usuale, le formule
composte per mezzo dei connettivi logici hanno il signi cato usuale
1
fi
fi
fi
fi
Esempi: Impiegati(Matricola,Nome, Età, Stipendio)
Supervisione(Capo, Impiegato)
1. Trovare matricola, nome, età e stipendio degli impiegati che
guadagnano più di 40 milioni: { Matricola: m, Nome: n, Età: e,
Stipendio: s | Impiegati(Matricola: m, Nome: n, Età: e, Stipendio: s) ∧
s > 40 }
2. Trovare matricola, nome ed età di tutti gli impiegati: { Matricola: m,
Nome: n, Età: e | Impiegati(Matricola: m, Nome: n, Età: e, Stipendio:
s)}
3. Trovare matricola, nome ed età degli impiegati che guadagnano più
di 40 milioni: { Matricola: m, Nome: n, Età: e | Impiegati(Matricola: m,
Nome: n, Età: e, Stipendio: s) ∧ s > 40 }
4. Trovare le matricole dei capi degli impiegati che guadagnano più di
40 milioni: { Capo: c | Supervisione(Capo:c,Impiegato:m) ∧
Impiegati(Matricola: m, Nome: n, Età: e, Stipendio: s) ∧ s > 40 }
5. Trovare nome e stipendio dei capi degli impiegati che guadagnano
più di 40 milioni: { NomeC: nc, StipC: sc | Impiegati(Matricola: m,
Nome: n, Età: e, Stipendio: s) ∧ s > 40 ∧
Supervisione(Capo:c,Impiegato:m) ∧ Impiegati(Matricola:c,Nome:nc,
Età:ec, Stipendio: sc) }
LEGGI DI DE MORGAN :
Con operatori booleani:
¬(f∧g) = ¬(f) ∨ ¬(g)
¬(f∨g) = ¬(f) ∧ ¬(g)
Con i quanti catori:
∃ x (f) = ¬( ∀x ( ¬(f)))
∀ x (f) = ¬( ∃x ( ¬(f)))
Calcolo su domini:
- Vantaggi: dichiaratività
- Svantaggi: molto verboso, dipendenza dal dominio
In generale l’Algebra Relazionale e il Calcolo Relazionale non sono
equivalenti, infatti con il CR posso scrivere espressioni dipendenti dal
dominio
Se però restringiamo il calcolo alle sole espressioni indipendenti dal
dominio allora AR e CR diventano equivalenti.
2
fi
Calcolo su tuple con dichiarazione di range
Il calcolo su tuple con dichiarazioni di range permette di superare le
limitazioni del calcolo su domini
Il numero di variabili viene ridotto usando una variabile per ciascuna
tupla (piuttosto che per ciascun valore)
Il linguaggio viene reso indipendente dal dominio imponendo che le
variabili “derivino” dalle relazioni della base di dati .
Le espressioni hanno la forma: { TargetList | RangeList | Formula }
RangeList elenca le variabili libere della Formula ognuna con il relativo
campo di variabilità. È una lista di elementi del tipo x(R), con x variabile
e R nome di relazione
TargetList ha elementi del tipo Y: x.Z (oppure x.Z o anche x.*). x è una
variabile, Y e Z due liste di attributi della stessa lunghezza. Gli attributi Z
devono comparire nello schema della relazione che costituisce il range
di x.
Formula ha lo stesso signi cato del calcolo su domini
Esempi:
1. Trovare matricola, nome, età e stipendio degli impiegati che
guadagnano più di 40 milioni: σ Stipendio>40(Impiegati) { i.* |
i(Impiegati) | i.Stipendio > 40 }
2. Trovare matricola, nome ed età di tutti gli impiegati: π Matricola,
Nome, Età(Impiegati), { i.(Matricola,Nome,Età) | i(Impiegati) | }
3. Trovare matricola, nome ed età degli impiegati che guadagnano più
di 40 milioni: πMatricola, Nome, Età(σ Stipendio>40(Impiegati)), { i.
(Matricola,Nome,Età) | i(Impiegati) | i.Stipendio > 40 }
Il calcolo su tuple con dichiarazioni di range non permette di esprimere
alcune interrogazioni importanti, per esempio le unioni: R1(AB) ∪ R2(AB)
Con una sola variabile, quale potrebbe essere il range?
Con due variabili?
Nota: l’unione è esprimibile sia con l’algebra che con il calcolo su
domini
Nota: intersezione e di erenza sono esprimibili
3
ff
fi