Documente Academic
Documente Profesional
Documente Cultură
MODELUL RELAŢIONAL
Vor fi scoase in evidenta pe un exemplu. Fie tabelul de mai jos cu cateva date despre
angajatii unei firme:
salariat (cod_salariat, nume, prenume, adresa, data_nastere, sex, cod_departament,
cod_manager)
salariat
department
Atributul cod_departament din relatia salariat reprezinta o cheie straina care face
referinta la cheia primara cod_departament din relatia departament.
Atributul cod_manager din relatia salariat este o cheie straina care face referinta la
cheia primara cod_salariat din relatia salariat.
d) Navigatia in cadrul modelului relational se face prin intermediul valorii pe care o ia un
atribut. Parametrii de intrare sunt numele de atribute si valorile posibile ale acestora.
Parametrii de iesire sunt tuplurile ce satisfac cerinta.
e) Tuplurile pot fi reprezentate utilizatorului in orice ordine. Deci acesta nu trebuie sa
faca nici o presupunere in privinta ordinii tuplurilor.
f) Atributele pot fi reprezentate utilizatorului in orice ordine. Deci acesta nu trebuie sa
faca nici o presupunere in privinta ordinii atributelor.
g) Relatiile sunt manipulate pentru a furniza utilizatorului diferite vederi asupra datelor.
Manipularea relatiilor are ca rezultat generarea de noi relatii.
In afara relatiilor şi a proprietatii acestora, modelul relational este definit si prin setul
de operatii care se pot efectua asupra acestor relatii. Există două moduri de descriere
matematică a acestor operatori, si anume algebra relatională si calculul relational.
Algebra relatională, introdusă de catre Codd, este formata dintr-o multime de opt
operatori, ce actioneaza asupra relatiilor si genereaza tot o relatie. Operatorii algebrei
relationale sunt fie operatorii traditionali pe multimi (UNION, INTERSECT, DIFFERENCE,
PRODUCT), fie operatori relationali speciali (PROJECT, SELECT, JOIN, DIVISION). Cum
iesirea generata de fiecare dintre acesti operatori este tot o relatie, este posibila combinarea si
compunerea lor. Cinci dintre operatori (PROJECT, SELECT, DIFFERENCE, PRODUCT,
UNION) sunt operatorii primari ai limbajului, iar ceilalti trei (JOIN, DIVISION,
INTERSECT) sunt operatori derivati, putand fi definiti in functie de primii. Unii dintre
operatori se aplica unei singure relatii (operatori unari), iar altii opereaza asupra a doua relatii
(operatori binari).
Calculul relational reprezinta o adaptare a calculului predicatelor la domeniul bazelor
de date relationale. Ideea de baza este de a identifica o relatie cu un predicat. Pe baza unor
predicate initiale, prin aplicarea unor operatori ai calculului cu predicate (conjunctia,
disjunctia, negatia, cuantificatorul existential si cel universal) se pot defini noi predicate, adica
noi relatii.
Acesta este un operator care are ca parametri un atribut sau mai multe atribute ale unor relatii
si care elimina din relatie toate celelalte atribute, producand o submultime “pe verticala” a
acesteia. Datorita faptului ca suprimarea unor atribute poate avea ca efect aparitia unor tupluri
duplicate, acestea vor fi eliminate din relatia rezultata deoarece, prin definitie, o relatie nu
poate contine tupluri cu valori identice. Notatiile folosite de obicei pentru acest operator sunt:
ΠX(R) si PROJECT(R, X), unde R reprezinta relatia, iar X este atributul sau multimea de
atribute care constituie parametrii proiectiei.
Exemplu:
R ΠC,A(R)
A B C C A C A
x1 y1 z1 z1 x1 z1 x1
x1 y1 z2 z2 x1 z2 x1
x1 y2 z2 z2 x1 z1 x2
x2 y2 z1 z1 x2
Proiectie Eliminare duplicate
Acesta este un operator unar care este utilizat pentru extragerea tuturor tuplurilor
dintr-o relatie care satisfac o conditie specificata, producand astfel o submultime“ pe
orizontala” a relatiei. Conditia este o expresie logica ce poate contine nume de atribute,
constante, operatori logici (AND, NOT, OR), operatori de comparatie (<, =, >, <=, >=, !=).
Notatiile folosite de obicei pentru acest operator sunt σC(R) sau SELECT(R, C), unde R
reprezinta relatia, iar C este conditia care trebuie satisfacuta de tuplurile selectate.
Exemplu:
R σA=’x1’ OR B=’y1’(R)
A B C A B C
x1 y1 z1 x1 y1 z1
x1 y1 z2 x1 y1 z2
x1 y2 z2 x1 y2 z2
x2 y2 z1
SELECT *
FROM R
WHERE A = ‘x1’ OR B = ‘y1’;
SELECT DISTINCT C, A
FROM R
WHERE A = ‘x1’ OR B = ‘y1’;
Exemplu: R
A B C A B C C A
x1 y1 z1 x1 y1 z1 z1 x1
x1 y1 z2 x1 y1 z2 z2 x1
x1 y2 z2 x1 y2 z2
x2 y2 z1
Exemplu: R
A B C A B C C A
x1 y1 z1 x1 y1 z1 z1 x1
x1 y1 z2 x1 y1 z2 z2 x1
x1 y2 z2 x1 y2 z2 z2 x1
x2 y2 z1
Acesta este un operator binar. Produsul cartezian al doua relatii R si S este multimea
tuturor tuplurilor care se obtin prin concatenarea unui tuplu din R cu un tuplu din S. Prin
urmare, daca aritatea relatiei R este m, iar aritatea relatiei S este n, atunci produsul cartezian
dintre r si S va avea aritatea m + n. Notatiile folosite de obicei pentru acest operator sunt:
R × S, PRODUCT(R, S), TIMES(R, S).
Exemplu:
R S R×S
A B C D E A B C D E
x1 y1 z1 z1 u1 x1 y1 z1 z1 u1
x2 y1 z2 z2 u2 x1 y1 z1 z2 u2
x3 y2 z1 x2 y1 z2 z1 u1
x2 y1 z2 z2 u2
x3 y2 z1 z1 u1
x3 y2 z1 z2 u2
Produsul cartezian va fi exprimat in SQL printr-o comanda SELECT pe mai multe tabele fara
clauza WHERE:
SELECT *
FROM R, S;
Compatibilitatea la reuniune
Doua relatii R si S se numesc compatibile la reuniune daca ele contin acelasi numar de
atribute (au aceeasi aritate) si atributele cu acelasi numar de ordine din fiecare relatie au
acelasi domeniu din care pot lua valori. Operatorii UNION, INTERSECT, DIFFERENCE,
prezentati in continuare sunt operatori binari ce nu pot fi aplicati decat asupra relatiilor
compatibile la reuniune.
UNION (reuniunea)
Reuniunea a doua relatii R si S este multimea tuplurilor apartinand fie lui R, fie lui S.
Reuniunea celor doua multimi va cuprinde fiecare tuplu o singura data, chiar daca el face
parte din amandoua multimile. Reuniunea se poate aplica doar relatiilor compatibile la
reuniune. Notatiile folosite de obicei pentru acest operator sunt R ∪ S sau UNION(R, S).
Reuniunea este o operatie binara comutativa, adica R ∪ S = S ∪ R.
Exemplu:
R S R∪S
A B C D A B
x1 y1 x1 y1 x1 y1
x2 y1 x1 y2 x2 y1
x3 y1 x3 y1
x1 y2
SELECT A, B
FROM R
UNION
SELECT C, D
FROM S;
DIFFERENCE (diferenta)
Diferenta a doua relatii R si S este multimea tuplurilor care apartin lui R, dar nu
apartin lui S. Diferenta este o operatie binara necomutativa, adica R - S ≠ S – R, care se poate
aplica doar relatiilor compatibile la reuniune. Notatiile folosite de obicei pentru acest operator
sunt: R-S, DIFFERENCE(R, S), MINUS(R, S).
Exemplu:
R S R-S
A B C D A B
x1 y1 x1 y1 x2 y1
x2 y1 x1 y2 x3 y1
x3 y1
SELECT A, B
FROM R
MINUS
SELECT C, D
FROM S;
In plus, diferenta poate fi simulata si prin operatorul NOT EXISTS. De exemplu,
comanda SQL de mai sus este echivalenta cu urmatoarea:
SELECT A, B
FROM R
WHERE NOT EXISTS
(SELECT *
FROM S
WHERE R.A = S.C AND R.B = S.D);
Obs. Pentru simplitate, in comanda SQL de mai sus s-a presupus ca nici un atribut din
relatiile R sau S nu poate avea valoarea Null.
INTERSECT (intersectia)
Intersectia a doua relatii R si S este multimea tuplurilor care apartin atat lui R cat si lui S.
Intersectia este o operatie binara comutativa care se poate aplica doar relatiilor compatibile la
reuniune. Notatiile folosite de obicei pentru acest operator sunt R ∩ S, INTERSECT(R, S),
AND(R, S). Intersectia este un operator derivat, putand fi exprimat cu ajutorul reuniunii si
diferentei:
R ∩ S = R – (R – S) sau R ∩ S = S – (S – R)
Exemplu:
R S R∩S
A B C D A B
x1 y1 x1 y1 x1 y1
x2 y1 x1 y2
x3 y1
SELECT A, B
FROM R
WHERE EXISTS
(SELECT *
FROM S
WHERE R.A =S.C AND R.B = S.D);
SELECT A, B
FROM R
WHERE A = ‘x1’
MINUS
SELECT A, B
FROM R
WHERE B = ‘y1’;
SELECT A, B
FROM R
WHERE A = ‘x1’ AND NOT B = ‘y1’;
DIVISION (diviziunea)
Diviziunea este o operatie binara care se aplica asupra a doua relatii R si S, astfel incat
multimea atributelor lui R include multimea atributelor lui S. Daca R este o relatie cu aritatea
m, iar S este o relatie cu aritatea n, unde m > n, atunci diviziunea lui R la S este multimea
tuplurilor de dimensiune m – n la care, adaugand orice tuplu din S, se obtine un tuplu din R.
Notatiile utilizate cel mai frecvent sunt: R ÷ S, DIVISION(R, S), DIVIDER(R, S).
Ex.: R S R÷S
A B C C A B
x1 y1 z1 z1 x1 y1
x1 y2 z1 z2
x1 y1 z2
x2 y1 z2
x2 y2 z2
Diviziunea este o operatie derivata care se exprima cu ajutorul diferentei, produsului cartezian
si proiectiei: R ÷ S = R1 – R2 unde
R1 = ΠX(R), R2 = ΠX((R1×S)-R),
iar X este multimea atributelor lui R care nu exista in S.
Pentru exemplul de mai sus:
R1 R1×S (R1×S)-R
A B A B C A B C
x1 y1 x1 y1 z1 x2 y1 z1
x1 y2 x1 y2 z1 x2 y2 z2
x2 y1 x2 y1 z1 x1 y2 z3
x2 y2 x2 y2 z1
x1 y1 z2
x1 y2 z2
x2 y1 z2
x2 y2 z2
R2 R1 ÷ R2
A B A B
x2 y1 x1 y1
x2 y2
x1 y2
Operatorul de compunere permite regasirea informatiei din mai multe relatii corelate.
Compunerea este o operatie binara care are ca rezultat o noua relatie in care fiecare tuplu este
o combinatie a unui tuplu din prima relatie cu un tuplu din a doua relatie.
Operatorul JOIN este un operator derivat, putand fi simulat printr-o combinatie de
produs cartezian, selectie si proiectie. In general, se construieste un produs cartezian, se
elimina tupluri prin selectie si se elimina atribute prin proiectie. Dupa modalitatile in care se
face selectia si proiectia, se disting mai multe tipuri de compunere: THETA-JOIN,
NATURAL-JOIN, SEMI-JOIN, OUTER-JOIN. Fiecare dintre acestea vor fi prezentate in
continuare.
THETA-JOIN
Exemplu:
R S JOIN (R, S, C < D)
A B C D E A B C D E
x1 y1 1 2 z1 x1 y1 1 2 z1
x2 y2 3 4 z2 x1 y1 1 4 z2
x3 y3 5 x2 y2 3 4 z2
SELECT *
FROM R, S
WHERE R.C < S.D;
Compunerea naturala este o operatie binara comutativa care combina tupluri din doua
relatii, R, S, cu conditia ca atributele comune sa aiba valori identice. In cazul compunerii
naturale atributele specificate trebuie sa aiba acelasi nume. Practic diferenta dintre
NATURAL-JOIN si EQUI-JOIN consta in faptul ca in primul caz numele atributelor sunt
identice iar in cel de-al doilea caz acestea sunt diferite. De obicei, compunerea naturala se
noteaza prin R ►◄ S sau JOIN(R, S).
Pentru doua relatii R si S, compunerea naturala pe un set de atribute comune X consta
in efectuarea succesiva a urmatoarelor operatii:
1. Se calculeaza produsul cartezian R × S.
2. Se selecteaza din R × S acele tupluri obtinute pentru care valorile atributelor X din
tuplul R sunt identice cu valorile atributelor X din tuplul S.
3. Deoarece in relatia astfel obtinuta atributele X apar de doua ori (o data provenind din
R si o data din S), se elimina una dintre aparitiile acestor atribute.
Exemplu:
lucrator atelier
nr_lucrator cod_sectie nr_atelier cod_sectie nr_atelier denumire
1 S1 1 S1 1 Proiectare
2 S1 2 S1 2 Informatica
3 S2 1 S2 1 Mecanica
4 S1 2 S2 2 Electrotehnica
5 S1 1
lucrator ►◄ atelier
nr_lucrator cod_sectie nr_atelier denumire
1 S1 1 Proiectare
2 S1 2 Informatica
3 S2 1 Mecanica
4 S1 2 Informatica
5 S1 1 Proiectare
In exemplul de mai sus, (cod_sectie, nr_atelier) este cheie primara in tabelul atelier si
cheie straina in tabelul lucrator.
Mai jos este ilustrata realizarea compunerii naturale in SQL.
SEMI-JOIN (semi-compunerea)
Exemplu:
student facultate
nr_ nume prenume cod_ cod_ nume_ localitate
stud facultate facultate facultate
1 Popescu Ion F1 F1 Matematica Bucuresti
2 Ionescu Vasile F1 F2 Fizica Bucuresti
3 Ionescu Viorel F2 F3 Informatica Craiova
4 Costache Ion F2 F4 Mecanica Ploiesti
5 Matache Mihai F1
OUTERJOIN(student, facultate)
nr_stud nume prenume cod_facultate nume_facultate localitate
1 Popescu Ion F1 Matematica Bucuresti
2 Ionescu Vasile F1 Matematica Bucuresti
3 Ionescu Viorel F2 Fizica Bucuresti
4 Costache Ion F2 Fizica Bucuresti
5 Matache Mihai F1 Matematica Bucuresti
Null Null Null F3 Informatica Craiova
Null Null Null F4 Mecanica Ploiesti