Sunteți pe pagina 1din 27

Curs 6

Formele normale ale unei relaii (II)


Interogarea bazelor de date cu operatori din algebra relaional

Formele normale ale unei relaii (II)


Definiie. O relaie este de prima form normal
(1NF) dac ea nu conine atribute repetitive.
1NF

Definiie. O relaie este de a doua form normal


(2NF) dac:
este de prima form normal,
orice atribut (simplu sau compus) neprim (deci
care nu este inclus ntr-o cheie) este complet
dependent funcional de oricare cheie a
relaiei.

2NF
3NF
BCNF
4NF
5NF

Definiie. O relaie este de a treia form normal


(3NF) dac este 2NF i orice atribut neprim nu
este tranzitiv dependent de oricare cheie a
relaiei.

Descompunerea unei relaii: operatorul de proiecie


Compunerea relaiilor: operatorul de joinul natural

Exemplu. S considerm urmtoarea relaie care memoreaz o eventual planificare a


studenilor pentru examene:
PLANIFICARE_EX [Data, Ora, Cadru_did, Sala, Grupa],
cu cteva restricii (cerine ce trebuie respectate) care se transpun prin definirea de chei sau
prin respectarea unei dependene funcionale:
1. O grup de studeni d maximum un examen ntr-o zi, deci {Data, Grupa} este cheie.
2. Un cadru didactic are examen cu o singur grup la o anumit dat i or, deci
{Cadru_did, Data, Ora} este cheie.
3. La un moment dat (zi, ora) ntr-o sal este planificat cel mult un examen, deci
{Sala, Data, Ora} este cheie.
4. Intr-o zi cadrul didactic nu schimb sala, n sala respectiv pot fi planificate i alte
examene, dar la alte ore, deci exist urmtoarea dependen funcional:
{Cadru_did, Data} {Sala}
Toate atributele din aceast relaie apar n cel puin o cheie, deci nu exist atribute
neprime. Avnd n vedere definiia formelor normale precizate pn acuma, putem spune c
relaia este n 3NF. Pentru a elimina i dependena funcional amintit mai sus s-a introdus o
nou form normal:
Definiie. O relaie este n 3NF Boyce-Codd, sau BCNF, dac orice determinant
(pentru o dependen funcional) este cheie, deci nu exist dependene funcionale
astfel nct s nu fie cheie.

Pentru a elimina dependena funcional amintit n exemplul de mai sus trebuie s


facem urmtoarea descompunere pentru relaia PLANIFICARE_EX:
PLANIFICARE_EX [Data, Cadru_did, Ora, Grupa],
REPARTIZARE_SALI [Cadru_did, Data, Sala].
Dup aceast descompunere nu mai exist dependene funcionale, deci relaiile sunt de
tipul BCNF, dar a disprut cheia asociat restriciei precizate la punctul 3 de mai sus:
{Sala, Data, Ora}. Dac se mai dorete pstrat o astfel de restricie, atunci ea trebuie verificat
altfel (de exemplu, prin program).

Fie relaia:
DCS [Departament, CadruDidactic, DataSedinta],
CDI1
CDI2
O nregistrare n aceast relaie ar putea s fie de tipul dat
.
n tabelul alturat.
.
.
Pentru a nu avea atribute repetitive (pentru ca relaia s fie
CDIm
cel puin n 1NF) trebuie s memorm datele din aceast
Matematica CDM1
nregistrare ca n tabelul de mai jos (s-a trecut date numai pentru
CDM2
o nregistrare din primul tabel).
.
Informatica
CDI1
DI1
.
In acest tabel fiecare cadru didactic
Informatica
CDI1
DI2
.
are aceleai date pentru edin,
........
...
...
CDMp
deci
la
adugarea,
modificarea
sau
Informatica
CDI1
DIn
tergerea liniilor din tabel trebuie fcute unele verificri
Informatica
CDI2
DI1
suplimentare.
Informatica
CDI2
DI2

unde atributele CadruDidactic i DataSedinta sunt repetitive.

........

...

...

Informatica

DI1
DI2
.
.
.
DIn
DM1
DM2
.
.
.
DMq

Dup cum s-a precizat, dependena funcional simpl nseamn c la fiecare


valoare u a lui i se asociaz o valoare unic v pentru .
Definiie. Dependena funcional multipl ( este multiplu dependent
funcional de ) presupune c o valoare u a lui are asociat o mulime de valori v pentru
: (u)={v1, v2, ..., vn}, iar aceast asociere este valabil indiferent de valorile din
= A (unde A este mulimea de atribute din relaie, deci A = ).
Fie R[A] o relaie, o dependen funcional multipl, iar A = , cu
mulime nevid. Asocierea valorilor din (u) pentru la valoarea u a lui are loc indiferent de
valorile lui (indiferent de context). Aceasta nseamn c pentru orice valoare w a lui se
regsesc aceste asocieri (ntre u i un element din (u)), deci w ( = u (R ) ) , r1 , ..., rn astfel
nct ( r ) = u, ( r ) = v , ( r ) = w .
i i
i
i
Dac i avem:

atunci mai trebuie s apar i valorile:

u1 v1 w1

u1 v1 w2

u1 v2 w2

u1 v2 w1

Proprietate: Dac i A = , atunci .


Justificare. Fie u o valoare a lui din relaia R. Valorile lui i din nregistrrile unde pentru
avem valoarea u sunt: (u ) = ( = u ( R ) ) i (u ) = ( = u ( R ) ) .
Din se obine:
w (u ), v (u ), r = (u, v, w), sau:
v (u ), w (u ), r = (u, v, w),

deci .
Pentru relaia DCS (din ex.precedent) avem:
{Departament} {CadruDidactic}, dar i {Departament} {DataSedinta}
Dac R are n schem numai atributele i , deci R[, ], atunci avem numai o
dependen funcional multipl trivial.
Dac R[, , ], i nu este vid, deci exist o dependen funcional multipl
netrivial, atunci se pune problema eliminrii aceste dependene funcionale (pentru a nu face
verificri suplimentare).
Definiie. O relaie R este n 4NF dac este BCNF i nu conine dependene
funcionale multiple netriviale.

Dac R[, , ], i exist , atunci R se descompune astfel:


R [ , ] =
( R)

1
R [ , ] =
( R)
2

Pentru relaia DCS din exemplul dat se obine descompunerea:
DC [Departament, CadruDidactic]
DS [Departament, DataSedinta]

Atunci cnd apare o dependen funcional (simpl, multipl) ea se elimin prin


descompunerea relaiei n relaii noi. Exist relaii fr dependene funcionale care mai
conin informaii redundante, deci care pot genera erori n baza de date.
Exemplu. Fie relaia: PrSeDi [Profesor, Sectie, Disciplina],
care memoreaz seciile i disciplinele la care predau diferite cadre didactice. Aceast relaie
nu are dependene funcionale. Cheia relaiei este {Profesor, Sectie, Disciplina}.
Considerm urmtoarele date n relaie (tabelul de mai jos).
Pr

Se Di

P1 S1 D2
P1 S2 D1
P2 S1 D1

Exist unele date redundante (apar unele asocieri n mai multe nregistrri):
profesorul P1 pred la secia S1
profesorul P1 pred disciplina D1
la secia S1 se pred disciplina D1

Dac se dorete s se schimbe valorile din relaie, ca de exemplu: "profesorul


P1 s predea disciplina D3 n locul disciplinei D1", atunci trebuie fcute mai
multe modificri, fr s se tie n cte nregistrri. La fel se ntmpl pentru modificrile "la
secia S1 n locul disciplinei D1 s se predea disciplina D3", "profesorul P1 pred la secia S3 n
locul seciei S1".
P1 S1 D1

Relaia de mai sus nu se poate descompune n dou relaii (prin proiecie), pentru c prin
join se introduc date noi. Justificm aceast afirmaie prin cele trei proiecii posibile pe dou
atribute.

PrSe Pr
P1
P1
P2

Se
S1
S2
S1

SeDi Se
S1
S2
S1

Di
D2
D1
D1

PrDi

Pr
P1
P1
P2

Di
D2
D1
D1

Dac se evalueaz PrSe * SeDi se obin datele:


R' = PrSe * SeDi Pr
P1
P1
P1
P2
P2

Se
S1
S1
S2
S1
S1

Di
D2
D1
D1
D2
D1

In aceast relaie rezultat se obine o linie suplimentar fa de relaia iniial. La fel se


ntmpl i pentru alte combinaii de join: PrSe * PrDi i SeDi * PrDi.
Dac ns se calculeaz R' * PrDi, deci dac se evalueaz PrSe * SeDi * PrDi, atunci se
obine relaia iniial PrSeDi.
Concluzie: PrSeDi nu se descompune n dou proiecii, dar se poate face
descompunerea n trei proiecii, deci PrSeDi este 3-decompozabil:
PrSeDi = PrSe * SeDi * PrDi, sau PrSeDi = * (PrSe, SeDi, PrDi)

Concluzia amintit (PrSeDi este 3-decompozabil) este valabil pentru datele precizate
n relaie. Pentru a fi adevrat indiferent de date, trebuie s fie ndeplinite anumite restricii. O
astfel de restricie ar fi:
if (P1, S1) PrSe and (P1, D1) PrDi and (S1, D1) SeDi then (P1, S1, D1) PrSeDi
Aceast restricie se poate nlocui cu alta:
if (P1, S1, D2) PrSeDi and (P1, S2, D1) PrSeDi and (P2, S1, D1) PrSeDi
then (P1, S1, D1) PrSeDi
Considerm urmtoarele date n relaie, cu respectarea restriciei de mai sus:
Pr

Se Di

P1 S1 D2
P1 S2 D1
Pr

Dac (P2, S1, D1) se adaug la relaie, atunci trebuie adugat i nregistrarea
(P1, S1, D1)

Se Di

P1 S1 D2
P1 S2 D1
P2 S1 D1
P1 S1 D1

Dac se terge (P1, S1, D1) din relaie, atunci trebuie terse i alte date, cel
puin (P2, S1, D1) pentru ca restricia s fie ndeplinit.

Definiie. Fie R[A] o relaie i Ri[i], i=1,...,m, proieciile relaiei R pe i. In R exist o


dependen join dac R=R1 * ... * Rm, m>=2.
Exemplu. In PrSeDi exist o dependen join deoarece PrSeDi = PrSe * SeDi * PrDi.
Definiie. Dependena join R=R1 * ... * Rm, Ri[i], este trivial dac i este cheie pentru
R, i=1, ...,m.
Definiie. O relaie R este 5NF dac e 4NF i nu exist dependene join netriviale.
Dac ntr-o relaie R exist o dependen join R=R1 * ... * Rm, atunci se descompune n
relaiile Ri, i=1, ...,m.
Referine:
[Da04] DATE, C.J., An Introduction to Database Systems (8th Edition), Addison-Wesley, 2004,
cap. 11, 12.
[Ga08] GARCIA-MOLINA, H., ULLMAN, J., WIDOM, J., Database Systems: The Complete
Book, Pearson Prentice Hall, 2008], cap.3.
[Ra07] RAMAKRISHNAN, R., Database Management Systems. McGraw-Hill, 2007, cap. 15,
http://pages.cs.wisc.edu/~dbbook/openAccess/thirdEdition/slides/slides3ed.html
http://infolab.stanford.edu/~ullman/fcdb/slides/slides3.pdf
http://infolab.stanford.edu/~ullman/fcdb/slides/slides4.pdf

Interogarea bazelor de date cu operatori din algebra relaional


Tipurile de condiii ce apar n cadrul diferiilor operatori relaionali. Aceste condiii se
evalueaz pentru fiecare nregistrare (linie) din relaie (tabel). Condiiile sunt asemntoare
cu condiiile de filtrare de la instruciune select-sql.
1. Pentru a verifica dac un atribut ndeplinete o condiie simpl se face compararea acestuia
cu o anumit valoare, sub forma:
nume atribut operator_relaional valoare
2. O relaie cu o singur coloan poate fi considerat ca o mulime. Urmtoarea condiie
testeaz dac o anumit valoare aparine sau nu unei mulimi:

IS IN
relaie_cu_o_coloan
IS NOT IN

nume_atribut

3. Dou relaii (considerate ca mulimi de nregistrri) se pot compara prin operaiile de


egalitate, diferit, incluziune, neincluziune. Intre dou relaii cu acelai numr de
coloane i cu aceleai tipuri de date pentru coloane (deci ntre dou mulimi comparabile)
putem avea condiii de tipul urmtor:

IS IN
IS NOT IN

relaie
relaie
=

<>
4. Condiie este i oricare din construciile urmtoare:
(condiie)
NOT condiie
condiie1 AND condiie2
condiie1 OR condiie2
unde condiie, condiie1, condiie2 sunt condiii de tipurile 1-4.
In primul tip de condiie apare construcia 'valoare', care poate fi una din tipurile
urmtoare. Pentru fiecare construcie se ia pentru valoare o anumit relaie curent, care
rezult din contextul n care apare aceasta.

nume_atribut - care precizeaz valoarea atributului dintr-o nregistrare curent. Dac


precizarea numai a numelui atributului creaz ambiguitate (exist mai multe relaii curente
care conin cte un atribut cu acest nume), atunci se va face o calificare a atributului cu
numele relaiei sub forma: relaie.atribut.

expresie - se evalueaz expresia, iar dac apar i denumiri de atribute, atunci acestea se
iau dintr-o nregistrare curent.

COUNT(*) FROM relaie - precizeaz numrul de nregistrri din relaia specificat.

COUNT
SUM

AVG ([DISTINCT] expresie) FROM relaie


MAX

MIN
care determin o valoare folosind toate nregistrrile din relaia curent. La determinarea
acestei valori se iau toate valorile atributului precizat ca argument (din toate nregistrrile),
sau numai valorile distincte, dup cum lipsete sau apare cuvntul DISTINCT. Valorile
astfel determinate sunt: numrul de valori (pentru COUNT), suma acestor valori (apare
SUM, valorile trebuie s fie numerice), valoarea medie (apare AVG, valorile trebuie s fie
numerice), valoarea maxim (apare MAX), respectiv valoarea minim (apare MIN).

In continuare se vor preciza operatorii care se pot folosi pentru interogarea bazelor de
date relaionale.
Pentru expresiile din algebra relaional se pot preciza instruciuni echivalente cu
SELECT-SQL.

Selecia a unei relaii R - determin o nou relaie ce are aceeai schem cu a relaiei R.
Din relaia R se iau numai nregistrrile care ndeplinesc o condiie c. Notaia pentru acest
operator este:

c (R ) .

Echivalent: select * from R where C

Proiecia - determin o relaie nou ce are atributele precizate printr-o mulime de


atribute. Din fiecare nregistrare a unei relaii R se determin numai valorile atributelor
incluse n mulimea . Mulimea de atribute se poate extinde la o mulime de expresii
(n loc de o mulime de atribute), care precizeaz coloanele relaiei care se construiete.
Notaia pentru acest operator este:

(R) .

Echivalent: select all from R

Produsul cartezian a dou relaii: R1R2 - care determin o relaie nou ce are ca atribute
concatenarea atributelor din cele dou relaii, iar fiecare nregistrare din R1 se concateneaz
cu fiecare nregistrare din R2.
Echivalent: select * from R1 cross join R2

Reuniunea, diferena i intersecia a dou relaii: R1 R2 , R1 - R2 , R1 R2 . Cele dou


relaii trebuie s aib aceeai schem (sau scheme "compatibile").
Echivalent:
select * from R1 union all select * from R2
select * from R1 except select * from R2
select * from R1 intersect select * from R2

Exist mai muli operatori join.


Joinul condiional sau theta join, notat prin R1 R2 - care determin acele nregistrri
din produsul cartezian al celor dou relaii care ndeplinesc o anumit condiie. Din definiie
se observ c avem: R1 R2 = ( R1 R2 ) .
Echivalent: select * from R1 inner join R2 on
Joinul natural, notat prin R1 R2 , care determin o relaie nou ce are ca atribute
reuniunea atributelor din cele dou relaii, iar nregistrrile se obin din toate perechile de
nregistrri ale celor dou relaii care au aceleai valori pentru atributele comune. Dac
cele dou relaii au schemele R1 [ ], R2 [ ] , i = {A1 , A2 ,..., Am }, atunci joinul natural se
poate calcula prin construcia urmtoare:
R1 R2 =

R1

R
2

R . A = R . A and ... and R . A = R . A


1 1
2 1
1 m
2 m

Echivalent: select * from R1 natural join R2


Joinul extern stnga, notat (n acest material) prin R1 C R2 , determin o relaie nou ce
are ca atribute concatenarea atributelor din cele dou relaii, iar nregistrrile se obin
astfel: se iau nregistrrile care se obin prin joinul condiional R1 c R2, la care se adaug
nregistrrile din R1 care nu s-au folosit la acest join condiional combinate cu valoarea null
pentru toate atributele corespunztoare relaiei R2.
Echivalent: select * from R1 left outer join R2 on
Joinul extern dreapta, notat prin R1 C R2 , se obine asemntor ca joinul extern stnga,
dar la nregistrrile din R1 c R2 se adaug nregistrrile din R2 care nu s-au folosit la acest
join condiional combinate cu valoarea null pentru toate atributele corespunztoare relaiei
R1.
Echivalent: select * from R1 right outer join R2 on
Joinul extern complet, notat prin R1 C R2, este reuniunea rezultatelor obinute cu join
extern stnga i join extern dreapta.
Echivalent: select * from R1 full outer join R2 on
Semi joinul stnga, notat prin R1 R2 , determin o relaie nou ce conine nregistrrile
din R1 utile pentru joinul natural R1 R2.

Semi joinul dreapta, notat prin R1 R2 , conine nregistrrile din R2 utile pentru joinul
natural R1 R2.

Ctul pleac de la dou relaii R1 [ ], R2 [ ] ,


cu , i se noteaz prin R1 R2 [ ] .
Deducem c atributele din ct sunt date de
mulimea . O nregistrare r R1 R2 dac
r2 R2 , r1 R1 ce ndeplinete condiiile:
1.

(r1 ) = r ;

2.

(r1 ) = r2 .

Semnificaia relaiei ct se vede i din figura


alturat. O nregistrare r aparine ctului dac n
relaia R1 apar toate concatenrile dintre aceast
nregistrare i fiecare nregistrare din R2.

R1

r2

rr1
r2

r2

R2

O problem important legat de operatorii descrii mai sus const n determinarea unei
submulimi independente de operatori. O mulime M de operatori este independent dac
eliminnd un operator oarecare op din M se diminueaz puterea mulimii, adic va exista o
relaie obinut cu operatori din M i care nu se poate obine cu operatori din mulimea M - {op}.
Pentru limbajul de interogare descris mai sus, cu operatorii:

{ , , , , , , , ,

, , , , , }

o mulime independent este format din submulimea: { , , , , }. Ceilali operatori se


obin dup relaiile urmtoare (unele expresii au fost deja deduse mai sus):

R1 R2 = R1 ( R1 R2 ) ;

R1 c R2= c ( R1 R2 ) ;

R1 [ ], R 2[ ] , i = {A1 , A2 ,..., Am }, atunci


R1 R2 =

R1
R2 ;

R . A = R . A and ... and R . A = R . A


1 1
2 1
1 m
2 m

Fie R1 [ ], R 2[ ] , i: R3 [ ] = {(null, ... , null)}, R4 [ ] = {(null, ... , null)}.


R1 C R2 = (R1 c R2) [R1 -

(R

R1 C R2 = (R1 c R2) R4 [R2 -

(R

R1 C R2 = (R1 C R2) (R1 C R2).

Fie R1 [ ], R 2[ ] . Se deduce:
R1 R2 =

(R

R2 ) ,

R1 R2 =

(R

R2 ) .

C R2 ) ] R3 .
1

C R2 ) ].

Dac R1 [ ], R2 [ ] , cu , atunci r R1 R2 dac


r2 R1 R2 , r1 R1 ce ndeplinete condiiile:
(r1 ) = r i (r1 ) = r2 .

R1

De aici deducem c r este din


toate elementele din

( R1 )

( R1 ) ,

dar nu

r2

r2

apar n ct.

In ( R1 ) R2 sunt toate elementele ce au o

parte n ( R1 ) i a doua parte n R2. Din relaia

r2

astfel obinut vom elimina pe R1 i rmn acele


elemente ce au o parte n (R1 ) i nu au
cealalt parte n

( R1 ) .

De aici obinem:

((

rr1

R R = ( R ) ( R ) R R .
1
2
1
1
2
1

R2

Pentru a putea da cteva exemple de utilizare a acestui limbaj de interogare vom


introduce urmtoarele instruciuni:

Atribuirea: unei variabile R[lista] (care va desemna o relaie i eventuala denumire a


coloanelor) i vom atribui o relaie dat printr-o expresie construit cu operatorii de mai sus:
R[lista] := expresie

Eliminarea duplicrilor unei relaii: (R )

Sortarea nregistrrilor dintr-o relaie: s


( R)
{lista}

Gruparea:

( R ) , care este o extensie pentru proiecie. Inregistrrile


{lista1} group by {lista2}
din R sunt grupate dup coloanele din lista2, iar pentru un grup de nregistrri cu aceleai
valori pentru lista2 se evalueaz lista1 (unde pot apare i funcii de grupare).

Exemple cu operatorii din algebra relaional se vor da pentru urmtoarea baz de date
relaional:
studenti [cod, nume, grupa, media, datanasterii]
grupe [cod, an, sectia]
orar [zi, orainc, orasf, tipactiv, sala, grupa, cod_cadrudid]
cadredid [cod, nume]
1. Numele studenilor dintr-o grup dat

R := {nume} ( grupa = ' 281' (studenti ))


select nume from studenti where grupa='281'
2. Studentii de la o anumit secie (lista alfabetic pe grupe)

(grupe )
G := { }
cod sec tia =' S '

(studenti )
R := S {
grupa, nume} grupa is in G

select grupa,nume
from studenti
where grupa is in (select cod from grupe where sectia='S')

3. Numrul de studeni din fiecare grup a unei secii date:

ST :=

grupa is in

cod

sec tia =' S '

grupe

(studenti )

(ST )
NR := {
grupa, count (*)} group by {grupa }
select grupa,count(*)
from
(select * from studenti
where grupa is in (select cod from grupe where sectia='S')
)
group by grupa
4. Orarul unui student dat

T :=

grupa is in

grupa

nume =' nume _ dat '

studenti

(orar )

5. Numrul orelor, dintr-o sptmn, pentru fiecare grup


F (nr , grupa ) := {
(orar )
orasf orainc, grupa }
NrOre( grupa , nrore) :=
(F )
{grupa , sum( nr )} group by {grupa}

6. Cadrele didactice (numele acestora) care au ore cu un anumit student

(orar )
A :=
( studenti )
nume
=
'
nume
_
dat
'

studenti. grupa = orar. grupa


B := {
( A)
cadrudid }
C := cadredid

cadredid .cod = B.cadrudid

( B)

D := {
(C )
nume}

7. Cadrele didactice fr ore trecute n orar


C :=

{nume}

( cadredid )
(orar
cadredid )
{nume}
orar.cadrudid = cadredid .cod

8. Studenii care au ore n fiecare zi din sptmn (n toate zilele n care sunt activiti
didactice)
A :=
(orar ) , zilele cu ore
{
zi
}

B := studenti

studenti. grupa = orar. grupa

orar

C := {
( B)
nume, zi }
D := C A

Referine:
[Da04] DATE, C.J., An Introduction to Database Systems (8th Edition), Addison-Wesley, 2004,
cap. 7.
[Ga08] GARCIA-MOLINA, H., ULLMAN, J., WIDOM, J., Database Systems: The Complete
Book, Pearson Prentice Hall, 2008], cap. 5.
[Ra07] RAMAKRISHNAN, R., Database Management Systems. McGraw-Hill, 2007, cap. 4,
http://pages.cs.wisc.edu/~dbbook/openAccess/thirdEdition/slides/slides3ed.html
http://infolab.stanford.edu/~ullman/fcdb/slides/slides5.pdf

S-ar putea să vă placă și