Sei sulla pagina 1di 15

Algebra e calcolo relazionale

I vari linguaggi utilizzati per l’interazione con le basi di dati sostanzialmente permettono operazioni in due
parti:

 Operazioni sullo schema: tramite le istruzioni di tipo DDL (Data Definition Language);
 Operazioni sui dati contenuti nel database: tramite le istruzioni DML (Data Manipulation
Language): sostanzialmente le operazioni fondamentali DML sono:
o Interrogazione (query): prelievo di informazioni dal database;
o Aggiornamento di dati già presenti.

Questi linguaggi possono essere principalmente di due tipologie:

 Dichiarativi: linguaggi che permettono di specificare che cosa fare, ma senza dare la possibilità di
sapere come viene fatto ciò che si vuole fare;
 Procedurali: linguaggi che permettono di specificare come riuscire a fare ciò che si intende fare.

I linguaggi di interrogazione più conosciuti sono:

 Algebra relazionale: linguaggio procedurale;


 Calcolo relazionale: dichiarativo;
 SQL (Structured Query Language): parzialmente dichiarativo;
 QBE (Query By Example): dichiarativo;
 DataLog: simile al ProLog, consente una elaborazione dei dati intelligente.

Algebra relazionale
L’algebra relazionale è un linguaggio composto da un insieme di operatori scomponibili; svolgono
operazioni sulle relazioni e permettono di produrre in output altre relazioni.

Operatori dell’algebra relazionale


 Operatori Insiemistici: le relazioni vengono interpretate come degli insiemi di elementi, contiene
o Unione;
o Intersezione;
o Differenza;
o Prodotto cartesiano.
 Ridenominazione;
 Selezione;
 Proiezione;
 Join: permette di unire dati presenti in relazioni differenti, contiene
o Join naturale;
o Prodotto cartesiano;
o Theta - join.

Operatori insiemistici
Sono degli operatori dove le relazioni vengono considerate come degli insiemi e dove è quindi possibile
applicarvici tutte le sotto-operazioni previste dagli operatori insiemistici, quindi unione, intersezione e
differenza.

I risultati, a loro volta, sono insiemi, e quindi sono delle relazioni.


Una relazione è quindi un insieme di tuple omogenee, perché hanno tutte gli stessi attributi e quindi lo
stesso numero di elementi.

Unione
l'unione di due relazioni r1 e
r2 definite sullo stesso
insieme di attributi X è
indicata con r1 ∪ r2 ed è una
relazione ancora su X
contenente le tuple che
appartengono a r1 oppure a
r2, oppure a entrambe.

La relazione ottenuta ha lo
stesso schema di Laureati e
Quadri e contiene i dati
"fusi" delle due entità.
Vengono anche eliminati i
duplicati.

Intersezione
l'intersezione di r1(X) e r2(X) è indicata con r1 ∩ r2 cd è una relazione su X contenente le tuple che
appartengono sia a r1 sia a r2.

Differenza
la differenza di r1(X) e r2(X)
è indicata con r1 - r2 ed è
una relazione su X
contenente le tuple che
appartengono a r1 e le tuple
che NON appartengono a
r2.

La relazione ottenuta
contiene gli elementi che
appartengono a Laureati
ma non a Quadri.
Prodotto cartesiano
il prodotto cartesiano
di r1(X) e r2(X) è
indicata con r1 ✕ r2
ed è una relazione su
X che contiene le
colonne sia di r1 che
di r2.

Per riempire la
tabella ricavata dalla
relazione X si
scorrono tutte le
tuple della relazione
r1 e si associano
ciascuna con una
tupla della relazione
r2; una volta finito lo
scorrimento di r1, si
fa lo stesso con la
prossima tupla di r2,
e via dicendo.

Ridenominazione
La ridenominazione è un operatore monadico, ovvero che
richiede un solo argomento.

Questo operatore permette di rinominare la colonna di


un’entità, lasciando completamente inalterate le tuple
memorizzate.

Sintassi:

REN nuovoNome ←vecchioNome ( entità )

Oppure

ρnuovoNome ← vecchioNome (entità )

Selezione
Sintassi:

σ Condizione( operando)
Oppure

SELcondizione (operando)
La selezione è un operatore monadico che, ricevuti in input l’entità da selezionare (operando) e le eventuali
condizioni di selezione, restituisce in output un risultato che ha lo stesso schema dell’operando e che
contiene un sottoinsieme delle tuple di quell’operando, costituito dalle tuple che soddisfano le condizioni
poste nell’operatore.

Tabella di partenza:
Eseguendo l’operazione SEL Stipendio > 50 AND Filiale = ‘Milano’ (Impiegati):

Proiezione
La proiezione è un operatore monadico che, dati in input l’operando e le colonne che si desiderano
visualizzare, restituisce un risultato che contiene tutte le tuple dell’operando ma contiene solo le colonne
specificate.

Sintassi:

π colonna 1 ,colonna 2 , colonnaN (operando)


Oppure

PROJ colonna1 , colonna 2 ,colonnaN (operando)


Tabella di partenza:

Eseguendo l’operatore PROJ Matricola, Cognome ( Impiegati ):


Selezione e proiezione
Selezione e proiezione sono due operatori ortogonali, dove la selezione attua una decomposizione
orizzontale, mentre la proiezione una decomposizione verticale.

Combinando selezione e proiezione, possiamo estrarre interessanti informazioni da una relazione.

PROJ Matricola , Cognome (SEL Stipendio >50 ( Impiegati ) )

Combinando selezione e proiezione, possiamo estrarre informazioni da una sola relazione; tuttavia, non
possiamo però correlare informazioni presenti in relazioni diverse.

Join
Il join è l’operatore sicuramente più interessante dell’algebra relazionale, che permette di correlare dati
presenti in relazioni diverse.

Sostanzialmente, esistono due versioni del join: il join naturale, più adatto a riflessioni a livello astratto, e il
theta-join, più adatto dal lato pratico.

Join naturale
Il join naturale è un operatore binario che correla dati presenti in relazioni diverse, basando tale unione sui
valori di due attributi con lo stesso nome, che condividono anche lo stesso valore.

Produce un risultato che è costituito dagli attributi di entrambi gli operandi e dalle tuple di entrambi gli
operandi che hanno in comune il valore dell’attributo che c’è in comune tra le due tuple.

Sintassi:

entità 1 ⋈ entità 2
Oppure

entità 1 JOIN entità 2


Impiegati ⨝ Capi

Il join qua sopra viene definito join completo: questo perché al risultato partecipano le tuple di entrambe le
entità (sono presenti tutti i valori sia dell’entità Impiegati che di quella Capi).

Il join qua sopra viene invece definito join incompleto: questo perché nel risultato non sono presenti le
tuple di entrambi le relazioni, le tuple circondate di verde non sono infatti presenti perché hanno un valore
del loro attributo comune che non è presente nell’altra relazione.

Inoltre, in questo caso, vi è un join su una chiave, che è l’attributo Reparto, in comune con entrambe le
entità.
Il join qua sopra rappresenta una situazione estrema di un join incompleto, chiamato join vuoto: in questo
caso, nessuna tupla condivide il valore dell’attributo comune con la tupla dell’altra relazione, di
conseguenza non vi sono le condizioni per poter avere un join naturale. Si ha quindi un risultato vuoto.

Join esterno
Il join esterno è una variante del join standard (che è chiamato invece join interno) che include nel risultato
anche le ennuple, di una delle due entità, che invece sarebbero escluse dal join interno.

Left join: vengono incluse le tuple che non soddisfano la condizione di join interno dell’entità di sinistra
(Impiegati).
Right join: vengono incluse le tuple che non soddisfano la condizione di join interno dell’entità di destra
(Reparti).

Full join: vengono incluse le tuple che non soddisfano la condizione di join interno di entrambe le entità
(Impiegati e Reparti).

Cardinalità del join


 Il join di R1 e R2 contiene un numero di ennuple compreso fra 0 e |R 1| × |R2|.
 Se il join coinvolge una chiave di R2, allora il numero di ennuple presenti nel risultato della join è
compreso fra 0 e |R1|.
 Se il join coinvolge una chiave di R2 e un vincolo di integrità referenziale, allora il numero di ennuple
è pari a |R1|.

In generale, avendo R1(X1, Y) e R2(Y, Y2), dove Y è l’attributo comune tra R 1 e R2, si ha che

0 ≤|R1 JOIN R2|≤|R 1|×|R2|

Se Y è (super) chiave in R2, si ha che

0 ≤|R1 JOIN R2|≤|R 1|

Se nell’attributo comune Y (dell’entità R1) vi è un vincolo di integrità referenziale si ha quindi che:

|R1 JOIN R2|=|R1|


Prodotto cartesiano (Theta Join)
Il prodotto cartesiano rappresenta un join naturale su relazione che non hanno attributi in comune tra di
loro.

Il prodotto cartesiano, usato da solo, rimane spesso poco utile, questo perché unisce due relazioni che non
sempre hanno una correlazione sensata tra di loro, e in alcuni casi non lo sono affatto. Avrebbe un pochino
più di senso solo se combinato con un operatore di selezione, che permetterebbe di scremare l’output del
prodotto in base alle esigenze richieste.

Questa combinazione viene trattata da un operatore derivato, che è il theta join.

Il theta join permette quindi di combinare due entità che non abbiano attributi in comune tra di loro.

Sintassi:

R1 JOIN condizione di join R2

Oppure

R1 ⋈condizione di join R2

Nel join qua sopra, il risultato contiene le tuple di Impiegati e di Reparti che hanno il valore di Reparto
uguale al valore di Codice.

Se l’operatore che viene impiegato nella condizione è l’uguaglianza (=), viene chiamato in quel caso equi
join.

È importante notare che in SQL non esiste la possibilità di eseguire il join naturale, questo perché i DBMS
non fanno controlli sul nome degli attributi, ma solo sul loro valore. È quindi implementato solamente il
theta join.
Equivalenza di espressioni
Due espressioni sono dette equivalenti se producono lo stesso risultato qualunque sia l'istanza attuale della
base di dati.

Ad esempio, aritmeticamente parlando, è paragonabile alla proprietà simmetrica (x + y = y + x) e alla


proprietà distributiva (x * (y + z) = x * y + x * z).

L'equivalenza di espressioni nell’algebra relazionale risulta particolarmente importante dal punto di vista
applicativo, nella fase di esecuzione delle interrogazioni. Infatti, le interrogazioni, specificate in linguaggio
SQL vengono tradotte in algebra relazionale.

In algebra relazione vi sono due tipi di equivalenza:

 Dipendente dallo schema (≡R), dove l’equivalenza è dipendente dall’istanza dello schema;
 Assoluta (≡), dove l’equivalenza è indipendente dallo schema impiegato.

Un’equivalenza importante e conosciuta per ridurre significativamente la dimensione del risultato


intermedio è quella della push selections:

SELθ ( R1 JOIN R2 ) ≡R R1 JOIN SEL θ ( R2 )

La condizione delle SELECT è Θ, che contiene solo attributi di R2.

Vi è poi un’altra equivalenza, anch’ella importante, la push projections:

Dati R1(A, B, C, D) e R2(D, E, F), si ha


PROJ ABE ( R1 JOIN R2 ) ≡R PROJ ABE (PROJ ABD ( R1 ) JOIN PROJ DE ( R2 ) ).

Architettura a tre livelli dei DBMS


Schema esterno: rappresenta
la visione del database da
parte dell’utente. Questo
livello descrive quella parte del
database che è importante per
il singolo utente o per un
gruppo di utenti. Ce ne sono
tanti quanti ne servono in base
alle esigenze dei vari utenti.
Spesso rappresenta una
porzione dello schema logico
visibile per specifici utenti.

Schema logico: rappresenta la


visione complessiva del
database dal punto di vista
logico, ovvero una visione che sarebbe uguale per tutti.

Schema interno: rappresenta il modo in cui il database viene memorizzato fisicamente nel server in cui
giace, e quindi come il livello logico viene memorizzato concretamente.
Viste
Le viste sono delle rappresentazioni differenti create a partire dagli stessi dati. Nell’architettura a tre livelli
del DBMS sono rappresentate dallo schema esterno.

Le viste sono note anche come relazioni derivate, che, nel modello relazionale, sono relazioni il cui
contenuto è dipendente dal contenuto di altre relazioni; volendo, ci sarebbero anche le relazioni di base, il
cui contenuto è invece indipendente dalle altre relazioni.

Le relazioni derivate, e quindi le viste, sono divise in due tipologie:

1. Viste materializzate;
2. Viste virtuali (dette anche relazioni virtuali).

Viste materializzate
Le viste materializzate vengono memorizzate nella base di dati, e hanno il vantaggio quindi di essere
immediatamente disponibili per le interrogazioni.

Tuttavia, è spesso oneroso mantenere il loro contenuto allineato con quello delle relazioni da cui derivano.

Risultano quindi convenienti quando gli aggiornamenti sono rari rispetto alle interrogazioni e il calcolo della
vista è complesso.

Oggigiorno sono scarsamente supportate dai DBMS, perché vi è sempre la difficoltà di dover fornire
tecniche generalizzate per mantenerne l’allineamento.

Viste virtuali (quelle che usiamo per le query)


Le relazioni virtuali devono essere ricalcolate per ogni interrogazione ma non presentano problemi di
allineamento.

Sono supportate dalla stragrande maggioranza dei DBMS moderni, che tra l’altro tendono a definirle
semplicemente “viste”, senza la dicitura “virtuali”.

Le viste vengono definite nei sistemi relazionali a partire da un’espressione di interrogazione (quindi a
partire da una query): eventuali query che fanno riferimento alla vista verranno risolte sostituendo il nome
della vista con la query che l’ha originata; le due query (interrogazione + vista) vengono quindi combinate.

La vista virtuale, quando interrogata, viene ricalcolata: i dati presenti vengono quindi eventualmente
aggiornati con quelli nuovi presenti dalle entità da cui derivano.

Esempio di vista
A partire dalle tabelle sottostanti…

...si potrebbe ottenere una vista Supervisione:

Supervisione=PROJ Impiegato ,Capo ( Afferenza JOIN Direzione)


La vista verrebbe quindi composta dall’entità risultato dell’operazione a destra dell’uguale.

Interrogazioni sulle viste


Le interrogazioni sulle viste vengono eseguite inserendo il nome della vista nella query:

SELCapo ¿ Leoni (Supervisione )


' '

La query in alto diventerebbe questo:

SELCapo ¿ Leoni ¿
' '

Come si può vedere nella seconda query, la dicitura Supervisione, che è il nome della vista, sostituisce la
query che compone la vista Supervisione.

Perché usare le viste

Le viste possono avere svariati impieghi, sia per usi pratici che per usi interni:

 Possono essere usate come schemi esterni, dove, in base al tipo di utente, è possibile visualizzare
di un’entità solo i dati ritenuti di interesse per lui, nascondendo ciò che non sarebbe autorizzato a
vedere;
 Si possono usare anche come strumento di programmazione, dove le viste possono essere usate
per semplificare la scrittura di interrogazioni, espressioni complesse e sotto espressioni ripetute.

L'utilizzo delle viste non influisce sull'efficienza delle interrogazioni.

Ad esempio, basandoci su queste tabelle:

Se si desidera trovare gli impiegati che hanno lo stesso capo di Rossi…

 Senza viste si avrebbe questa query:


 Con una vista Supervisione, formata dalla join tra Afferenza e Direzione, si avrebbe questo:

La questione aggiornamenti delle viste


Aggiornare una vista significherebbe modificare le relazioni di base in modo tale che la vista ricalcolata le
rispecchi un’altra volta.

Non è possibile stabilire un’unica politica di aggiornamento delle viste, perché quando si vanno ad
aggiornare le relazioni che la compongono, non è sempre detto che la vista, qualora venga aggiornata,
permetta di mantenere l’integrità dei dati che sarebbero memorizzati, e quindi non vi è un unico
aggiornamento che comporterebbe un’istanza della vista uguale a quella della relazione di base. Per evitare
infatti queste situazioni, molto spesso i DBMS pongono forti limitazioni sugli aggiornamenti delle viste, e –
in alcune condizioni - non lo consentono affatto.

Calcolo relazionale
Con il termine calcolo relazionale si fa riferimento a una famiglia di linguaggi di interrogazione, basati sul
calcolo dei predicati del primo ordine, che hanno la caratteristica di essere dichiarativi, ovvero che sono
linguaggi dove si dichiara che cosa si vuole ottenere, senza sapere come ciò che si desidera viene ottenuto.

Le principali versioni del calcolo relazionale sono due:

 Calcolo relazionale su domini: la versione più vicina al calcolo dei predicati;


 Calcolo su tuple con dichiarazioni di range: costituisce la base per molti dei costrutti impiegati nelle
interrogazioni in linguaggio SQL.

Sintassi del calcolo dei domini


Le espressioni del calcolo relazionale su domini hanno la forma:

{ A 1 : x 1 , … , Ak : x k ∨f }

 f è una formula, con connettori booleani e quantificatori;


 A1 : x1 , … , A k : xk : questa lista di coppia viene chiamata target list, che definisce la struttura del
risultato, ed è costituita da:
o A1, …, Ak: attributi distinti (che possono anche non comparire nello schema della base di
dati in cui viene formulata l’interrogazione);
o x1, …, xk: variabili distinte.

La formula f segue diverse regole:

 vi sono formule atomiche di due tipi:


o R( A 1 : x 1 , … , A p : x p), dove R( A 1 , … , A p ) è uno schema di relazione e x1, …, xp sono
variabili.
o x Θ y o x Θ c, con x e y variabili, c costante e Θ operatore di confronto (=, ≠, ≤, ≥, >, <).

È possibile anche avere delle formule composte: se f 1 e f2 sono formule e x è un simbolo di variabile, allora
f1 ∨ f2, f1 ∧ f2, ¬ f1 1e ∀x(f) ∃x(f) sono formule.

1
∨ = disgiunzione logica (OR) | ∧ = congiunzione logica (AND) | ¬ = negazione logica (NOT)
Semantica del calcolo dei domini
Il risultato di un’espressione è una relazione su A 1, …, Ak che contiene ennuple di valori per x 1, …, xk che
rendono vera la formula f.

R(A1: x1, …, Ak: xk) è vera sui valori di x1, …, xk che formano una tupla di R.

x Θ y è vera sui valori a1 e a2 se a1 Θ a2 è vero (simile per x Θ c).

Per gli operatori booleani valgono le solite definizioni:

 ∀x(f) è vera se per ogni valore a di x f è vera;


 ∃ x(f) è vera se esiste almeno un valore a di x che rende vera la formula.

Leggi di De Morgan
 ¬(A ∧ B) = (¬A) ∨ (¬B)
 ¬(A ∨ B) = (¬A) ∧ (¬B)

Inoltre:

 ∃x A = ¬(∀x ¬A)
 ∀x A = ¬(∃x ¬A)

Pregi e difetti del calcolo relazionale


Il calcolo relazionale presenta sia aspetti positivi e interessanti, come la dichiaratività, ma anche alcuni
aspetti negativi.

Primo fra tutti, il fatto che il calcolo relazionale accetta e consente anche relazioni prive di senso.

ad esempio, queste relazioni a sinistra sono prive di


senso innanzitutto perché sono tutte dipendenti da un
dominio, cosa che nessuno al mondo vorrebbe. Inoltre,
perché non pongono alcuna condizione sui valori
accettabili.

Inoltre, è anche da considerare la verbosità, ovvero la presenza di tante variabili in un’espressione.

Calcolo e algebra relazionale


Il calcolo relazionale e l’algebra relazionale sono equivalenti tra di loro:

 per ogni espressione del calcolo relazionale che sia indipendente dal dominio esiste un'espressione
dell'algebra relazionale equivalente ad essa;
 per ogni espressione dell'algebra relazionale esiste un'espressione del calcolo relazionale
equivalente a essa (e di conseguenza indipendente dal dominio).

Calcolo su ennuple con dichiarazioni di range


Per superare le limitazioni del calcolo dei domini bisogna ridurre le variabili in gioco: per fare questo si
potrebbe associare una sola variabile per ogni ennupla presente nell’espressione. Inoltre, si potrebbe fare
che i valori contenuti nell’espressione provengano direttamente dalla base di dati.
Per rispondere a queste esigenze si impiega il famosissimo ed incredibile

Sintassi delle formule


{TargetList ∨RangeList∨Formula }
RangeList: elenca (ciascuna una e una sola volta) le variabili libere della formula f con i relativi range.

TargetList: lista degli obiettivi dell'interrogazione, ha elementi del tipo Y: x.Z (oppure x.Z o anche x.*).

Formula: è costituita da:

 atomi del tipo x.A Θ c o x1.A1 Θ x2.A2. che confrontano, rispettivamente, il valore di x sull'attributo A
con la costante c e il valore di x1 su A1 con quello di X2 su A2:
 connettivi;
 quantificatori che associano i range alle relative variabili: ∃ x ( R )( f ) ∀ x (R)(f ).

“∃x(R)(f)” significa “esiste nella relazione R una tupla x che soddisfa la formula f”.

Limitazioni
Purtroppo, il calcolo su tuple con dichiarazioni di range non permette di esprimere tutte le interrogazioni
che possono essere formulate in algebra relazionale. In particolare, le interrogazioni i cui risultati possono
provenire indifferentemente da due o più relazioni (come, ad esempio, le unioni) non possono essere
espresse in questa versione del calcolo: infatti. i risultati sono costruiti a partire da tutte le variabili libere, i
cui range sono definiti nella target list, e ogni variabile ha come range una sola relazione.

Per questo motivo, SQL, il linguaggio pratico effettivamente utilizzato per l’interrogazione di basi di dati,
che è basato sul calcolo su tuple con dichiarazioni di range, prevede un costrutto esplicito di unione, questo
per esprimere interrogazioni che altrimenti risulterebbero non esprimibili.

Calcolo e algebra sono sostanzialmente equivalenti: l'insieme di interrogazioni con essi esprimibili è quindi
significativo; abbiamo quindi di conseguenza un concetto che è robusto.

Tuttavia, ci sono delle interrogazioni, anche di interesse, che non sono ancora esprimibili:

 calcolo di valori derivati: possiamo solo estrarre valori, non calcolarne di nuovi;
 interrogazioni ricorsive, come la chiusura transitiva.

Potrebbero piacerti anche