Curs06

27
Curs 6 Formele normale ale unei relaţii (II) Interogarea bazelor de date cu operatori din algebra relaţională

description

Curs 5

Transcript of Curs06

  • 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. 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.

    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

    1NF

    2NF

    3NF

    BCNF

    4NF

    5NF

  • 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], unde atributele CadruDidactic i DataSedinta sunt repetitive.

    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 cel puin n 1NF) trebuie s memorm datele din aceast nregistrare ca n tabelul de mai jos (s-a trecut date numai pentru o nregistrare din primul tabel).

    In acest tabel fiecare cadru didactic are aceleai date pentru edin, deci la adugarea, modificarea sau tergerea liniilor din tabel trebuie fcute unele verificri suplimentare.

    Informatica CDI1 CDI2 .

    .

    .

    CDIm

    DI1 DI2 .

    .

    .

    DIn Matematica CDM1

    CDM2 .

    .

    .

    CDMp

    DM1 DM2 .

    .

    .

    DMq

    Informatica CDI1 DI1 Informatica CDI1 DI2 ........ ... ...

    Informatica CDI1 DIn Informatica CDI2 DI1 Informatica CDI2 DI2 ........ ... ...

  • 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 ( ))(Rw u= , nrr ...,,1 astfel nct wiriviruir === )(,)(,)( .

    Dac i avem: atunci mai trebuie s apar i valorile:

    u1 v1 w1

    u1 v2 w2

    u1 v1 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: ( ))()( Ru u== i ( ))()( Ru u== . Din se obine:

    ),,,(),(),( wvuruvuw = sau: ),,,(),(),( wvuruwuv =

    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:

    )(],[1 RR =

    )(],[2 RR =

    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).

    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". 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.

    Pr Se Di P1 S1 D2 P1 S2 D1 P2 S1 D1 P1 S1 D1

  • Dac se evalueaz PrSe * SeDi se obin datele: R' = PrSe * SeDi Pr Se Di P1 S1 D2 P1 S1 D1 P1 S2 D1 P2 S1 D2 P2 S1 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)

    PrSe Pr Se P1 S1 P1 S2 P2 S1

    SeDi Se Di S1 D2 S2 D1 S1 D1

    PrDi Pr Di P1 D2 P1 D1 P2 D1

  • 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:

    Dac (P2, S1, D1) se adaug la relaie, atunci trebuie adugat i nregistrarea (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.

    Pr Se Di P1 S1 D2 P1 S2 D1

    Pr Se Di P1 S1 D2 P1 S2 D1 P2 S1 D1 P1 S1 D1

  • 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:

    nume_atribut

    INNOTISINIS

    relaie_cu_o_coloan

    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:

  • relaie

    =

    INNOTISINIS

    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.

    MINMAXAVGSUM

    COUNT

    ([DISTINCT] expresie) FROM relaie

    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: )(Rc . 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 = )( 21 RR . 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 [ ] [ ] 21 , RR , i { }mAAA ,...,, 21= , atunci joinul natural se poate calcula prin construcia urmtoare:

    R1 R2 =

    == 21

    .2.1...1.21.1R

    mAR

    mARandandARARR

  • 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.

  • r

    r2

    r2

    R1

    r2

    R2

    r r1

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

    Ctul pleac de la dou relaii [ ] [ ] 21 , RR , cu , i se noteaz prin R1 R2 [ ] . Deducem c atributele din ct sunt date de mulimea . O nregistrare r R1 R2 dac

    22 Rr , 11 Rr ce ndeplinete condiiile:

    1.

    = rr )( 1 ;

    2. = 21)( rr . 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.

  • 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): )( 21121 RRRRR = ; R1 c R2= )( 21 RRc ; [ ] [ ] 2,1 RR , i { }mAAA ,...,, 21= , atunci

    R1 R2 =

    == 21

    .2.1...1.21.1R

    mAR

    mARandandARARR ;

  • Fie [ ] [ ] 2,1 RR , i: R3 [ ] = {(null, ... , null)}, R4 [ ] = {(null, ... , null)}. R1 C R2 = (R1 c R2) [R1 - ( ) 21 RR C ] 3R . R1 C R2 = (R1 c R2) 4R [R2 - ( ) 21 RR C ]. R1 C R2 = (R1 C R2) (R1 C R2).

    Fie [ ] [ ] 2,1 RR . Se deduce: R1 R2 = ( ) 21 RR , R1 R2 = ( ) 21 RR .

  • r

    r2

    r2

    R1

    r2

    R2

    r r1

    Dac [ ] [ ] 21 , RR , cu , atunci rR1 R2 dac 212 RRr , 11 Rr ce ndeplinete condiiile:

    = rr )( 1 i = 21)( rr . De aici deducem c r este din

    )( 1R , dar nu toate elementele din

    )( 1R apar n ct.

    In 21)( RR

    sunt toate elementele ce au o parte n

    )( 1R i a doua parte n R2. Din relaia astfel obinut vom elimina pe R1 i rmn acele elemente ce au o parte n

    )1(R i nu au cealalt parte n )( 1R . De aici obinem:

    ( )( )

    = 12)1()1(21 RRRRRR .

  • 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: )(}{ Rlistas

    Gruparea: )(}2{}1{ Rlistabygrouplista , care este o extensie pentru proiecie. Inregistrrile 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 ( )( ) == studentiR grupanume '281'}{:

    select nume from studenti where grupa='281'

    2. Studentii de la o anumit secie (lista alfabetic pe grupe) { } ( )( )

    { } ( )

    =

    =

    =

    studentiGinisgrupanumegrupaSR

    grupeStiacodG

    ,:

    ''sec:

    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: ( )

    { } { }( )STgrupabygroupcountgrupaNR

    studentigrupeStiacodinisgrupa

    ST

    (*),:''sec

    :

    =

    =

    =

    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

    ( )orarstudentidatnumenumegrupainisgrupa

    T

    =

    =

    '_'

    :

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

    { })(}{)}(,{:),(

    )(,

    :),(FgrupabygroupnrsumgrupanroregrupaNrOre

    orargrupaoraincorasfgrupanrF=

    =

    6. Cadrele didactice (numele acestora) care au ore cu un anumit student ( )orargrupaorargrupastudentistudentidatnumenumeA ..)('_': =

    ==

    { } )(: AcadrudidB = )(

    ..

    : BcadrudidBcodcadredidcadredidC ==

    { } )(: CnumeD = 7. Cadrele didactice fr ore trecute n orar

    )..

    (}{)(}{: cadredidcodcadredidcadrudidorarorarnumecadredidnumeC ==

  • 8. Studenii care au ore n fiecare zi din sptmn (n toate zilele n care sunt activiti didactice)

    = )(}{: orarziA , zilele cu ore

    orargrupaorargrupastudentistudentiB ..: ==

    { } )(,: BzinumeC = ACD =:

    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