Documente Academic
Documente Profesional
Documente Cultură
BD Capitolul 2 Modelul Relational
BD Capitolul 2 Modelul Relational
MODELUL RELAIONAL
2.1. Conceptele de baz ale modelului relaional
Modelul relaional reprezint datele sub forma unor structuri bidimensionale,
asemntoare tabelelor. Proiectarea unui sistem care foloseste modelul relational este
flexibila, asfel incat modificarile sunt usor de implementat. Conceptele teoretice care
formeaza baza modelului relational au aparut la inceputul anilor 70 (Edgar F. Codd). Modelul
relational a devenit principalul model de baze de date si a fost adoptat de majoritatea
producatorilor de sofware din acest domeniu.
Avantaje:
- simplitate
- fundamentare matematica riguroasa
- independenta datelor (separarea aspectelor logice de cele fizice)
Elementele ce definesc modelul de date sunt:
- structurile de date folosite
- restrictiile impuse (constrangeri de integritate)
- operatorii ce actioneaza asupra structurilor de date
2.1.1. Structurile de date folosite
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
cod_
salariat
S1
S2
S3
S4
nume
Popescu
Ionescu
Manescu
Costache
prenume
Ion
Ana
Gina
Vasile
adresa
Ulmului, 3
Crisului, 7
Jietului, 8
data_
nastere
05.02.1980
01.12.1979
23.06.1979
11.01.1980
sex
M
F
F
M
cod_
departament
D1
D1
D2
D1
cod_
manager
S1
S1
S2
b) Fiecare atribut poate avea doar valori atomice, deci care nu se pot descompune din
punct de vedere logic.
c) Fiecare tuplu este unic si este unic tot timpul (nu sunt permise duplicatele).
- cheie candidata sau cheie un atribut sau un set de atribute care identifica in mod
unic un tuplu (ex.: cod_salariat, nume, prenume)
- cheie primara = una din cheile candidate
- chei alternative = restul de chei candidate (ex.: nume, prenume)
- cheie compusa = cheie formata din cel putin 2 atribute (ex.: nume, prenume)
- cheie minimala = cheia la care daca se elimina un atribut isi pierde calitatea de cheie
(nume, prenume)
- Null valoarea conventionala pentru un atribut cu valoare necunoscuta sau
neaplicabila
Obs. In structura unei chei primare nu exista nici o valoare Null.
- cheie straina un atribut sau o multime de atribute ale unei relatii R1 care exista si
intr-o alta relatie R2 (nu neaparat distincta de R1) si constituie cheie primara in R2.
Obs.: cheia straina din R1 face referinta la cheia primara din R2.
Exemplu: departament (cod_departament, denumire, localitate)
department
cod_departament
D1
D2
D3
D4
denumire
Analiza financiara
Depozit
Contabilitate
Magazin
localitate
Craiova
Bucuresti
Craiova
Slatina
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.
2.1.2. Constrngeri de integritate
Pentru asigurarea integritatii datelor, o baza de date trebuie sa satisfaca un numar de
constrangeri, numite constrangeri de integritate. Acestea sunt de doua tipuri:
- constrangeri structurale, care trebuie satisfacute de orice baza de date ce utilizeaza
modelul relational,
- constrangeri de comportament, care sunt specifice fiecarei baze de date, in particular.
A
x1
x1
x1
x2
R
B
y1
y1
y2
y2
C
z1
z2
z2
z1
C
z1
z2
z2
z1
Proiectie
C,A(R)
C
A
z1
x1
z2
x1
z1
x2
A
x1
x1
x1
x2
Eliminare duplicate
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
In SQL selectia se obtine folosind comanda SELECT cu clauza WHERE:
SELECT *
FROM R
WHERE A = x1 OR B = y1;
Combinarea selectiei cu proiectia fara dubluri se face in modul urmator:
SELECT DISTINCT C, A
FROM R
WHERE A = x1 OR B = y1;
Exemplu:
A
x1
x1
x1
x2
R
B
y1
y1
y2
y2
C
z1
z2
z2
z1
A
x1
x1
x1
B
y1
y1
y2
C
z1
z2
z2
C
z1
z2
A
x1
x1
C
z1
z2
z2
A
x1
x1
x1
R
B
y1
y1
y2
y2
C
z1
z2
z2
z1
A
x1
x1
x1
B
y1
y1
y2
C
z1
z2
z2
S
C
z1
z2
z1
D
z1
z2
E
u1
u2
A
x1
x1
x2
x2
x3
x3
B
y1
y1
y1
y1
y2
y2
RS
C
z1
z1
z2
z2
z1
z1
D
z1
z2
z1
z2
z1
z2
E
u1
u2
u1
u2
u1
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:
A
x1
x2
x3
R
B
y1
y1
y1
S
C
x1
x1
D
y1
y2
RS
A
B
x1
y1
x2
y1
x3
y1
x1
y2
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
In SQL diferenta se poate exprima folosind operatorul MINUS:
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
RS
A
B
C
D
A
B
x1
y1
x1
y1
x1
y1
x2
y1
x1
y2
x3
y1
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((R1S)-R),
iar X este multimea atributelor lui R care nu exista in S.
Pentru exemplul de mai sus:
R1
R1S
(R1S)-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
R1 R2
R2
A
x2
x2
x1
B
y1
y2
y2
A
x1
B
y1
S
C
1
3
5
D
2
4
E
z1
z2
A
x1
x1
x2
E
z1
z2
z2
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
nr_lucrator
1
2
3
4
5
lucrator atelier
cod_sectie
nr_atelier
S1
1
S1
2
S2
1
S1
2
S1
1
denumire
Proiectare
Informatica
Mecanica
Informatica
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.
SELECT lucrator. nr_lucrator, lucrator.cod_sectie, lucrator.nr_atelier, atelier.denumire
FROM lucrator, atelier
WHERE lucrator.cod_sectie = atelier.cod_sectie
AND lucrator.nr_atelier = atelier.nr_atelier;
SEMI-JOIN (semi-compunerea)
Operatia de semi-compunere aplicata asupra a doua relatii R si S genereaza o relatie
care contine toate tuplurile din R care sunt corelate macar cu un tuplu din S. Operatia nu este
comutativa si se noteaza de obicei prin SEMI-JOIN(R, S).
Exemplu:
R
S
SEMI-JOIN(R, S)
A
B
C
B
C
D
A
B
C
x1
y1
z1
y1
z1
u1
x1
y1
z1
x2
y1
z1
y2
z2
u2
x2
y1
z1
x3
y2
z1
y2
z2
u3
x4
y2
z2
x4
y2
z2
Urmatorul exemplu ilustreaza realizarea compunerii naturale in SQL:
SELECT DISTINCT R.A, R.B, R.C
FROM R, S
WHERE R.B = S.B
AND R.C = S.C;
OUTER-JOIN (compunerea externa)
nr_stud
1
2
3
4
5
Null
Null
student
nume
prenume
Popescu
Ionescu
Ionescu
Costache
Matache
nume
Popescu
Ionescu
Ionescu
Costache
Matache
Null
Null
Ion
Vasile
Viorel
Ion
Mihai
cod_
facultate
F1
F1
F2
F2
F1
cod_
facultate
F1
F2
F3
F4
facultate
nume_
facultate
Matematica
Fizica
Informatica
Mecanica
OUTERJOIN(student, facultate)
prenume cod_facultate
nume_facultate
Ion
F1
Matematica
Vasile
F1
Matematica
Viorel
F2
Fizica
Ion
F2
Fizica
Mihai
F1
Matematica
Null
F3
Informatica
Null
F4
Mecanica
localitate
Bucuresti
Bucuresti
Craiova
Ploiesti
localitate
Bucuresti
Bucuresti
Bucuresti
Bucuresti
Bucuresti
Craiova
Ploiesti