Documente Academic
Documente Profesional
Documente Cultură
Note de curs
1
Cuprins
1. Introducere
1.1 InformaŃii şi date
1.2 Sisteme de gestiune a bazelor de date
1.3 Modele de date
1.4 Limbaje şi utilizatori
1.5 Avantaje şi dezavantaje ale sistemelor de gestiune a bazelor de date
Partea I. Baze de date relaŃionale
2. Modelul relaŃional
2.1 Structura modelului relaŃional
2.2 Constrângeri de integritate
3. Algebra relaŃională
3.1 Reuniune, intersecŃie, diferenŃă
3.2 OperaŃia de redenumire (ρ)
3.3 Operatorul de selecŃie (σ)
3.4 Operatorul de proiecŃie (π)
3.5 Operatorul joncŃiune – „join”
3.6 Interogări în algebra relaŃională
3.7 EchivalenŃa expresiilor algebrice
3.8 Valori NULL în algebra relaŃională
3.9 Vederi
4. Calculul relaŃional
4.1 Calculul relaŃional pe domenii
4.2 Calculul relaŃional pe tupluri
5. SQL
5.1 Definirea datelor în SQL
5.2 Interogări în SQL
5.3 Modificarea datelor în SQL
5.4 Alte definiŃii de date în SQL
5.5 Controlul accesului la baza de date
5.6 Utilizarea SQL în limbajele de programare
Partea a II-a. Proiectarea bazelor de date
6. Tehnici de proiectare şi modele
6.1. Procesul de proiectare a bazei de date
6.2. Modelul Entitate – RelaŃie (Entity – Relantionship model)
7. Proiectarea conceptuală
7.1 Extragerea şi analiza cerinŃelor
7.2 Strategii de proiectare
7.3 Calitatea unei scheme conceptuale.
7.4 Metodă de abordare a proiectării conceptuală
8. Proiectarea logică
8.1 Analiza performanŃelor schemei E-R
8.2 Restructurarea schemei E-R
8.3 Translarea în modelul relaŃional
2
Capitolul 1. Introducere
Exemplu
Şirul de caractere Popescu Ion şi numărul 123456 scrise pe o foaie de hârtie sunt
două date care nu au nicio semnificaŃie. Dacă hârtia este trimisă ca răspuns la întrebarea
„Cine este şeful departamentului de cercetare şi care este numărul său de telefon?” atunci
datele pot fi interpretate şi utilizate pentru îmbogăŃirea cunoştinŃelor cu informaŃia
„persoana Popescu Ion este şeful departamentului de cercetare şi numărul său de telefon
este 123456”.
Având introdusă noŃiunea de dată, ne putem îndrepta spre conceptul de bază de date,
elementul principal al cursului.
Se pot da mai multe definiŃii ale unei baze de date, cea mai generală dintre ele fiind: o
bază de date este o colecŃie de date utilizată pentru a reprezenta informaŃiile de interes pentru
un sistem informaŃional.
Primele sisteme software dedicate gestiunii datelor au apărut la sfârşitul anilor ’60. În
lipsa software-ului specific, gestiunea se realiza cu ajutorul limbajelor tradiŃionale de programare
cum ar fi C şi FORTRAN sau, mai recent, prin intermediul limbajelor orientate obiect (C++,
Java).
Abordarea convenŃională a gestiunii datelor exploata prezenŃa fişierelor pentru stocarea
permanentă a datelor. Sistemele de gestiune a bazelor de date bazate pe fişiere au constituit o
încercare de început de a computeriza sistemul de îndosariere manual, în scopul de a accesa mai
eficient datele stocate.
Un fişier este un set de înregistrări, care conŃin date între care există relaŃii logice.
Structura fizică şi stocarea fişierelor de date şi a înregistrărilor sunt definite în cadrul aplicaŃiei.
Un fişier permite stocarea şi căutarea datelor, dar furnizează doar un mecanism simplu de acces
şi partajare. Astfel, procedurile scrise într-un limbaj de programare sunt complet autonome,
fiecare definind şi utilizând unul sau mai multe fişiere „private”. Datele ce prezintă interes pentru
mai multe programe sunt multiplicate de atâtea ori câte programe utilizator există, introducând în
acest fel redundanŃa şi inconsistenŃa datelor.
3
Limitările sistemelor de gestiune a bazelor de date bazate pe fişiere
Atunci când datele sunt izolate în fişiere separate, procesul de combinare a datelor devine
mai complicat.
Exemplu
Fişiere disponibile
- fişier cu informaŃii despre proprietăŃile disponibile pentru închiriere
- fişier cu informaŃii despre chiriaşi
CerinŃă: listă a tuturor caselor care îndeplinesc pretenŃiile unui potenŃial chiriaş
OperaŃii care trebuie efectuate:
- se caută chiriaşii care preferă tipul „casă”
- se caută proprietăŃile de tip „casă” care satisfac cerinŃele chiriaşilor
4
Motivul pentru care au fost create bazele de date a fost, în cea mai mare parte, depăşirea
inconvenientelor prezentate anterior.
DefiniŃie. Un sistem de gestiune a bazelor de date (SGBD) este un sistem software capabil să
gestioneze colecŃii de date mari, partajate şi persistente şi să asigure corectitudinea şi
securitatea datelor. De asemenea, ca orice produs software, un sistem de gestiune a
bazelor de date trebuie să fie eficient şi să producă rezultatul scontat.
DefiniŃie. O bază de date (BD) este o colecŃie de date gestionate de un sistem de gestiune a
bazelor de date.
• Bazele de date pot fi mari, în sensul că pot conŃine mii de miliarde de octeŃi şi în general
depăşesc memoria principală disponibilă. Prin urmare, un SGBD trebuie să gestioneze
datele în memoria secundară. Această proprietate impune de fapt unui SGBD să poată
gestiona datele fără să fie limitat de dimensiunea lor, singura limitare fiind dată de
capacitatea dispozitivelor de stocare.
• Bazele de date sunt partajate, în sensul că diverse aplicaŃii şi utilizatori trebuie să aibă
posibilitatea de a obŃine accesul la datele de interes. Accesul partajat la date al mai multor
utilizatori ce operează simultan este garantat de SGBD prin utilizarea unui mecanism
special denumit „controlul concurenŃei”.
• Bazele de date sunt persistente - BD au o durată medie de viaŃă ce nu este limitată de o
singură execuŃie a programelor utilizator, pe când datele gestionate de un program în
memoria principală au o durată de viaŃă cuprinsă între începutul şi sfârşitul execuŃiei
programului, nefiind persistente.
• SGBD asigură corectitudinea datelor – are capacitatea de a conserva conŃinutul BD (sau
cel puŃin permite reconstituirea acesteia) în cazul unor defecŃiuni hardware sau erori
software. Pentru a îndeplini această cerinŃă, SGBD-urile pun la dispoziŃie funcŃii
specifice de backup şi recuperare a datelor.
• SGBD asigură securitatea datelor – fiecare utilizator, recunoscut prin intermediul unui
nume de utilizator specific accesului la SGBD, poate efectua numai anumite operaŃii
asupra datelor. Acest lucru se realizează cu ajutorul unui mecanism de autorizare.
• SGBD-urile trebuie să fie eficiente – ele trebuie să finalizeze operaŃiile utilizând
cantitatea adecvată de resurse (timp şi spaŃiu) pentru fiecare utilizator. Această
caracteristică se bazează atât pe tehnicile utilizate în implementarea SGBD-ului, cât şi pe
modul de proiectare a produsului respectiv.
• SGBD-urile măresc productivitatea – capacitatea sistemului cu BD de a conduce la
realizarea scopurilor utilizatorilor. Această definiŃie este generică şi nu corespunde unei
anumite funcŃii a SGBD-urilor, dat fiind că un SGBD pune la dispoziŃia utilizatorilor
diverse servicii şi funcŃii. Sarcina proiectării unei BD şi a aplicaŃiilor ce o utilizează
vizează garantarea unei bune productivităŃi a întregului sistem.
5
Modelul de date relaŃional, cel mai răspândit model de date, pune la dispoziŃie
constructorul relaŃie, oferind astfel posibilitatea organizarea datelor sub forma unei colecŃii de
înregistrări având structură fixă. O relaŃie se reprezintă sub forma unui tabel, în care liniile
coincid cu înregistrările, iar coloanele corespund câmpurilor înregistrării; ordinea în care apar
liniile şi coloanele nu este relevantă.
Exemplu
CURSURI PROSPECT
Curs Titular Specializare Curs An
Baze de date ReŃele de calculatoare
Automatică 4
ReŃele de Popescu Baze de date
Automatică 3
calculatoare Ionescu Tehnici de
Calculatoare 3
Tehnici de Anton programare
Calculatoare 4
programare ReŃele de calculatoare
Calculatoare 4
Baze de date
Modelul relaŃional a fost propus la începutul anilor ’70, iar sistemele reale bazate pe
modelul relaŃional au apărut la începutul anilor ’80.
• Modelul de date ierarhic – utilizează structuri de tip arbore şi ierarhie şi a fost definit în
faza de început a dezvoltării SGBD-urilor (anii ’60). Este utilizat şi acum în multe
sisteme din motive de continuitate.
• Modelul de date reŃea – cunoscut şi sub numele CODASYL (Conference of Data
Systems Languages) utilizează grafuri pentru organizarea datelor; a fost dezvoltat în anii
’70.
• Modelul de date obiect – a apărut în anii ’80 şi rezolvă unele limitări ale modelului
relaŃional; extinde în domeniul bazelor de date paradigma programării orientate obiect.
Modelele prezentate anterior sunt denumite „logice”, pentru a sublinia faptul că, deşi
structurile utilizate sunt abstracte, ele reflectă o organizare particulară (arbore, graf, tabel,
obiect).
Alte modele de date, cunoscute sub numele de modele conceptuale, au fost introduse
pentru a descrie datele într-o manieră independentă de modelul logic. Spre deosebire de
modelele logice, cele conceptuale nu sunt disponibile în SGBD-urile comerciale. Modelele
conceptuale sunt utilizate în faza preliminară a proiectării bazelor de date, pentru o analiză cât
mai bună a aplicaŃiei, fără implicaŃii de implementare. Un exemplu de model conceptual este
modelul Entitate - RelaŃie, ce va fi prezentat în cadrul acestui curs.
Într-o bază de date există o parte formată din caracteristici ale datelor care nu se modifică
în timp, numită schema bazei de date şi o parte care se modifică în timp, numită instanŃă
(starea) bazei de date, alcătuită din valorile actuale din baza de date.
6
Cele două relaŃii din exemplul anterior au o structură fixă; relaŃia CURSURI are două
coloane (atribute) care fac referire la cursuri, respectiv titulari.
Schema unei relaŃii conŃine numele relaŃiei, urmat de numele atributelor:
CURSURI(Curs, Titular)
InstanŃa unei relaŃii este formată dintr-o colecŃie de linii ale relaŃiei respective, care
variază în timp. În cazul relaŃiei CURSURI, instanŃa acestei relaŃii este dată de următoarele trei
perechi:
Arhitectura unui SGBD este împărŃită pe trei nivele, cunoscute sub numele de nivelul
logic, intern şi extern; fiecare nivel are asociată o schemă.
• Schema logică reprezintă o descriere a întregii baze de date prin prisma modelului logic
adoptat de SGBD (relaŃional, ierarhic, reŃea sau obiect)
• Schema internă descrie implementarea schemei logice prin prisma structurilor de stocare
fizică. De exemplu, o relaŃie poate fi organizată la nivel fizic sub forma unui fişier
secvenŃial sau a unui fişier secvenŃial cu indici.
• Schema externă reprezintă descrierea unei porŃiuni a bazei de date prin prisma modelului
logic. O schemă externă poate oferi o organizare diferită a datelor cu scopul de a reflecta
un punct de vedere al unui anumit utilizator sau grup de utilizatori. În acest fel este
posibil ca unei singure scheme logice să-i fie asociate diverse scheme externe: fiecare
schemă externă va furniza o anumită vedere asupra bazei de date. În majoritatea
sistemelor, nivelul extern nu apare explicit, dar este posibilă definirea unor relaŃii
derivate, numite vederi.
Exemplu
Un student de la Automatică este interesat de cursurile oferite în cadrul acestei specializări.
Această informaŃie este prezentă în relaŃia AUTOMATICĂ, derivată din relaŃia
PROSPECT.
AUTOMATICĂ
Specializare Curs An
Automatică ReŃele de calculatoare 4
Automatică Baze de date 3
7
IndependenŃa fizică permite interacŃiunea cu SGBD-ul independent de aspectele fizice
ale datelor. Este posibilă modificarea organizării fişierelor ce implementează relaŃiile sau
modificarea alocării fizice a fişierelor la dispozitivele de stocare fără a influenŃa descrierile de
nivel înalt ale datelor şi programele ce utilizează acele date.
IndependenŃa logică garantează că interacŃiunea cu nivelul extern al bazei de date este
independentă de nivelul logic. Spre exemplu, se poate modifica o schemă externă fără a fi
necesară modificarea schemei logice. De asemenea, se poate modifica nivelul logic, păstrând
intactă schema externă de interes pentru un anume utilizator.
Este de subliniat faptul că accesul la baza de date se face numai prin intermediul
nivelului extern (care poate coincide cu nivelul logic). SGBD-ul este cel care traduce operaŃiile
în termenii nivelelor corespunzătoare.
Remarcă. Unele limbaje (SQL) oferă facilităŃilor ambelor limbaje (LDD şi LMD) într-o formă
integrată.
Vom încheia această introducere rezumând caracteristicile esenŃiale ale bazelor de date
şi ale sistemelor de gestiune ale bazelor de date şi punctând avantajele şi dezavantajele acestora.
8
• SGBD-urile permit datelor să fie considerate drept resurse comune ale organizaŃiei,
disponibile tuturor membrilor autorizaŃi.
• Baza de date furnizează un model standardizat şi precis al acelei părŃi a lumii reale care
prezintă interes pentru organizaŃie, model folosit în aplicaŃiile existente şi care, cu
extensiile necesare, poate fi folosit în aplicaŃii viitoare.
• SGBD-urile oferă posibilitatea unui control centralizat al datelor.
• Partajarea bazelor de date permite reducerea redundanŃei şi inconsistenŃei datelor.
• IndependenŃa datelor, caracteristica fundamentală a SGBD-urilor, favorizează
dezvoltarea de aplicaŃii mai flexibile şi mai uşor de modificat.
În concluzie, putem spune că pot exista situaŃii în care folosirea SGBD-urilor nu este
necesară şi anume cazurile în care există un singur utilizator (sau mai mulŃi, dar care nu au
nevoie de acces concurent la date). Oricum, dezvoltarea actuală a SGBD-urilor a dus la sisteme
mai eficiente şi mai fezabile, şi la arhitecturi din ce în ce mai ieftine, crescând astfel posibilitatea
dezvoltării aplicaŃiilor cu SGBD-uri.
9
Partea I
Baze de date relaŃionale
Capitolul 2. Modelul relaŃional
Majoritatea sistemelor cu baze de date se bazează pe modelul relaŃional care a fost propus
de E.F. Codd în 1970 într-o publicaŃie ştiinŃifică, cu scopul de a furniza o bază pentru
independenŃa datelor. Adoptarea modelului relaŃional ca standard nu a fost imediată, acest lucru
fiind motivat de nivelul înalt de abstractizare. Deşi primele prototipuri de sisteme relaŃionale au
fost create încă din anii ’70, primele sisteme relaŃionale au apărut pe piaŃă în anii ’80.
Conceptele ce stau la baza modelului relaŃional sunt cele de relaŃie şi tabel, care diferă ca
şi noŃiuni dar sunt strâns legate. NoŃiunea de relaŃie este formală, venind din domeniul
matematicii, mai exact din domeniul teoriei mulŃimilor, în timp ce noŃiunea de tabel este o
noŃiune simplă şi intuitivă.
ObservaŃii.
DefiniŃiile de mai sus nu specifică în clar dacă mulŃimile D1 şi D2 sunt finite sau nu. În
practică relaŃiile trebuie să fie finite deoarece bazele de date trebuie stocate în sisteme
computerizate de dimensiuni finite.
În acelaşi timp însă este de dorit ca domeniile să aibă dimensiuni infinite, astfel încât să
putem presupune existenŃa unei valori care nu e prezentă în baza de date.
Din acest motiv, vom presupune acolo unde este necesar, că bazele de date sunt alcătuite
din relaŃii finite, definite pe domenii infinite.
DefiniŃiile de mai sus pot fi generalizate. Fie n > 0 mulŃimi D1 , D2 ,..., Dn , nu neapărat
distincte.
• Produsul cartezian D1 × D2 × ... × Dn este dat de mulŃimea n-tuplurilor v1 , v2 ,..., vn , unde
vi ∈ Di , i = 1, n .
• O relaŃie matematică pe domeniile D1 , D2 ,..., Dn este o submulŃime a produsului
cartezian D1 × D2 × ... × Dn .
10
caracteristică nesatisfăcătoare a conceptului de relaŃie (aşa cum este definit în matematică) din
punctul de vedere al posibilităŃii organizării şi utilizării datelor (vezi figura 2.1).
Exemplu
Fie t primul tuplu din relaŃia prezentată în figura 2.2. În acest caz, putem spune că
t[EchipaOaspete]=Liverpool
Exemplu
t[EchipaOaspete, GoluriOaspeti]=Liverpool,1
O relaŃie poate fi utilizată pentru organizarea într-o manieră relevantă a datelor necesare
unei aplicaŃii. De obicei, nu este suficientă o singură relaŃie şi de aceea bazele de date sunt
formate din mai multe relaŃii, ale căror tupluri conŃin valori comune atunci când acest lucru este
necesar pentru stabilirea unor corespondenŃe (vezi figura 2.3).
STUDENTI
NrInreg Nume Prenume DataNastere
276545 Ionescu Maria 25/11/1980
485745 Popescu Ana 23/04/1981
200768 Georgescu Paul 12/02/1981
587614 Luca Radu 10/10/1980
937653 Maftei Lucian 01/12/1980
11
EXAMENE
Student Nota Curs
276545 8 01
276545 9 04
937653 9 01
200768 9 04
CURSURI
Cod Denumire Titular
01 Fizica Melinte
03 Chimie Mardare
04 Chimie Dascalu
Fig. 2.3 Exemplu de bază de date relaŃională
DefiniŃie. Schema unei relaŃii este formată din numele relaŃiei R şi o mulŃime de atribute
X = { A1 , A2 ,..., An } şi se notează R(X). Fiecărui atribut îi este asociat un domeniu.
DefiniŃie. Schema bazei de date este formată dintr-o mulŃime de scheme de relaŃii:
R = { R1 ( X 1 ),R2 ( X 2 ),...,Rn ( X n )}
DefiniŃie. InstanŃa unei relaŃii (pe scurt – relaŃia) având schema R(X) este dată de mulŃimea r a
tuplurilor definite pe mulŃimea de atribute X.
DefiniŃie. InstanŃa bazei de date (pe scurt – baza de date) având schema
R = { R1 ( X 1 ),R2 ( X 2 ),...,Rn ( X n )} este mulŃimea r = { r1 ,r2 ,...,rn } de relaŃii în care fiecare
ri , i = 1,n este o relaŃie definită pe schema Ri ( X i ) .
Exemplu
Structura modelului relaŃional este simplă şi puternică. În acelaşi timp însă impune u
anumit grad de rigiditate, prin aceea ca informaŃiile trebuie reprezentate sub forma unor tupluri
omogene de date; în particular, putem reprezenta în cadrul unei relaŃii doar tupluri ce corespund
schemei relaŃiei. În practică există cazuri în care datele disponibile nu corespund cu exactitate
formatului ales.
Exemplu
12
informaŃiei şi este o valoare suplimentară, ce nu este conŃinută de domeniu. La definirea unei
relaŃii se pot specifica acele atribute care acceptă valori null.
În multe cazuri ne confruntăm cu situaŃii când nu orice mulŃime de tupluri în cadrul unei
scheme reprezintă informaŃii corecte pentru aplicaŃie. Pentru înlăturarea unor astfel de situaŃii (de
incorectitudine a informaŃiilor) a fost introdus conceptul de constrângere de integritate, ca fiind
o proprietate ce trebuie satisfăcută de toate instanŃele corecte ale bazei de date. O constrângere
poate fi privită ca un predicat ce asociază valoarea adevărat sau fals fiecărei instanŃe. Se pot
defini mai multe constrângeri pentru o bază de date şi vom considera corecte (sau legale) acele
instanŃe care satisfac toate constrângerile impuse.
Exemplu
STUDENTI
NrInreg Nume Prenume DataNastere
200768 Georgescu Paul 12/02/1981
937653 Maftei Lucian 10/10/1980
937653 Luca Radu 01/12/1980
EXAMENE
Student Nota Promovat Curs
200768 11 DA 05
937653 4 DA 01
937653 6 DA 04
276545 7 DA 01
CURSURI
Cod Denumire Titular
01 Fizica Melinte
03 Chimie Mardare
04 Chimie Dascalu
13
• constrângeri la nivel de tuplu:
- în primul tuplu al relaŃiei EXAMENE avem ca rezultat la un examen nota 11;
- în al doilea tuplu al relaŃiei EXAMENE un student este considerat promovat
la examen deşi nota sa este 4.
• constrângeri la nivel de domeniu
- pentru atributul Notă din relaŃia EXAMENE, numai valorile cuprinse între 1
şi 10 sunt permise;
- ultimele două tupluri ale relaŃiei STUDENTI conŃin informaŃii pentru doi
studenŃi diferiŃi dar cu acelaşi număr de înregistrare, identificarea studenŃilor
fiind astfel ambiguă.
• constrângeri inter-relaŃionale
- al patrulea tuplu al relaŃiei EXAMENE are, pentru atributul Student, o
valoare care nu apare printre numerele de înregistrare din relaŃia
STUDENTI;
- primul tuplu al relaŃiei EXAMENE are, pentru atributul Curs, o valoare care
nu apare printre codurile cursurilor din relaŃia CURSURI.
Exemplu
Expresia ce descrie prima constrângere de tuplu încălcată în exemplul prezentat în figura
2.4:
(Nota ≥ 1) AND (Nota ≤ 10)
Expresia ce descrie a doua constrângere de tuplu violată în exemplul prezentat în figura
2.4:
(Promovat = ’DA’) AND (Nota ≥ 5)
DefiniŃia permite construirea unor expresii de complexitate ridicată, singura condiŃie fiind
ca aceste expresii să utilizeze valorile unui singur tuplu.
Exemplu
Fie dată schema
PLATĂ(Dată, Sumă, Deduceri, Net)
14
Se poate defini o constrângere care impune condiŃia ca suma netă să fie egală cu diferenŃa
dintre suma totală şi deduceri:
Net = Sumă - Deduceri
Constrângeri de chei
O cheie este o mulŃime de atribute ce ajută la identificarea în mod unic a tuplurilor unei
relaŃii.
DefiniŃie. O mulŃime de atribute K este o super-cheie a relaŃiei r dacă r nu conŃine două tupluri
distincte t1 şi t2 astfel încât t1[K] = t2[K] .
DefiniŃie. O mulŃime K de atribute este o cheie a relaŃiei r dacă mulŃimea K este o super-cheie
minimală (i.e. nu există altă super-cheie K’ a lui r astfel încât K ' ⊂ K ).
Exemplu
Se consideră următoarea relaŃie
STUDENT
NrInreg Nume Prenume DataNastere Facultate
284328 Ionescu Maria 29/04/59 AC
296328 Ionescu Ana 29/04/59 TCM
587614 Ionescu Lucian 01/05/61 Textile
934856 Popescu Lucian 01/05/61 AC
965536 Popescu Lucian 05/03/58 TCM
15
Faptul că pentru orice relaŃie se poate stabili cel puŃin o cheie garantează accesul la toate
datele din baza de date şi identificarea lor unică. Mai mult decât atât, permite stabilirea unor
legături între datele conŃinute de diverse relaŃii.
Exemplu
Se consideră baza de date din figura 2.3. RelaŃia EXAMENE face referire la studenŃii din
relaŃia STUDENTI prin intermediul atributului NrInreg şi la cursurile din relaŃia
CURSURI prin atributul Cod. NrInreg este cheia relaŃiei STUDENTI iar Cod este cheia
relaŃiei CURSURI. Se observă faptul că valorile atributelor cheie sunt utilizate pentru
referirea conŃinutului altor relaŃii.
O cheie primară este cheia prin intermediul căreia se realizează referinŃe între relaŃii.
Alte constrângeri impuse cheii unei relaŃii vizează utilizarea valorilor null pentru
atributele ce compun cheia. Mai exact, este interzisă utilizarea valorilor null pentru cheile
primare, în timp ce ele pot fi admise pentru celelalte chei.
În practică pot apărea situaŃii în care nu există atribute ale căror valori să fie disponibile
pentru o cheie primară. În aceste cazuri se va introduce un atribut suplimentar care va fi generat
şi asociat fiecărui tuplu în momentul inserării în relaŃia corespunzătoare.
Constrângeri de referinŃă
O constrângere de referinŃă (sau cheie străină) între o mulŃime de atribute X ale relaŃiei
R1 şi altă relaŃie R2 este satisfăcută dacă valorile fiecărui tuplu din R1 corespunzătoare mulŃimii X
se regăsesc printre valorile cheii primare a relaŃiei R2. Se întâlnesc două situaŃii:
Exemplu
Se consideră baza de date din figura următoare
CONTRAVENTIE CADRE
Cod Data Cadru Judet NrInmat NrInreg Nume Prenume
143256 25/10/92 567 IS 02 AAA 567 Dascalescu Eugen
987554 26/10/92 456 IS 02 AAA 456 Ionescu George
987557 26/10/92 456 IS 03 BBB 638 Popescu Dan
630876 15/10/92 456 VS 03 BBB
539856 12/10/92 567 VS 03 BBB
16
AUTOVEHICUL
NrInmat Judet Proprietar Adresa
03 BBB IS Maftei Eduard Nicolina 30
01 CCC IS Maftei Eduard Nicolina 30
02 AAA IS Luca Marian Primaverii 4
03 BBB VS Melinte Dan Primaverii 17
În cazul b) discuŃia despre ordinea atributelor poate părea excesivă, dat fiind că se poate
obŃine o corespondenŃă prin intermediul numelor atributelor. În general, nu ne putem baza pe o
astfel de corespondenŃă (prin intermediul numelor atributelor) şi va trebui să recurgem la
impunerea unei anumite ordini a atributelor.
Exemplu
Exemplu
Baza de date din figura următoare nu respectă cele două constrângeri menŃionate anterior.
ACCIDENT
Cod Jud1 NrInmat1 Jud2 NrInmat2 …
6207 IS 03 BBB BC 02 DDD …
6974 BC 02 AAA BC 02 DDD …
AUTOVEHICUL
NrInmat Judet Proprietar Adresa
01 CCC IS Maftei Eduard Nicolina 30
02 AAA BC Luca Marian Primaverii 4
03 BBB IS Melinte Dan Primaverii 17
ObservaŃii
• în cazul relaŃiilor cu mai multe chei, se va alege o cheie primară şi toate referirile trebuie
redirectate spre ea.
17
• există sisteme de gestiune a bazelor de date care nu permit indicarea în mod explicit a
unei chei primare. In aceste cazuri, constrângerea de referinŃă trebuie să indice explicit
atributele ce formează cheia la care se face referire.
Probleme propuse
MEDIC
Numar Nume Prenume Sectie SECTIE
203 Dumitrescu Mihai A Cod Nume Specialist
574 Georgescu Stefan B A Chirurgie 203
461 Barbu Petre B B Pediatrie 574
530 Petrescu George C C Medicala 530
405 Filipescu George A
501 Barbulescu Stefan A
PuneŃi în evidenŃă cheile şi constrângerile de referinŃă din baza de date prezentată. PrecizaŃi dacă
respectivele constrângeri sunt satisfăcute de toate bazele de date care au aceeaşi schemă cu baza de date
din figură. PrecizaŃi care atribute pot admite valori null.
2. Se consideră următoare informaŃii referitoare la managementul împrumuturilor dintr-o
bibliotecă personală: proprietarul împrumută cărŃi prietenilor, care se înregistrează prin intermediul
numelor (astfel încât să se evite repetiŃiile); o carte este referită prin titlul său (nu există două cărŃi cu
acelaşi titlu); când clientul împrumută o carte, se înregistrează data împrumutului şi proprietarul fixează
data returnării;
DefiniŃi o schema relaŃională pentru reprezentarea informaŃiilor de mai sus, precizând domeniile
adecvate pentru atribute şi o instanŃă sub formă tabelară. PrecizaŃi cheia sau cheile relaŃiei.
3. ReprezentaŃi prin intermediul unei relaŃii sau a mai multora informaŃiile conŃinute în mersul
trenurilor dintr-o staŃie: numărul trenului, ora sosirii, ora plecării, punctul de plecare, destinaŃia finală,
tipul de tren şi opririle de pe parcurs.
4. DefiniŃi o schemă a unei baze de date în care se organizează informaŃiile referitoare la o
companie care are angajaŃi (fiecare cu codul numeric personal, nume, prenume şi data naşterii) şi
subsidiari (fiecare cu cod, ramură şi director, care este angajat). Fiecare angajat lucrează pentru un
subsidiar. IndicaŃi cheile şi constrângerile de referinŃă ale schemei. ArătaŃi o instanŃă a bazei de date şi
verificaŃi dacă se respectă constrângerile.
18
Capitolul 3. Algebra relaŃională
Algebra relaŃională este un limbaj procedural în care funcŃiile pentru extragerea datelor
sunt specificate prin descrierea procedurii ce trebuie urmată în sensul obŃinerii unui rezultat.
Algebra relaŃională se bazează pe o colecŃie de operatori ce sunt aplicaŃi relaŃiilor, producând
relaŃii. Pentru formularea unor interogări complexe se vor construi expresii ce implică mai mulŃi
operatori. Operatorii algebrici relaŃionali se împart în următoarele clase:
• Operatori clasici din teoria mulŃimilor – reuniune, intersecŃie, diferenŃă;
• Operatori de redenumire, selecŃie, proiecŃie;
• Operatorul join (joncŃiune), împreună cu variantele sale – joncŃiune naturală, produs
cartezian, theta joncŃiune şi joncŃiune externă.
După cum am mai precizat anterior, relaŃiile sunt mulŃimi de tupluri omogene şi de aceea
are sens definirea operatorilor clasici de reuniune, intersecŃie şi diferenŃă. În cele ce urmează,
vom permite aplicarea acestor operatori doar asupra perechilor de relaŃii definite pe aceleaşi
atribute.
Reuniunea a două relaŃii r1(X) şi r2(X) este relaŃia notată r1 ∪ r2 care conŃine tupluri ce
aparŃin fie lui r1 fie lui r2, fie ambelor relaŃii r1 şi r2.
IntersecŃia dintre relaŃiile r1(X) şi r2(X) este relaŃia notată r1 ∩ r2 formată din tuplurile
comune relaŃiilor r1 şi r2.
DiferenŃa dintre relaŃiile r1(X) şi r2(X) este relaŃia notată r1 − r2 care conŃine tuplurile din
r1 care nu se regăsesc în r2.
Limitările impuse operatorilor standard din teoria mulŃimilor pot fi restrictive în anumite
situaŃii.
Exemplu
Să considerăm cele două relaŃii din figura 3.1
19
TATA_COPIL MAMA_COPIL
Tata Copil Mama Copil
Adam Dan Eva Dan
Adam Marian Eva Lucian
Radu Cristi Maria Cristi
Radu Catalin Carmen Catalin
TATA_COPIL ∪ MAMA_COPIL ??
Ar avea sens executarea unei reuniuni între cele două relaŃii cu scopul de a obŃine toate
perechile ’părinte – copil’ din baza de date. Acest lucru nu este însă posibil deoarece
atributul denumit de noi din instinct ’părinte’ are numele ’tata’ într-o relaŃie şi numele
’mama’ în cealaltă relaŃie.
Exemplu
DefiniŃie. Fie r o relaŃie definită pe mulŃimea X de atribute şi fie Y o altă mulŃime de atribute
având aceeaşi cardinalitate ca şi X. Fie secvenŃele ordonate A1 A2 ... Ak şi B1 B2 ...Bk formate din
atributele mulŃimii X respectiv Y. Redenumirea
ρ A1 A2 ... Ak ← B1 B2 ...Bk ( r )
conŃine pentru fiecare tuplu t din r un tuplu t’ definit pe Y astfel încât t' [ Bi ] = t[ Ai ] , i = 1,k .
În practică, cele două secvenŃe A1 A2 ... Ak şi B1 B2 ...Bk vor conŃine doar atributele ce
urmează a fi redenumite şi noile lor nume.
3.3 Operatorul de selecŃie (σ)
Rezultatul unei selecŃii conŃine tuplurile relaŃiei operand ce satisfac condiŃia asociată
relaŃiei.
\
20
Exemplu
După cum se poate observa, sunt selectate tuplurile din relaŃia ANGAJAT care
îndeplinesc condiŃia: Varsta < 30 sau Salariu > 4000.
DefiniŃii.
O selecŃie σ F ( r ) produce o relaŃie care are aceleaşi atribute ca relaŃia r şi care conŃine
acele tupluri din r pentru care F este adevărată.
PropoziŃie. πY ( r ) conŃine acelaşi număr de tupluri ca şi r dacă şi numai dacă Y este o super-
cheie pentru r.
DemonstraŃie.
• Fie Y super-cheie pentru r. Rezultă că r nu conŃine perechi de tupluri egale pe Y, deci
fiecare tuplu va contribui la rezultatul proiecŃiei.
• Dacă proiecŃia are acelaşi număr de tupluri ca şi operandul rezultă că fiecare tuplu din r a
contribuit la proiecŃie cu valori diferite. Aceasta înseamnă că r nu conŃine perechi de
tupluri egale pe Y, deci Y este o super-cheie.
Operatorul joncŃiune permite realizarea unei conexiuni între datele conŃinute de diverse
relaŃii. Există două versiuni principale ale acestui operator, care, oricum, se pot obŃine una din
cealaltă.
JoncŃiunea naturală ( ⊳⊲ ) – „natural join”
JoncŃiunea naturală corelează datele din relaŃii diferite pe baza valorilor egale asociate
atributelor cu acelaşi nume.
DefiniŃie. Fie r1(X1) şi r2(X2) două relaŃii. JoncŃiunea naturală r1 ⊳⊲ r2 este o relaŃie definită pe
X1X2 (reuniunea dintre X1 şi X2) astfel încât:
r1 ⊳⊲ r2 = { t definit pe X 1 X 2 / ∃t1 ∈ r1 , ∃t2 ∈ r2 , astfel incat t[ X 1 ] = t1 si t[ X 2 ] = t2 }
Pe scurt putem scrie
r1 ⊳⊲ r2 = { t definit pe X 1 X 2 / t[ X 1 ] ∈ r1 si t[ X 2 ] ∈ r2 }
DefiniŃia confirmă faptul că tuplurile relaŃiei rezultat provin din combinarea tuplurilor
din operanzi având valori egale pentru atributele comune. Notăm X 1,2 = X 1 ∩ X 2 mulŃimea
atributelor comune. CondiŃiile t[ X 1 ] = t1 şi t[ X 2 ] = t2 implică (deoarece X 1,2 ⊆ X 1 şi
X 1,2 ⊆ X 2 ) t[ X 1,2 ] = t1 [ X 1,2 ] şi t[ X 1,2 ] = t2 [ X 1,2 ] , deci t1 [ X 1,2 ] = t2 [ X 1,2 ] . Fie n gradul
22
joncŃiunii naturale dintre relaŃiile r1 şi r2, n1 gradul relaŃiei r1 şi n2 gradul relaŃiei r2; atunci
n ≤ n1 + n2 .
Exemplu
CONTRAVENTIE AUTOVEHICUL
Cod Data Cadru Judet NrInmat NrInmat Judet Proprietar Adresa
143256 25/10/92 567 IS 02 AAA 03 BBB IS Maftei Eduard Nicolina 30
987554 26/10/92 456 IS 02 AAA 01 CCC IS Maftei Eduard Nicolina 30
987557 26/10/92 456 IS 03 BBB 02 AAA IS Luca Marian Primaverii 4
630876 15/10/92 456 VS 03 BBB 03 BBB VS Melinte Dan Primaverii 17
539856 12/10/92 567 VS 03 BBB
CONTRAVENTIE ⊳⊲ AUTOVEHICUL
Cod Data Cadru Judet NrInmat Proprietar Adresa
143256 25/10/92 567 IS 02 AAA Luca Marian Primaverii 4
987554 26/10/92 456 IS 02 AAA Luca Marian Primaverii 4
987557 26/10/92 456 IS 03 BBB Maftei Eduard Nicolina 30
630876 15/10/92 456 VS 03 BBB Melinte Dan Primaverii 17
539856 12/10/92 567 VS 03 BBB Melinte Dan Primaverii 17
Se observă faptul că joncŃiunea naturală a celor două relaŃii s-a obŃinut prin combinarea
fiecărui tuplu din CONTRAVENłIE cu exact un tuplu din AUTOVEHICUL:
• cu cel mult unul deoarece atributele Judet şi NrInmat formează o cheie a
relaŃiei AUTOVEHICUL;
• cu cel puŃin unul datorită constrângerii de referinŃă dintre atributele Judet şi
NrInmat din CONTRAVENTII şi relaŃia AUTOVEHICUL.
DefiniŃie. Fie r1(X1) şi r2(X2) două relaŃii. Spunem că joncŃiunea naturală r1 ⊳⊲ r2 este completă
dacă
∀t1 ∈ r1 , ∃t ∈ r1 ⊳⊲ r2 , astfel incat t[ X 1 ] = t1 şi
∀t2 ∈ r2 , ∃t' ∈ r1 ⊳⊲ r2 , astfel incat t'[ X 2 ] = t2 .
Exemplu
r1 r2
Angajat Departament Departament Sef
Ionescu vanzari productie Manole
Balint productie vanzari Burlacu
Baltag productie
r1 ⊳⊲ r2
Angajat Departament Sef
Ionescu vanzari Burlacu
Balint productie Manole
Baltag productie Manole
23
Notă. Există posibilitatea ca în cazul unei joncŃiuni rezultatul să nu conŃină nici un tuplu. În
cealaltă extremă se află situaŃia când fiecare tuplu al unui operand se poate combina cu fiecare
tuplu din cel de-al doilea operand. În acest caz cardinalitatea relaŃiei rezultat este dată de
produsul cardinalităŃilor celor doi operanzi.
Exemplu
r1 r2
Angajat Departament Departament Sef
Ionescu vanzari productie Manole
Balint productie achizitii Burlacu
Luca productie
r1 ⊳⊲ LEFT r2
Angajat Departament Sef
Ionescu vanzari null
Balint productie Manole
Luca productie Manole
r1 ⊳⊲ RIGHT r2
Angajat Departament Sef
Balint productie Manole
Luca productie Manole
null achizitii Burlacu
r1 ⊳⊲ FULL r2
Angajat Departament Sef
Ionescu vanzari null
Balint productie Manole
Luca productie Manole
null achizitii Burlacu
24
JoncŃiune n-ară, intersecŃie şi produs cartezian
• asociativitate - ( r1 ⊳⊲ r2 ) ⊳⊲ r3 = r1 ⊳⊲ ( r2 ⊳⊲ r3 ) .
łinând cont de aceste proprietăŃi putem scrie următoarele secvenŃe de joncŃiuni fără
paranteze:
r1 ⊳⊲ r2 ⊳⊲ ... ⊳⊲ rn sau ⊳⊲ni =1 ri - joncŃiune n-ară.
Până in acest moment nu s-au făcut nici un fel de precizări asupra mulŃimilor X1 şi X2 de
atribute. Cele două mulŃimi pot fi egale sau disjuncte.
Dacă X1 = X2 atunci joncŃiunea coincide cu intersecŃia:
r1( X 1 ) ⊳⊲ r2 ( X 2 ) = r1 ( X 1 ) ∩ r2 ( X 2 )
În general produsul cartezian nu prezintă interes deoarece combină tuplurile celor doi
operanzi într-o manieră lipsită de semnificaŃie (vezi figura 3.8).
Exemplu
Din această cauză a fost introdu un alt operator, cel de theta – joncŃiune, care este de fapt
un produs cartezian urmat de o selecŃie (vezi figura 3.9):
r1 ⊳⊲ F r2 = σ F ( r1 ⊳⊲ r2 ) ,
unde F este condiŃia de selecŃie.
25
Exemplu
σσσσ P
r
o
i
e
c
t
=
C
o
d
ANGAJAT PROIECT (ANGAJAT ⊳⊲ PROIECT)
Angajat Proiect Cod Nume Angajat Proiect Cod Nume
Ionescu A A Venus Ionescu A A Venus
Balint A B Marte Balint A A Venus
Balint B Balint B B Marte
Din punct de vedere practic, theta şi echi – joncŃiunea au o importanŃă deosebită. Aceasta
deoarece majoritatea sistemelor de gestiune a bazelor de date nu exploatează avantajele numelor
atributelor în combinarea relaŃiilor. De fapt, interogările SQL corespund echi – joncŃiunilor, în
timp ce joncŃiunea naturală a devenit disponibilă doar în versiunile recente de SQL.
Este de notat faptul că joncŃiunea naturală poate fi înlocuită cu succesiunea redenumire,
echi – joncŃiune şi proiecŃie.
Exemplu
O interogare poate fi definită ca fiind o funcŃie care, aplicată asupra unei instanŃe a unei
baze de date, produce o relaŃie. Mai exact, dată o schemă R a unei baze de date, o interogare este
o funcŃie care, pentru fiecare instanŃă r a lui R, produce o relaŃie definită pe o mulŃime X de
atribute.
În algebra relaŃională, interogările unei scheme R de baze de date sunt formulate cu
ajutorul unor expresii, ale căror atomi sunt relaŃii din R.
Exemple
26
În figura 3.10 este dată o bază de date definită pe această schemă.
ANGAJAT SUPERVIZOR
NrInreg Nume Varsta Salariu NrSup NrAng
101 Maria Ionescu 34 40 210 101
103 Maria Balint 23 35 210 103
104 Lucia Popescu 38 61 210 104
105 Nicu Luca 44 38 231 105
210 Marcel Burlacu 49 60 301 210
231 Alin Lupu 50 60 301 231
252 Nicu Luca 44 70 375 252
301 Andrei Popa 34 70
375 Maria Ionescu 50 65
Fig.3.10 Bază de date pentru exemplificarea interogărilor în algebra relaŃională
1) Să se găsească numerele de înregistrare pentru supervizorii acelor angajaŃi ce câştigă
mai mult de 40.
π NrSup ( SUPERVIZOR ⊳⊲ NrAng = NrInreg ( σ Salariu > 40 ( ANGAJAT )))
Rezultatul interogării se poate observa în figura 3.11.a
2) Să se găsească numele şi salariile pentru supervizorii acelor angajaŃi ce câştigă mai
mult de 40.
Fiecare tuplu a rezultatului este construit pe baza a trei tupluri, primul din ANGAJAT
(despre angajaŃii care câştigă mai mult de 40), al doilea din SUPERVIZOR (care
furnizează numărul supervizorului angajatului în chestiune) şi al treilea din
ANGAJAT (cu informaŃii privind pe supervizori). Intuitiv, soluŃia necesită joncŃiunea
relaŃiei ANGAJAT cu rezultatul expresiei precedente, dar este necesară o precizare.
În general, supervizorii şi angajaŃii nu sunt aceiaşi şi astfel cele două tupluri din
ANGAJAT care contribuie la tuplul rezultat sunt diferite. JoncŃiunea trebuie
precedată deci de o redenumire.
π NumeSup,SalariuSup ( ρ NrInregSup,NumeSup,SalariuSup,VarstaSup ← NrInreg ,Nume,Salariu ,Varsta ( ANGAJAT )
⊳⊲ NrInregSup = NrSup
( SUPERVIZOR ⊳⊲ NrAng = NrInreg ( σ Salariu >40 ( ANGAJAT ))))
Probleme propuse.
27
2) Să se găsească angajaŃii ce câştigă mai mult decât supervizorii lor, incluzând în
rezultat numărul de înregistrare, numele şi salariul atât pentru angajaŃi cât şi pentru
supervizori.
Algebra relaŃională permite formularea unor expresii echivalente între ele, adică expresii
ce produc acelaşi rezultat.
DefiniŃie. Spunem că expresiile E1 şi E2 sunt echivalente absolut (cu notaŃia E1 ≡ E2 ) dacă sunt
echivalente pentru orice schema R.
DistincŃia între cele două cazuri este dată de faptul că atributele operanzilor nu sunt
specificate în expresii (în particular în operaŃiile de joncŃiune naturală).
Exemplu
EchivalenŃă absolută: π AB ( σ A>0 ( R )) ≡ σ A>0 ( π AB ( R ))
EchivalenŃă: π AB ( R1 ) ⊳⊲ π AC ( R2 ) ≡ R π ABC ( R1 ⊳⊲ R2 )
În ultimul caz, echivalenŃa este validă doar dacă în schema R, intersecŃia dintre mulŃimile
de atribute ale R1 şi R2 este atributul A. Dacă ar mai exista alt atribut B comun celor două
mulŃimi, prima joncŃiune ar opera pe A, în timp ce a doua ar opera pe A şi B.
• atomizarea selecŃiilor
σ F1 ∧ F2 ( E ) ≡ σ F1 ( σ F2 ( E )) .
28
Combinând această regulă cu cascadarea proiecŃiilor, obŃinem echivalenŃa pentru theta –
joncŃiune:
πY ( E1 ⊳⊲ F E2 ) ≡ πY ( πY1 ( E1 ) ⊳⊲ F πY2 ( E2 )) ,
Y1 = ( X 1 ∩ Y ) ∪ J 1 , Y2 = ( X 2 ∩ Y ) ∪ J 2 .
• σ F1 ∨ F2 ( R ) ≡ σ F1 ( R ) ∪ σ F2 ( R )
• σ F1 ∧ F2 ( R ) ≡ σ F1 ( R ) ∩ σ F2 ( R ) ≡ σ F1 ( R ) ⊳⊲ σ F2 ( R )
• σ F1 ∧( ¬F2 )( R ) ≡ σ F1 ( R ) − σ F2 ( R )
În cele discutate anterior am presupus că expresiile algebrice sunt aplicate unor relaŃii ce
nu conŃin valori NULL. łinând cont de importanŃa valorilor NULL în aplicaŃii, vom vedea care
este impactul lor asupra limbajelor de interogare şi actualizare a datelor.
Exemplu. Să considerăm relaŃia din figura următoare
PERSOANA
Nume Varsta Salariu
Ionescu 35 500
Popescu 27 600
Popa NULL 500
Figura 3.12 RelaŃie cu valori NULL
29
şi selecŃia σVarsta > 30 ( PERSOANA ) .
Primul tuplu va contribui la rezultatul selecŃiei, iar al doilea tuplu nu. Ce putem spune
despre al treilea tuplu (valoarea NULL având semnificaŃia unei informaŃii pe care o
ignoram)?
În raport cu interogările prezentate anterior vom utiliza o logică trivalentă în locul celei
bivalente. În această logică o formulă poate avea valorile de adevăr TRUE (T), FALSE (F) sau
UNKNOWN (U). Rezultatul unei condiŃii atomice va avea valoarea de adevăr UNKNOWN dacă
cel puŃin un termen al comparaŃiei are valoarea NULL. Revenind la exemplul nostru, expresia va
produce o relaŃie formată din primul tuplu, pentru care valoarea de adevăr a expresiei a fost
TRUE.
Tabelele de adevăr în logica trivalentă pentru conectorii not, and şi or sunt:
not and T U F or T U F
F T T T U F T T T T
U U U U U F U T U U
T F F F F F F T U F
Este de notat că această logică trivalentă pentru operatorii algebrici prezintă unele
dezavantaje.
Exemplu
Să considerăm expresia
σVarsta > 30 ( PERSOANA ) ∪ σVarsta ≤ 30 ( PERSOANA ) .
Logic, această expresie ar trebui să returneze relaŃia PERSOANA. Pe de altă parte, dacă
cele două subexpresii sunt evaluate separat, al treilea tuplu va produce un rezultat
necunoscut pentru fiecare subexpresie, deci şi pentru reuniune. Numai prin intermediul
unei evaluări globale (abordare care nu este practică în cazul expresiilor complexe) putem
ajunge la concluzia că un astfel de tuplu trebuie să apară în rezultat.
Cea mai bună metodă practică de a depăşi astfel de dificultăŃi este de a trata valorile
NULL din punct de vedere pur sintactic. În acest sens sunt introduse două noi condiŃii atomice
de selecŃie pentru a verifica dacă o valoare este specificată sau este NULL:
• A is NULL este adevărată pentru tuplul t dacă t[A] = NULL şi falsă în rest;
• A is NOT NULL este adevărată pentru tuplul t dacă t[A] ≠ NULL şi falsă în rest.
Exemplu
Această abordare este utilizată în versiunile recente de SQL care suportă logica trivalentă.
3.9 Vederi
În cele prezentate anterior am văzut că se pot construi reprezentări diferite ale datelor,
reprezentări ce vor fi disponibile utilizatorilor. Acest lucru este posibil în modelul relaŃional prin
intermediul relaŃiilor derivate, al căror conŃinut este definit pe baza conŃinutului altor relaŃii. Într-
o bază de date relaŃională există relaŃii de bază, al căror conŃinut este autonom şi stocat în baza
de date şi relaŃii derivate.
Există două tipuri principale de relaŃii derivate:
• vederi materiale - relaŃii derivate stocate în baza de date;
30
• relaŃii virtuale (numite pur şi simplu vederi) – relaŃii definite prin intermediul unor
funcŃii (expresii ale limbajului de interogare) care nu sunt stocate în baza de date, dar pot
fi folosite în interogări ca şi cum ar exista fizic.
În general, vederile materiale oferă un avantaj când numărul cererilor de interogare este
mai mare decât operaŃiile de actualizare ale relaŃiei pe care se bazează vederea. Deoarece nu se
pot specifica tehnici generale de păstrare a consistenŃei între relaŃiile de bază şi vederile
materiale, majoritatea sistemelor comerciale oferă mecanisme numai pentru relaŃiile virtuale
(vederi).
Vederile sunt definite în sistemele relaŃionale ca fiind expresii ale unui limbaj de
interogare.
Exemplu
Să considerăm baza de date formată din relaŃiile
R1 ( ABC ),R2 ( DEF ),R3 ( GH ) ,
şi vederea definită ca produsul cartezian urmat de o selecŃie
R = σ A > D ( R1 ⊳⊲ R2 ) .
Pe baza acestei scheme, interogarea
σ B = G ( R ⊳⊲ R3 )
va fi executată prin înlocuirea lui R cu definiŃia sa:
σ B = G ( σ A > D ( R1 ⊳⊲ R2 ) ⊳⊲ R3 ) .
31
Din punct de vedere al interogărilor, vederile pot fi tratate în aceeaşi manieră ca şi
relaŃiile. Nu acelaşi lucru se întâmplă în cazul operaŃiilor de actualizare. De fapt nu se poate da o
semantică pentru actualizarea vederilor.
Exemplu
Probleme propuse
a). RealizaŃi o bază de date cu relaŃiile de mai sus pentru care joncŃiunile între diverse relaŃii sunt
complete.
b). Presupunând că există două constrângeri de referinŃă între relaŃia ROLURI şi celelalte două relaŃii,
precizaŃi cazurile posibile de joncŃiuni incomplete.
c). ArătaŃi un produs cartezian care implică relaŃii din baza de date prezentată.
d). RealizaŃi o bază de date pentru care una (sau mai multe) dintre joncŃiuni este (sunt) vidă (vide).
32
e). numele şi prenumele studenŃilor care au luat examenul la un curs al cărui titular are acelaşi nume
ca şi studentul.
33
Capitolul 4. Calculul relaŃional
Calculul relaŃional este o familie de limbaje de interogare, bazate pe calculul cu predicate
de ordinul întâi. Aceste limbaje sunt declarative, interogarea fiind specificată prin proprietăŃile
rezultatului, contând mai puŃin procedura ce trebuie urmată pentru a o obŃine. Spre deosebire de
calculul relaŃional, algebra relaŃională este un limbaj procedural, deoarece expresiile specifică
pas cu pas construirea rezultatului.
Există mai multe versiuni de calcul relaŃional, dar în cele ce urmează vom discuta doar
despre două dintre aceste versiuni şi anume:
• Calculul relaŃional pe domenii, care prezintă caracteristicile de bază ale acestor limbaje;
• Calculul relaŃional pe tupluri, care formează bazele multor constructori disponibili
pentru interogarea în SQL.
34
• ∀x( f ) este adevărată dacă formula f este adevărată pentru toate valorile posibile ale lui
x.
Exemple
35
{ NumeSup : ns, SalariuSup : ss | ANGAJAT( NrInreg : ni, Nume : u,Varsta : v,Salariu : s ) ∧ s > 40 ∧
SUPERVIZOR( NrSup : n, NrAng : ni ) ∧
ANGAJAT( NrInreg : n, Nume : ns,Varsta : q,Salariu : ss )}
Această expresie selectează supervizorul n dacă pentru orice tuplu de valori m',n',v',s'
corespunzător angajaŃilor lui n, s' > 40 .
¬( f ∨ g ) = ¬( f ) ∧ ¬( g ) ,
DefiniŃie. O expresie a unui limbaj de interogare este independentă de domeniu dacă rezultatul
său în fiecare instanŃă a bazei de date nu variază dacă se modifică domeniul pe care se evaluează
expresia.
DefiniŃie. Un limbaj este independent de domeniu dacă toate expresiile lui sunt independente de
domeniu.
Pe baza acestor definiŃii putem afirma că algebra relaŃională este independentă de
domeniu (construind rezultatul pe baza relaŃiilor din baza de date, fără a face referire la
domeniile atributelor), în timp ce calculul relaŃional pe domenii este dependent de domeniu.
Spunem ca două limbaje de programare sunt echivalente dacă pentru orice expresie
dintr-un limbaj există o expresie echivalentă în cel de-al doilea limbaj şi invers.
Algebra relaŃională şi calculul pe domenii nu sunt echivalente, deoarece calculul pe
domenii permite formularea unor expresii ce sunt dependente de domeniu. Totuşi această
echivalenŃă se poate obŃine dacă limităm calculul pe domenii la o submulŃime de expresii
independente de domeniu.
Un alt dezavantaj al calculului relaŃional pe domenii este dat de numărul mare de
variabile cerute într-o expresie, de obicei o variabilă pentru fiecare atribut. De asemenea, ori de
câte ori se impune o operaŃie de cuantificare, cuantificatorii sunt şi ei multiplicaŃi. Singurul
limbaj bazat, într-o anumită măsură, pe calculul pe domenii este QBE (Query by Example).
În încercarea de a depăşi limitările calculului pe domenii a fost propusă o variantă a
calculului relaŃional, în care variabilele reprezintă tupluri.
Notă. În timp ce se introduce variabila x, o declaraŃie a gamei de valori de forma x(R) specifică
faptul că x poate lua ca valori numai tupluri din relaŃia R. De aceea, acest limbaj nu necesită
37
formularea unor condiŃii atomice ca în calculul pe domenii care să indice că un tuplu aparŃine
unei anumite relaŃii.
Exemple
ObservaŃii.
Nu orice interogare din algebra relaŃională sau din calculul relaŃional pe domenii se poate
exprima în calculul relaŃional pe tupluri. Spre exemplu, interogările care în algebra relaŃională
necesită operatorul reuniune nu pot fi exprimate prin calculul pe tupluri.
După cum se va vedea în capitolul următor, SQL pune la dispoziŃie posibilitatea
construirii în mod explicit a reuniunii, deoarece aspectele declarative ale SQL se bazează pe
calculul pe tupluri cu declaraŃia gamei de valori.
Probleme propuse
38
ROLURI ( NumarFilm, NumarActor, Personaj)
FormulaŃi în calculul relaŃional pe domenii şi în calculul relaŃional pe tupluri interogările care produc:
a). studenŃii care au obŃinut nota 10 la cel puŃin un examen, precizând pentru fiecare numele,
prenumele şi data când au obŃinut prima notă de 10;
b). pentru fiecare curs de la Automatică, studenŃii care au trecut examenul în ultima sesiune;
c). studenŃii care au trecut toate examenele cerute de planul de învăŃământ;
d). pentru fiecare curs de la Electronică, studenŃii care au obŃinut cea mai mare notă;
e). numele şi prenumele studenŃilor care au luat examenul la un curs al cărui titular are acelaşi nume
ca şi studentul.
a). găsiŃi numele, judeŃele şi numărul de locuitori pentru oraşele care au mai mult de 50000 de
locuitori şi sunt traversate de Siret sau Mureş;
b). găsiŃi oraşele care sunt traversate de cel puŃin două râuri, precizând numele oraşului şi numele
celui mai lung râu care-l traversează.
39
Capitolul 5. SQL
SQL este un acronim pentru Structured Query Language şi a fost dezvoltat pentru
sistemul de gestiune a bazelor de date System R, creat de IBM Research Laboratory, San Jose,
California la sfârşitul anilor ’70. SQL a fost standardizat şi a devenit limbajul de referinŃă pentru
bazele de date relaŃionale. SQL nu este numai un limbaj de interogare. El conŃine proprietăŃile
unui limbaj de definire a datelor, LDD (comenzi pentru definirea unei scheme a unei baze de
date relaŃionale) şi proprietăŃile unui limbaj de manipulare a datelor, LMD (comenzi pentru
modificarea şi interogarea unei instanŃe a unei baze de date relaŃionale).
De-a lungul timpului au existat mai multe versiuni de SQL, prima definiŃie a unui
standard pentru SQL fiind promulgată în 1986 de ANSI (the American National Standards
Institute). Acest prim standard conŃinea multe din elementele de bază pentru formularea
interogărilor, oferind în acelaşi timp un suport limitat pentru definirea schemei şi manipularea ei.
În 1989 a apărut versiunea SQL-89, care adaugă la versiunea anterioară definiŃia integrităŃii de
referinŃă. Următoarea versiune, compatibilă în cea mai mare parte cu versiunea anterioară, dar
care conŃinea un număr mare de caracteristici noi, a fost publicată în 1992, fiind cunoscută sub
numele de SQL-2. SQL-3 este cea mai recentă versiune de SQL, compatibilă în totalitate cu
SQL-2, dar nu a fost încă adoptat ca standard.
În această secŃiune vom ilustra utilizarea SQL pentru definirea schemei unei baze de date.
Înainte de aceasta se prezintă notaŃiile folosite în sintaxa limbajului. Cuvintele cheie vor fi scrise
cu caractere normale iar variabilele cu caractere italice. De asemenea:
• parantezele unghiulare <***> marchează termenii;
• parantezele pătrate [***] indică faptul că termenii delimitaŃi sunt opŃionali (pot să nu
apară sau să apară doar o singură dată);
• acoladele {***} indică faptul că termenul din interior poate să nu apară sau poate fi
repetat de un număr arbitrar de ori;
• barele verticale indică faptul că unul dintre termenii delimitaŃi de acestea trebuie să apară.
Parantezele rotunde trebuie privite întotdeauna ca şi cuvinte cheie ale SQL.
SQL pune la dispoziŃie şase familii de domenii elementare, care pot fi utilizate pentru
definirea domeniilor asociate atributelor schemei.
1) Caracter
Domeniul caracter permite reprezentarea caracterelor sau a şirurilor de caractere.
Lungimea şirurilor poate fi fixă sau variabilă. În cazul şirurilor de lungime variabilă trebuie
specificată lungimea maximă. Pentru fiecare schemă este specificat un set de caractere implicit
(latin, chirilic, grecesc etc.). În cazul în care este necesară folosirea a mai mult de un set de
caractere se specifică acest lucru pentru fiecare domeniu.
Sintaxa este:
character [varying] [(Lungime)] [character set NumeSetCaracter]
Dacă lungimea nu este specificată, domeniul reprezintă un singur caracter.
40
2) Bit
Acest domeniu, introdus in SQL-2, este utilizat pentru atribute ce pot avea doar două
valori: 0 sau 1. Se foloseşte pentru reprezentarea atributelor de tip flag (specifică dacă un obiect
are sau nu o anumită proprietate). SQL pune la dispoziŃie de asemenea domeniul „şir de biŃi”,
lungimea şirului fiind specificată ca parametru. Şirurile de biŃi sunt utile pentru reprezentarea
unui grup de proprietăŃi.
Sintaxa este:
bit [varying] [(Lungime)]
Această familie conŃine domenii ce permit reprezentarea valorilor exacte, de tip întreg
sau cu parte fracŃionară. SQL pune la dispoziŃie patru domenii numerice diferite:
• numeric [(Precizie [,Scală])]
• decimal [(Precizie [,Scală])]
• integer
• smallint
Domeniile numeric şi decimal reprezintă numere în baza 10. Parametrul Precizie
specifică numărul total de digiŃi, iar parametrul Scală indică numărul de digiŃi folosiŃi pentru
partea fracŃionară.
Exemplu
decimal (4) – valori între -9999 şi +9999;
numeric (6,3) – valori între -999,999 şi +999,999.
DiferenŃa dintre domeniile numeric şi decimal constă în faptul că domeniul numeric are
exact precizia indicată, în timp ce precizia domeniului decimal trebuie luată drept cerinŃa
minimă.
Dacă precizia nu este specificată, sistemul utilizează valoarea implicită. Dacă scala nu
este specificată, se presupune a fi zero.
Domeniile integer şi smallint pot fi utilizate când nu este nevoie de parte fracŃionară.
4) Domenii numerice aproximative
Exemplu
→ 0.17 ⋅ 1016 ; 0.17 – mantisă; 16 – exponent; valoare = mantisă ⋅ 10
exponent
0.17 E16
41
• float [(Precizie)]
• double precision
• real
Pentru domeniul float se poate furniza, ca parametru, numărul de digiŃi dedicaŃi pentru
reprezentarea mantisei (parametrul Precizie). Domeniul double precision reprezintă numere cu o
precizie ridicată faŃă de domeniul real.
6) Intervale temporale
Această familie de domenii oferă posibilitatea reprezentării intervalelor de timp (de
exemplu durata unei acŃiuni). Sintaxa acestor domenii este:
Interval PrimaUnitateDeTimp [to UltimaUnitateDeTimp],
unde PrimaUnitateDeTimp şi UltimaUnitateDeTimp definesc unităŃile de măsură ce trebuie
folosite. Grupul unităŃilor de măsură este împărŃit în două grupuri distincte: year şi month pe de
o parte şi unităŃile de la day la second pe de altă parte. Această separare are loc deoarece este
imposibilă compararea exactă a zilelor şi a lunilor (deoarece o lună poate avea între 28 şi 31
zile).
Prima unitate de timp poate fi însoŃită de precizie, care va reprezenta numărul de digiŃi
zecimali utilizaŃi pentru reprezentare. Dacă cea mai mică unitate este second, putem specifica
numărul de poziŃii zecimale utilizate (precizia). Dacă a doua unitate de timp este şi prima (deci
singura) atunci primul parametru reprezintă numărul de poziŃii zecimale semnificative, iar cel
de-al doilea poate reprezenta numărul de poziŃii zecimale pentru partea fracŃionară. Dacă precizia
nu este specificată, se foloseşte valoarea implicită 2.
Exemplu
interval year(5) to month – permite reprezentarea intervalelor până la 99999 ani şi 11 luni
interval day(4) to second(6) – permite reprezentarea intervalelor până la 9999zile, 23 ore,
59 minute şi 59,999999 secunde (precizie de 1 milionime de secundă)
42
5.1.2 Definirea schemei bazei de date
SQL permite definirea unei scheme de baze de date ca o colecŃie de obiecte, fiecare
schemă conŃine o mulŃime de domenii, tabele, indici, aserŃii, vederi şi privilegii şi este definită cu
ajutorul următoarei sintaxe:
create schema [NumeSchemă] [[authorization] Autorizare] {DefiniŃieElementeDinSchemă}.
Termenul Autorizare reprezintă numele utilizatorului proprietar al schemei; dacă este
omis se consideră că utilizatorul care a executat comanda este proprietarul schemei. Dacă
NumeSchemă este omis va fi adoptat ca nume al schemei numele utilizatorului ce a executat
comanda. După comanda create schema se pot defini obiectele din schema respectivă.
În continuare ne vom ocupa de tabele şi domenii, urmând ca mai târziu să revenim
asupra celorlalte obiecte al unei scheme.
Un tabel SQL este format dintr-o mulŃime ordonată de atribute şi o mulŃime, posibil
vidă, de constrângeri. Sintaxa ce permite definirea unui tabel este:
create table NumeTabel
(NumeAtribut Domeniu [ValoareImplicită] [Constrângeri]
{, NumeAtribut Domeniu [ValoareImplicită] [Constrângeri]}
[,AlteConstrângeri]
)
Fiecare tabel este definit prin furnizarea numelui său (NumeTabel) şi a definiŃiei
atributelor sale; fiecare atribut are la rândul său un nume (NumeAtribut), un domeniu şi o
posibilă mulŃime de constrângeri ce trebuie satisfăcute de valorile atributului. După ce au fost
definite toate atributele, se pot defini alte constrângeri ce implică mai multe atribute. IniŃial
tabelul nu conŃine înregistrări, proprietarul deŃinând toate privilegiile asupra tabelului, adică
drepturi de a accesa şi de a modifica datele din tabel.
Exemplu
create table Departament
(
NumeDept char(20) primary key,
Adresa char(50),
Oraş char(20)
)
5.1.4 Domenii utilizator
43
DeclaraŃia domeniilor asociază un nume de domeniu cu o mulŃime de constrângeri.
Acest lucru este util atunci când trebuie să repetăm aceeaşi definiŃie de domeniu în mai multe
tabele.
Exemplu
NumărCopii smallint default 0 – dacă se inserează o linie şi nu se specifică valoarea pentru
acest atribut, atunci acestui atribut i se va atribui valoarea 0.
Not Null. Această constrângere indică faptul că valoarea NULL nu este admisă ca valoare pentru
atributul afectat de constrângere. În acest caz valoarea atributului trebuie să fie specificată la
inserare. Este posibilă inserarea unei linii fără a specifica valoarea unui atribut cu constrângere
not NULL doar dacă pentru atributul respectiv s-a definit o valoare implicită diferită de valoarea
NULL.
Specificarea acestei constrângeri se face prin adăugarea cuvintelor cheie not NULL la
definirea atributului.
Exemplu
Nume character(20) not NULL
Unique. O constrângere de tip unique se aplică unui atribut (sau unei mulŃimi de atribute) dintr-
un tabel şi impune ca atributul, respectiv mulŃimea de atribute să formeze o (super) cheie. Se
impune astfel ca linii diferite să nu conŃină aceleaşi valori. ExcepŃie face valoarea NULL, care
poate apărea în diverse linii fără a încălca constrângerea. Aceasta se datorează faptului că fiecare
valoare NULL reprezintă o valoare necunoscută diferită de ce a altei valori NULL.
44
Există două moduri de definire a acestei constrângeri. Prima variantă se utilizează doar în
cazul în care constrângerea implică un singur atribut şi constă în adăugarea cuvântului cheie
unique la definirea atributului.
Exemplu
NrInreg numeric(4) unique
A doua variantă se aplică în cazul în care constrângerea implică mai multe atribute şi
constă în utilizarea clauzei unique (Atribut{, Atribut}) după definirea atributelor.
Exemplu
Nume character(20) not NULL,
Prenume character(20) not NULL,
Unique (Nume, Prenume)
Primary key. Această constrângere poate fi specificată o singură dată pentru un tabel şi poate fi
definită pe un singur atribut sau pe o mulŃime de atribute. DefiniŃia unei astfel de constrângeri
implică definirea implicită a unor constrângeri not NULL pentru atributul (atributele) cheii
primare.
Exemplu
Nume character(20),
Prenume character(20),
Dept character(15),
Salariu numeric(9) default 0,
primary key (Nume, Prenume)
După cum am mai precizat într-o secŃiune anterioară, cele mai importante constrângeri
inter-relaŃionale sunt constrângerile de integritate referenŃială. ConstrucŃia utilizată de SQL
pentru definirea acestora este constrângerea de tip foreign key. Această constrângere impune ca
pentru fiecare linie dintr-un tabel (numit tabel intern), valoarea corespunzătoare unui atribut,
diferită de NULL, să se regăsească printre valorile unui atribut din liniile unui alt tabel (numit
tabel extern). Singura cerinŃă impusă de sintaxă este ca atributul referit din tabelul extern să fie
subiectul unei constrângeri unique. Această cerinŃă este satisfăcută dacă atributul în cauză
formează o cheie primară pentru tabelul extern.
Constrângerile de referinŃă pot fi definite în două moduri.
În cazul în care în constrângere este implicat un singur atribut se utilizează construcŃia
sintactică references, care indică tabelul extern şi atributul asociat.
Exemplu
Create table Angajati
(
NrInreg numeric(6) primary key,
Nume character(20) not NULL,
Prenume character(20) not NULL,
Dept character(15)
references Departament (NumeDept),
Salariu numeric(9) default 0,
Oras character(15),
unique (Nume, Prenume)
)
45
Dacă legătura se face între o mulŃime de atribute se va utiliza construcŃia foreign key,
plasată după definirea tuturor atributelor. Această construcŃie listează mai întâi atributele
constrânse din tabelul intern, urmate de numele tabelului extern şi de numele atributelor referite.
Exemplu
Create table Angajati
(
NrInreg numeric(6) primary key,
Nume character(20) not NULL,
Prenume character(20) not NULL,
Dept character(15)
references Departament (NumeDept),
Salariu numeric(9) default 0,
Oras character(15),
unique (Nume, Prenume),
foreign key (Nume, Prenume) references DatePersonale (Nume, Prenume)
)
46
• cascade: vor fi şterse toate liniile din tabelul intern corespunzătoare liniei şterse din
tabelul extern;
• set NULL: se asignează valoarea NULL atributului din tabelul intern în locul valorii
şterse din tabelul extern;
• set default: atributul din tabelul intern va primi valoarea implicită în locul valorii
şterse din tabelul extern;
• no action: operaŃia de ştergere este rejectată.
Specificarea modului de reacŃie în cazul violării unei constrângeri de referinŃă se face
imediat după definirea constrângerii prin sintaxa:
on <delete | update>
<cascade | set NULL | set default | no action>
Exemplu
Create table Angajati
(
NrInreg numeric(6),
Nume character(20) not NULL,
Prenume character(20) not NULL,
Dept character(15)
Salariu numeric(9) default 0,
Oras character(15),
primary key (Nr Inreg),
foreign key (Dept) references Departament (NumeDept)
on delete set NULL
on update cascade,
unique (Nume, Prenume)
)
Comenzile definite în SQL pentru manipularea schemelor unei baze de date sunt alter şi
drop.
Comanda alter. Această comandă permite modificarea domeniilor şi schemelor de tabele şi
poate avea o varietate de forme:
alter domain NumeDomeniu <set default ValoareImplicită |
drop default |
add constraint DefiniŃieConstrângere |
drop constraint NumeConstrângere>
alter table NumeTabel
<alter column NumeAtribut
<set default ValoareImplicită | drop default> |
add constraint DefiniŃieConstrângere |
drop constraint NumeConstrângere |
add column DefiniŃieAtribut |
drop column NumeAtribut>
Prin utilizarea celor două comenzi se pot opera următoarele modificări asupra domeniilor
şi tabelelor:
• adăugare / eliminare constrângeri;
• modificare valoare implicită;
47
• adăugare / eliminare atribute din schema unui tabel.
Notă. În momentul definirii unei noi constrângeri, datele din tabel trebuie să satisfacă acea
constrângere. În caz contrar definiŃia constrângerii nu va fi validată.
Comanda drop. Această comandă permite eliminarea datelor de tip schemă, domeniu, tabel,
vedere sau aserŃie (constrângere ce nu este asociată unui anumit tabel).
Sintaxa comenzii drop este:
drop <schema | domain | table | view | assertion> NumeComponentă [<restrict | cascade>]
OpŃiunea restrict specifică faptul că această componentă nu va fi validată în situaŃia în
care componenta nu este vidă sau este referită în definiŃia altei componente. Astfel o schemă nu
va fi eliminată dacă ea conŃine tabele sau alte componente; un domeniu nu va fi eliminat dacă
apare în definiŃia unui tabel ş.a.m.d. Această opŃiune este implicită.
Folosind opŃiunea cascade componenta este eliminată împreună cu toate componentele
dependente. Eliminarea unei scheme care nu este vidă va conduce la eliminarea tuturor
obiectelor care intră în componenŃa sa. Ştergerea unui tabel folosind această opŃiune implică
ştergerea tuturor liniilor din tabel. OpŃiunea cascade trebuie utilizată cu mare atenŃie deoarece în
cazul în care există dependenŃe care nu au fost luate în calcul, rezultatul poate fi diferit de cel
scontat. Multe din sistemele comerciale oferă posibilitatea testării rezultatului comenzii drop cu
opŃiunea cascade înainte de execuŃia efectivă a comenzii.
Interogarea unei baze de date poate fi exprimată în SQL prin intermediul instrucŃiunii
select, care are sintaxa:
select ExprAtribut [[as] Alias ] {, ExprAtribut [[as] Alias]}
from NumeTabel [[as] Alias ] {, NumeTabel [[as] Alias]}
[where Conditie]
O cerere SQL va lua în considerare doar liniile ce aparŃin produsului cartezian al
tabelelor listate în clauza from şi va stabili liniile ce satisfac condiŃia exprimată în clauza where.
Rezultatul execuŃiei unei cereri SQL este un tabel, având câte o linie pentru fiecare linie selectată
de clauza where şi ale cărui coloane rezultă din evaluarea expresiilor ExprAtribut ce apar în
clauza select (lista Ńintă). Fiecare coloană poate fi redenumită cu ajutorul unui Alias ce urmează
imediat după expresie. Tabelele pot fi de asemenea redenumite prin intermediul unui Alias.
Exemplu
48
cu precizarea ca salariul înregistrat este anual.
ANGAJATI
Nume Prenume Dept Birou Salariu
Ionescu Maria Administratie 10 45
Popescu Ion Productie 20 36
Popa Stefan Administratie 20 40
Dumitrescu Vasile Distributie 16 45
Ionescu Ion Planificare 14 80
Manole Radu Planificare 7 73
Luca Doru Administratie 75 40
Vasile Alina Productie 20 46
DEPARTAMENT
Dept Adresa Oras
Administratie Independentei Iasi
Productie Primaverii Bucuresti
Distributie Central Focsani
Planificare Nicolina Iasi
Cercetare Trandafirului Cluj
Fig. 5.1 ConŃinutul tabelelor ANGAJATI şi DEPARTAMENT
Salariu
45
80
Fig. 5.2. Rezultatul interogării 1
Lista Ńintă. Lista Ńintă specifică elementele schemei tabelelor rezultat. Caracterul special * poate
să apară în lista Ńintă şi reprezintă selecŃia tuturor atributelor tabelelor precizate în clauza from.
Exemplu
select *
from Angajati
where Nume = ’Ionescu’
49
Lista Ńintă poate conŃine expresii ce utilizează valorile atributelor din fiecare linie
selectată.
Exemplu
SalariuLunar
3.00
Fig. 5.4 Rezultatul interogării 3
Clauza from. Dacă o interogare implică înregistrări din mai multe tabele, argumentul din clauza
from va reprezenta o listă de tabele. CondiŃiile din clauza where sunt aplicate în acest caz
produsului cartezian al acestor tabele; se poate specifica o joncŃiune prin indicarea explicită a
comparaŃiilor între atribute din tabele diferite.
Exemplu
În interogarea precedentă s-a folosit operatorul punct (’.’) pentru identificarea tabelului
din care se extrag atributele. Folosirea acestei construcŃii este necesară în cazul în care tabelele
din clauza from au atribute cu acelaşi nume, pentru a distinge între referinŃele la atribute
omonime. În cazul în care nu există posibilitatea apariŃiei unei ambiguităŃi se poate specifica
atributul fără a preciza tabelul căruia îi aparŃine.
Într-o interogare se pot utiliza alias-uri pentru tabele cu scopul de a scurta referinŃa la
acestea.
50
Exemplu
Interogarea 4 se poate exprima astfel
select a.Nume, a.Prenume, d.Oras
from Angajati a, Departament d
where a.Dept = d.Dept
Clauza where. CondiŃia din clauza where este o expresie booleană formată prin combinarea
predicatelor simple cu operatorii and, or şi not. Fiecare predicat simplu utilizează operatorii de
comparaŃie (=, >, >=, <, <=, <>) şi are, într-un membru, o expresie formată din valori ale
atributelor dintr-o linie şi în celălalt membru o valoarea constantă sau o altă expresie. Prioritar
este operatorul not, dar nu se introduce o precedenŃă între and, şi or. Dacă într-o expresie se
folosesc ambii operatori and şi or este indicată specificarea precedenŃei prin utilizarea
parantezelor.
Exemplu
Interogarea 5: Să se găsească prenumele angajaŃilor cu numele Ionescu care lucrează în
departamentele Administratie sau Productie.
select Prenume
from Angajati
where Nume = ’Ionescu’ and (Dept = ’Administratie’ or Dept = ’Productie’)
Rezultatul este prezentat în figura 5.6.
Prenume
Maria
Fig. 5.6 Rezultatul interogării 5
Pentru compararea şirurilor de caractere SQL pune la dispoziŃie operatorul like. Acest
operator compară un şir cu alt şir, specificat parŃial cu ajutorul caracterelor speciale ’_’ şi ’%’.
Caracterul ’_’ substituie un caracter oarecare iar ’%’ substituie un şir oarecare de caractere,
posibil vid.
Exemplu
Gestiunea valorilor NULL. Pentru selecŃia atributelor având valori NULL SQL prevede
predicatul is NULL care este adevărat doar dacă atributul are valoarea NULL. Predicatul is not
NULL este adevărat în caz contrar celui prezentat anterior. Sintaxa este:
Atribut is [not] NULL
Duplicate. O diferenŃă majoră între SQL şi algebra, respectiv calculul relaŃional constă în
gestiunea înregistrărilor duplicat. În algebra relaŃională şi în calculul relaŃional un tabel este
văzut ca o relaŃie matematică, mai exact ca o mulŃime de tupluri distincte între ele. În SQL un
tabel poate avea mai multe linii ce conŃin aceleaşi valori pentru toate atributele (duplicate). Dacă
se doreşte emularea comportării din algebra relaŃională în SQL ar trebui eliminate toate
duplicatele la fiecare execuŃie a unei operaŃii de proiecŃie. Deoarece operaŃia de eliminare a
duplicatelor este consumatoare de timp şi adesea nu este necesară, executarea acestei operaŃii
este lăsată la latitudinea persoanei ce implementează interogarea.
51
Eliminarea duplicatelor este specificată prin cuvântul cheie distinct, plasat imediat după
select:
select [<distinct | [all]>]
OpŃiunea all indică faptul că vor fi păstrate toate înregistrările din rezultat (deci inclusiv
duplicatele) şi este opŃiunea implicită.
Exemplu
PERSOANA
Cod Nume Prenume Oras
IS001122 Ionescu Maria Iasi
BC012345 Popescu Ion Bucuresti
IS123456 Ionescu Vasile Iasi
SV342345 Ionescu Radu Suceava
Fig. 5.7 ConŃinutul tabelei PERSOANA
select Oras
from Persoana
where Nume = ’Ionescu’
Prin executarea celor două interogări se obŃin rezultatele din figura 5.8
Oras Oras
Iasi Iasi
Iasi Suceava
Suceava
JoncŃiuni. SQL-2 introduce o sintaxă alternativă pentru specificarea joncŃiunilor, fiind astfel
posibilă realizarea unei distincŃii între condiŃiile ce reprezintă condiŃii de joncŃiune şi cele ce
reprezintă selecŃii de linii.
Sintaxa propusă este:
select ExprAtribut [[as] Alias] {, ExprAtribut [[as] Alias]}
from NumeTabel [[as] Alias]
{[TipJonctiune] join NumeTabel [[as] Alias] on CondJonctiune}
[where AlteConditii]
52
În acest fel, condiŃia de joncŃiune este mutată din clauza where în clauza from. Parametrul
TipJonctiune specifică tipul joncŃiunii: inner, left sau full. Inner join corespunde theta-joncŃiunii
din algebra relaŃională.
Exemplu
Interogarea 4 se poate rescrie sub forma
select Nume, Prenume, Oras
from Angajati a inner join Departament d
on a.Dept = d.Dept
În cazul unei joncŃiuni, liniile dintr-un tabel ce nu au linii corespondente în celălalt tabel
vor fi eliminate din rezultat. Pentru a forŃa apariŃia unor astfel de linii în rezultat se poate apela la
joncŃiunea externă, cu cele trei variante:
• left join – furnizează acelaşi rezultat ca şi inner join, dar include liniile tabelului ce
apare în stânga joncŃiunii pentru care nu există linii corespondente în
tabelul din dreapta;
• right join – păstrează liniile tabelului din dreapta ce nu au corespondent în tabelul din
stânga;
• full join – furnizează acelaşi rezultat ca şi inner join, suplimentat cu liniile excluse
din ambele tabele.
Exemplu
Se consideră o bază de date care conŃine tabelele SOFERI (Nume, Prenume, ID) şi
AUTOVEHICULE (NrInreg, Marca, Model, ID) prezentate în figura 5.9.
SOFERI
Nume Prenume ID
Ionescu Maria VR 001Y
Popescu Ion PZ 111B
Popa Stefan AP 222C
AUTOVEHICULE
NrInreg Marca Model ID
IS01AAA BMW 323 VR 001Y
SV02BBB BMW Z3 VR 001Y
IS02CCC Lancia Delta PZ 111B
IS01EFD BMW 316 MI 222C
Fig. 5.9 ConŃinutul tabelelor SOFERI şi AUTOVEHICULE
53
Interogarea 9: Să se găsească toŃi şoferii şi toate maşinile împreună cu posibilele relaŃii
între ele.
Unele implementări de SQL specifică joncŃiunea externă prin adăugarea unui caracter
special sau a unei secvenŃe de caractere (* sau (+)) la atributele implicate în condiŃia de
joncŃiune.
Exemplu
Exemplu
Utilizarea variabilelor. Am văzut mai înainte cum se pot asocia nume alternative, numite alias-
uri, tabelelor din clauza from şi avantajele folosirii acestora.
Prin folosirea alias-urilor se poate referi un tabel de mai multe ori, într-un mod similar
operatorului de redenumire ρ din algebra relaŃională. De fiecare dată când este introdus un alias,
se declară o variabilă de tip tabel care are ca valoare conŃinutul tabelului pentru care se introduce
alias-ul. Când un tabel apare doar o singură dată în interogare, nu este nici o diferenŃă în a
54
interpreta alias-ul ca pseudonim sau ca o nouă variabilă. Când tabelul apare de mai multe ori este
esenŃial să privim alias-ul ca o nouă variabilă.
Exemplu
Interogarea 10: Se consideră baza de date din figura 5.1. Să se găsească toŃi angajaŃii ce
au acelaşi nume (dar prenume diferite) cu un angajat care lucrează în departamentul
ProducŃie.
Ordonarea. În general, rezultatul unei interogări conŃine linii, aranjate într-o ordine oarecare.
Dacă se doreşte impunerea unei ordonări după un anumit criteriu asupra liniilor returnate de o
interogare se va utiliza clauza order by. Sintaxa este:
order by Atribut [asc | desc]
{, Atribut [asc | desc]}
Exemplu
select *
from Autovehicule
order by Marca desc, Model desc
55
5.2.2 Interogări agregate
Operatorii agregaŃi constituie una din cele mai importante extensii ale SQL în comparaŃie
cu algebra relaŃională.
În algebra relaŃională toate condiŃiile sunt evaluate pentru un singur tuplu la un moment
dat. Adesea apare necesitatea evaluării unor proprietăŃi ce depind de o mulŃime de tupluri (de
exemplu aflarea numărului de angajaŃi ce lucrează în departamentul ProducŃie).
Operatorii agregaŃi sunt:
Exemplu
Interogarea 13: Să se găsească numărul valorilor distincte pentru atributul Salariu pentru
toŃi angajaŃii din tabela ANGAJAłI.
Interogarea 14: Să se găsească numărul de linii din tabelul ANGAJATI care au valori
diferite de NULL pentru atributul Salariu.
Exemplu
Interogarea 15: Să se găsească salariul maxim, mediu şi minim pentru toŃi angajaŃii din
tabela ANGAJAłI.
Interogarea 16: Să se găsească salariul maxim pentru angajaŃii care lucrează într-un
departament din Iasi.
select max(Salariu)
from Angajati a, Departament d
where a.Dept = d.Dept and Oras = ’Iasi’
Exemplu
Dept Salariu
Administratie 45
Productie 36
Administratie 40
Distributie 45
Planificare 80
Planificare 73
Administratie 40
Productie 46
Fig. 5.13 ProiecŃia pe atributele Dept şi Salariu a tabelei ANGAJAłI
Tabelul rezultat este apoi împărŃit în mulŃimi ce au aceeaşi valoare pentru atributele
listate în clauza group by. Rezultatul acestei grupări este dat în figura 5.14.
57
Dept Salariu
Administratie 45
Administratie 40
Administratie 40
Productie 36
Productie 46
Distributie 45
Planificare 80
Planificare 73
Fig. 5.14 Regrupare în acord cu valorile atributului Dept
Odată stabilite grupurile de linii, funcŃia agregat se aplică fiecărui grup în parte.
Rezultatul final al interogării este tabelul din figura 5.15.
Dept Salariu
Administratie 125
Productie 82
Distributie 45
Planificare 153
Fig. 5.15 Rezultatul final al interogării
Sintaxa SQL impune restricŃia ca, ori de câte ori este utilizată clauza group by, atributele
ce pot apărea în clauza select să fie o submulŃime a atributelor din clauza group by. Motivul
acestei restricŃii va fi prezentat prin următorul exemplu.
Exemplu
Pentru a lua în considerare doar grupurile de linii ce satisfac anumite condiŃii trebuie
utilizată clauza having. Dacă aceste condiŃii pot fi verificate la nivel de linie, atunci este
suficientă utilizarea predicatelor corespunzătoare ca argument al clauzei where. Clauza having
conŃine condiŃii ce trebuie aplicate la terminarea execuŃiei interogării ce utilizează clauza group
by. Fiecare submulŃime de linii va participa la formarea rezultatului doar dacă satisface condiŃia
din clauza having.
Sintaxa permite ca în clauza having să apară expresii booleene, formate din predicate
simple şi operatori booleeni. Predicatele simple pot fi:
• comparaŃii între rezultatul evaluării unei funcŃii agregat şi o expresie generică
• comparaŃii între atribute ce formează clauza group by şi o expresie generică.
Se recomandă ca în clauza having să apară doar predicatele ce implică o funcŃie agregat
şi restul predicatelor să fie incluse în contextul clauzei where.
58
Exemplu
Se consideră tabelul ANGAJATI din figura 5.1.
Interogarea 18: Să se găsească departamentele în care salariul mediu al angajaŃilor din
biroul 20 este mai mare ca 25.
select Dept
from Angajati
where Birou = ’20’
group by Dept
having avg(Salariu) > 25
SQL pune la dispoziŃie operatori din teoria mulŃimilor, cum ar fi operatorii de reuniune
(union), intersecŃie (intersect) şi diferenŃă (except sau minus). Este de notat că orice interogare
ce utilizează operatorii de intersecŃie şi diferenŃă poate fi exprimată cu ajutorul interogărilor
imbricate. Sintaxa pentru utilizarea operatorilor din teoria mulŃimilor este:
InterogareSQL {<union | intersect | except> [all] InterogareSQL}
Operatorii din teoria mulŃimilor presupun eliminarea duplicatelor ca opŃiunea implicită.
Dacă se doreşte utilizarea acestor operatori cu menŃinerea duplicatelor este suficientă
specificarea opŃiunii all.
ObservaŃie. SQL nu impune ca schemele pe care se execută operaŃiile să fie identice (spre
deosebire de algebra relaŃională), ci doar ca atributele să aibă domenii compatibile.
CorespondenŃa între atribute nu se bazează pe nume, ci pe poziŃia atributelor. Dacă atributele au
nume diferite, rezultatul va prelua numele de atribute din primul operand.
Exemple
59
from Angajati
c) Să se găsească numele de angajaŃi care nu sunt şi prenume
select Prenume as NumeAngajat
from Angajati
except
select Nume
from Angajati
NumeAngajat NumeAngajat NumeAngajat
Ionescu Vasile Ionescu
Popescu Popescu
Popa Popa
Dumitrescu Dumitrescu
Manole Manole
Luca Luca
Vasile
Maria
Ion
Stefan
Radu
Doru
Alina
a) b) c)
Fig 5.16 Rezultatul interogărilor a), b) şi c)
5.2.5 Interogări imbricate
Până acum toate interogările formulate conŃineau în clauza where o condiŃie compusă, în
care fiecare predicat reprezintă o comparaŃie între două valori. Se pot defini predicate cu
structură complexă, în care o expresie valorică poate fi comparată cu rezultatul execuŃiei unei
interogări SQL. Interogarea utilizată în comparaŃie se defineşte în interiorul predicatului din
clauza where şi se numeşte interogare imbricată.
În general, primul operand al unei comparaŃii de genul celei amintite anterior este un
atribut, în timp ce în celălalt membru avem o mulŃime de valori (rezultatul interogării). Pentru a
rezolva această problemă a eterogenităŃii termenilor comparaŃiei, SQL pune la dispoziŃie
cuvintele cheie any şi all pentru a extinde operatorii de comparaŃie.
Cuvântul cheie any specifică faptul că linia este validă dacă valoarea atributului se află în
relaŃie cu cel puŃin o valoare returnată de interogarea imbricată.
Cuvântul cheie all specifică faptul că linia este validă dacă valoarea atributului se află în
relaŃie cu toate valorile returnate de interogare.
Sintaxa cere ca domeniul elementelor returnate de interogarea imbricată să fie compatibil
cu atributul cu care se face comparaŃia.
Exemplu
Se consideră tabelele ANGAJATI şi DEPARTAMENT prezentate în figura 5.1.
Interogarea 19: Să se găsească angajaŃii ce lucrează într-un departament din Iaşi.
select Nume, Prenume
from Angajati
where Dept = any (select Dept
from Departament
where Oras = ’Iasi’)
ObservaŃie. Această interogare poate fi rezolvată prin realizarea unei joncŃiuni între cele
două tabele.
60
Interogarea 20: Să se găsească departamentele în care nu lucrează nici un angajat cu
numele Ionescu.
select Dept
from Departament
where Dept <> all (select Dept
from Angajati
where Nume = ’Ionescu’)
Exemplu
Se consideră tabelele ANGAJATI şi DEPARTAMENT prezentate în figura 5.1.
Interogarea 21: Să se găsească departamentele în care lucrează angajaŃii ce câştigă cel
mai mare salariu.
select Dept
from Angajati
where Salariu = any (select max(Salariu)
from Angajati)
sau
select Dept
from Angajati
where Salariu >= all (select Salariu
from Angajati)
ObservaŃii.
• Deşi cele două interogări sunt echivalente, este indicată folosirea funcŃiilor
agregat deoarece sunt mai concludente şi se execută mai eficient.
• În cazul primei interogări nu există nici o diferenŃa dacă în loc de operatorul any
se foloseşte operatorul all (deoarece interogarea internă are ca rezultat o singură
linie).
61
context în altul. În acest caz, noua interpretare pentru interogările imbricate este următoarea:
pentru fiecare linie din interogarea externă se evaluează mai întâi interogarea imbricată şi apoi se
evaluează predicatul din interogarea externă.
Există o restricŃie privind vizibilitatea variabilelor SQL. O variabilă poate fi utilizată doar
în interiorul interogării în care este definită sau în interogarea imbricată din interogarea în care
este definită. Dacă o interogare conŃine interogări imbricate pe acelaşi nivel, variabilele declarate
în clauza from a unei interogări nu pot fi utilizate în contextul celeilalte interogări.
Vom exemplifica semnificaŃia interogărilor imbricate complexe împreună cu descrierea
unui operatorului logic exists. Acest operator acceptă ca parametru o interogare imbricată şi
returnează valoarea adevărat doar dacă interogarea nu produce un rezultat vid.
Exemplu
Se consideră relaŃia PERSOANA din figura 5.7.
Interogarea 22: Să se găsească persoanele care au acelaşi nume şi prenume, dar coduri
diferite.
select *
from Persoana P
where exists (select *
from Persoana P1
where P1.Nume = P.Nume and
P1.Prenume = P.Prenume and
P1.Cod <> P.Cod )
O altă cale de a formula interogarea din exemplul anterior este prin folosirea
constructorului de tuplu, reprezentat de o pereche de paranteze rotunde care marchează lista de
atribute.
Exemplu
Se consideră relaŃia PERSOANA din figura 5.7.
Interogarea 23: Să se găsească toate persoanele ce nu au omonime.
select *
from Persoana P
where (Nume, Prenume) not in (select Nume, Prenume
from Persoana P1
where P1.Cod <> P.Cod )
62
5.3 Modificarea datelor în SQL
Exemplu
insert into Departament (Dept, Oras) values (’ProducŃie’, ’Suceava’)
A doua variantă permite adăugarea unei mulŃimi de linii, care sunt extrase mai întâi din
baza de date.
Exemplu
insert into DepartamenteIasi (select Dept, Adresa
from Departament
where Oras = ’Iasi’)
Dacă valorile pentru anumite atribute nu sunt specificate în momentul inserării, se vor
asigna valori implicite sau valori NULL în cazul în care nu sunt definite valori implicite.
CorespondenŃa între atributele tabelului şi valorile ce urmează a fi inserate este dictată de
ordinea în care termenii apar în definiŃia tabelului. Astfel primul element din ListaValori (în
cazul primei variante) sau primul element din lista Ńintă (în cazul celei de-a doua variante)
trebuie să corespundă primului element ce apare în ListaAtribute (sau în definiŃia tabelului dacă
ListaAtribute este omisă) şi aşa mai departe pentru celelalte atribute.
Exemplu
delete from Departament where Dept not in (select Dept from Angajati)
Comanda de mai sus şterge departamentele fără angajaŃi.
63
Este de notat diferenŃa dintre comanda delete şi comanda drop definită în secŃiunea 5.1.8.
O comandă de genul
delete from Departament
şterge toate liniile din tabelul DEPARTAMENT, şi posibil toate liniile tabelelor care sunt legate
prin constrângeri de referinŃă de acesta, dacă opŃiunea cascade este precizată ca eveniment la
ştergere. Schema bazei de date rămâne neschimbată, comanda modificând doar instanŃa bazei de
date. Comanda
drop table Departament cascade
are acelaşi efect ca şi comanda anterioară, dar în acest caz schema bazei de date se modifică,
tabelul DEPARTAMENT fiind şters, la fel ca şi vederile sau tabelele care se referă la el în
definiŃiile lor. Comanda
drop table Departament restrict
eşuează dacă există linii în tabelul DEPARTAMENT.
Exemplu
Comanda
update Angajati set Salariu = Salariu * 1.1
where Dept = ’Administratie’
produce o creştere cu 10% a salariilor angajaŃilor din departamentul Administratie.
Natura SQL, care este orientat pe operaŃiile cu mulŃimi, trebuie luată în considerare
când se scriu comenzi de actualizare.
Să presupunem că se doreşte modificarea salariilor angajaŃilor astfel: creşterea
salariilor sub 30 mii cu 10% şi a salariilor peste 30 mii cu 15%. O cale de a face
actualizarea este execuŃia următoarelor comenzi:
update Angajati set Salariu = Salariu * 1.1
where Salariu <= 30
update Angajati set Salariu = Salariu * 1.15
where Salariu > 30
64
Să presupunem că avem un angajat care câştigă 28 mii, deci satisface condiŃia din
prima comanda de actualizare şi atributul Salariu va fi setat la 30.8 mii. În acest moment,
linia satisface de asemenea şi condiŃia celei de-a doua actualizări, deci salariul va fi
modificat din nou. Creşterea pentru salariatul respectiv va fi de 26.5%.
Această problemă particulară poate fi rezolvată prin inversarea celor două operaŃii
de actualizare.
În situaŃiile mai complexe soluŃia ar putea să necesite introducerea unor actualizări
intermediare sau utilizarea unui limbaj de programare de înalt nivel care foloseşte
cursori. Această tehnică va fi prezentată în lucrările de laborator.
Pentru specificarea altor constrângeri decât cele discutate până acum, SQL-2 a introdus
constrângerea check, care are următoarea sintaxă:
check (CondiŃie)
CondiŃiile ce pot fi utilizate sunt cele ce pot apărea în clauza where a unei interogări SQL.
CondiŃia impusă trebuie verificată întotdeauna pentru a menŃine corectitudinea bazei de date. În
acest fel pot fi specificate toate constrângerile pe tuplu discutate anterior, deoarece condiŃia din
constrângerea check poate face referire la alte atribute.
Pentru exemplificarea acestei construcŃii vom redefini schema tabelului ANGAJATI din
secŃiunea 5.1.7:
Exemplu
create table Angajati
(NrInreg character(6) check ( NrInreg is not NULL and
1 = (select count(*)
from Angajati a
where NrInreg = a.NrInreg)),
Nume character(20) not NULL check ( Nume is not NULL),
Prenume character(20) check ( Prenume is not NULL and
1 = (select count(*)
from Angajati a
where Prenume = a.Prenume and Nume = a.Nume)),
Dept character(15) check (Dept in (select Dept from Departament)))
ObservaŃii
• constrângerile predefinite permit o reprezentare compactă şi mai uşor de citit;
• prin utilizarea clauzei check se pierde posibilitatea specificării unei reacŃii în cazul
încălcării constrângerii;
• când se utilizează constrângeri predefinite, sistemul le recunoaşte imediat şi le poate
verifica mult mai eficient.
65
5.4.2 AserŃii
AserŃiile reprezintă constrângeri ce nu sunt asociate unei anumite linii sau unui anumit
tabel în particular şi fac parte din schema bazei de date. AserŃiile permit definirea tuturor
constrângerilor prezentate şi, în plus, permit definirea unor constrângeri care nu pot fi exprimate
altfel (de exemplu constrângeri între mai multe tabele, constrângeri ce impun ca un tabel să aibă
o anumită cardinalitate). AserŃiile au un nume şi pot fi şterse cu ajutorul comenzii drop.
Sintaxa ce permite definiŃia aserŃiilor este:
create assertion NumeAsertie check (Conditie)
Exemplu
create assertion CelPutinUnAngajat
check ( 1<= (select count(*)
from Angajati))
5.4.3 Vederi
În capitolul 3 vederile au fost introduse ca fiind tabele ‚virtuale’ al căror conŃinut depinde
de conŃinutul altor tabele din baza de date. În SQL vederile sunt definite prin asocierea unui
nume şi a unei liste de atribute cu rezultatul execuŃiei unei interogări.
O vedere se defineşte folosind comanda:
create view NumeVedere [(ListaAtribute)] as InterogareSQL
[with [<local | cascaded>] check option]
Interogarea SQL şi schema vederii trebuie să aibă acelaşi număr de atribute.
Exemplu
Să se definească vederea AngajatiAdmin care va conŃine toŃi angajaŃii din departamentul
AdministraŃie şi care au salariul mai mare ca 10.
create view AngajatiAdmin (NrInreg, Nume, Prenume, Salariu) as
select NrInreg, Nume, Prenume, Salariu
from Angajati
where Dept = ’Administratie’ and Salariu > 10
În cazul anumitor vederi se pot efectua operaŃii de actualizare, dar aceste operaŃii trebuie
translate în instrucŃiuni de modificare a tabelelor ce stau la baza vederii. Nu întotdeauna se pot
66
găsi soluŃii de modificare a tabelelor de bază, mai ales în situaŃiile în care vederea se defineşte pe
baza unei joncŃiuni între mai multe tabele.
În general sistemele comerciale permit modificarea unei vederi doar dacă este definită pe
un singur tabel; alte sisteme cer ca atributele vederii să conŃină măcar o cheie primară a tabelului
de bază.
Clauza check option specifică faptul că operaŃiile de actualizare se pot face numai asupra
liniilor ce aparŃin vederii şi după actualizare liniile continuă să aparŃină vederii. Când o vedere
este definită pe baza altor vederi, opŃiunile local sau cascaded specifică dacă ştergerea liniilor se
face la nivel local sau trebuie propagată la toate vederile de care depinde vederea în cauză.
OpŃiunea implicită este cascaded.
Exemplu
Să se definească vederea AngajatiAdmin1, bazată pe vederea AngajatiAdmin, care va
conŃine toŃi angajaŃii din departamentul AdministraŃie şi care au salariul între 10 şi 50.
create view AngajatiAdmin1 as
select *
from AngajatiAdmin
where Salariu < 50
with check option
Încercarea de a da valoarea 8 atributului Salariu nu va fi acceptată de definiŃia curentă a
vederii, dar ar fi fost validată dacă check option ar fi fost definită ca local. Încercarea de
a modifica valoarea atributului Salariu pentru o linie din vedere la valoarea 60 nu ar fi
validată nici cu opŃiunea local.
Vederile pot fi utilizate în SQL pentru formularea unor interogări care altfel ar fi
imposibil de exprimat. În general, vederile pot fi considerate ca fiind unelte ce măresc
posibilitatea creării interogărilor imbricate.
Exemplu
Interogarea 24: Să se găsească departamentul cu cel mai mare buget alocat salariilor.
create view BugetSalarii (Dept, SalariuTotal) as
select Dept, sum(Salariu)
from Angajati
group by Dept
select Dept
from BugetSalarii
where SalariuTotal = (select max(SalariuTotal)
from BugetSalarii)
67
Ca regulă generală, utilizatorul care creează o resursă este proprietarul ei şi este autorizat
să efectueze orice operaŃie asupra acelei resurse. Din cauza acestei limitări, SQL pune la
dispoziŃie mecanisme de organizare ce permit administratorului să specifice acele resurse la care
utilizatorii au acces şi cele la care nu au acces. Prin intermediul acestor mecanisme utilizatorii
dispun de privilegii de acces la resursele sistemului.
Fiecare privilegiu de acces este caracterizat de:
• resursa la care face referire;
• utilizatorul ce acordă privilegiul;
• utilizatorul ce primeşte privilegiul;
• operaŃia permisă asupra resursei;
• posibilitatea acordării privilegiului altor utilizatori.
În momentul creării unei resurse, sistemul acordă, în mod automat, toate privilegiile
asupra resursei creatorului său. Există un utilizator predefinit, _system, asociat administratorului
bazei de date, ce deŃine toate privilegiile asupra tuturor resurselor.
Tipurile de privilegii disponibile sunt:
1) insert – permite inserarea unui obiect nou în resursă (aplicabil numai tabelelor şi
vederilor);
2) update – permite modificarea valorii unui obiect (poate fi utilizat cu tabele, vederi şi
atribute);
3) delete – permite eliminarea unui obiect din resursă (doar tabele sau vederi);
4) select – permite utilizatorului să citească resursa cu scopul de a o utiliza în interogări
(tabele, vederi sau atribute);
5) references – permite crearea unei referinŃe către o resursă în contextul definirii unui
tabel. Poate fi asociat cu tabele sau atribute. Acordarea acestui privilegiu asupra unei
resurse poate conduce la limitarea posibilităŃii de modificare a resursei. Să considerăm
că utilizatorul Paul este proprietarul tabelului DEPARTAMENT, iar utilizatorul
Ştefan deŃine privilegiul de referinŃă. Ştefan are posibilitatea să definească o
constrângere de tip foreign key pe tabelul său ANGAJATI, referind resursa indicată
de privilegiu (de exemplu cheia tabelului DEPARTAMENT). Dacă Ştefan adoptă o
politică no action la definirea constrângerii, Paul va fi pus în situaŃia de a nu putea
şterge sau modifica linii din tabelul său dacă aceste operaŃii au ca efect încălcarea
constrângerii.
6) usage – se aplică domeniilor şi permite utilizarea lor, spre exemplu, pentru definirea
schemei unui tabel.
Privilegiul de a efectua operaŃiile de drop sau alter nu poate fi acordat. Acest tip de
privilegiu este deŃinut doar de proprietarul resursei.
Privilegiile se acordă sau se revocă cu ajutorul instrucŃiunilor grant şi revoke.
68
Exemplu
grant select on Departament to Stefan
Clauza with grant option indică posibilitatea propagării privilegiului către alŃi utilizatori.
Se pot utiliza cuvintele cheie all privileges pentru acordarea tuturor privilegiilor.
Exemplu
grant all privileges on Departament to Stefan, Paul
Accesul la informaŃiile conŃinute în baza de date se face cel mai adesea prin intermediul
aplicaŃiilor integrate într-un sistem informaŃional, în timp ce utilizarea directă a interpretorului
SQL este rezervată experŃilor. Utilizarea aplicaŃiilor dedicate pentru a accesa informaŃiile dintr-o
bază de date este justificată de o serie de factori:
• accesul la informaŃii este cerut adesea de o aplicaŃie şi nu direct de utilizator;
• pentru utilizatori accesul trebuie să fie simplu şi predictibil. Din acest motiv este utilă
reducerea complexităŃii accesului la baza de date prin construirea unei aplicaŃii cu o
interfaŃă simplă;
• prezentarea datelor oferite de către sistem poate fi nepotrivită pentru cererile
utilizatorilor, în timp ce o aplicaŃie specială nu este restricŃionată şi poate pune la
dispoziŃie o reprezentare adecvată a cerinŃelor.
Există numeroase unelte ce pot fi folosite pentru crearea aplicaŃiilor de baze de date. O
piaŃă în plină dezvoltarea este aceea a limbajelor de generaŃia a patra (4GLs), unelte de
dezvoltare sofisticate care fac posibilă dezvoltarea de aplicaŃii de management al bazelor de date
cu minimum de efort. Mai mult, există numeroase produse care nu sunt legate de o bază de date
în particular, ci sunt capabile de a manageria dialogul cu sistemele relaŃionale prin intermediul
standardului SQL. Aceste produse oferă posibilitatea definirii efective a schemelor bazelor de
date şi construirii unor interfeŃe complexe.
O altă metodă de a scrie aplicaŃii este aceea a utilizării limbajelor de programare de nivel
înalt. Analiza se va concentra pe această metodă deoarece are încă o importanŃă considerabilă şi
datorită lipsei unei abordări unitare pentru limbajele de generaŃia a patra.
Pentru a utiliza instrucŃiuni SQL în interiorul unui limbaj procedural, instrucŃiunile SQL
trebuie încapsulate. Din punct de vedere al implementării este necesară punerea la dispoziŃie a
69
unui compilator de limbaj de nivel înalt cu un preprocesor. Acest preprocesor este capabil să
detecteze apelurile către serviciile sistemelor de gestiune a bazelor de date şi să le introducă într-
un mediu de execuŃie a interogărilor, care include şi un optimizator al acestor interogări. Această
soluŃie oferă avantajele portabilităŃii şi abstractizării care caracterizează deja limbajele standard
cum ar fi SQL. La execuŃie, programul începe un dialog cu baza de date, trimiŃând interogarea
direct către sistem.
O problemă care apare constă în faptul că limbajele de programare accesează elementele
unui tablou prin scanare linie cu linie, utilizând pentru aceasta o abordarea orientată pe tuplu.
Spre deosebire de acestea, SQL e un limbaj orientat pe mulŃime, care acŃionează asupra
întregului tabel. De asemenea, rezultatul unei interogări SQL este un tabel.
Există două posibilităŃi de a rezolva această problemă. Prima constă în utilizarea
limbajelor de programare care au disponibile construcŃii de date puternice. Această soluŃie a
devenit mai interesantă odată cu dezvoltarea limbajelor de programare orientate obiect, care sunt
caracterizate de mecanisme puternice de definire a tipurilor de date. Dezavantajele ar fi că multe
aplicaŃii sunt construite pe limbaje ce nu au această capabilitate. De asemenea, o altă dificultate
care apare este lipsa unor standarde acceptate de toate sistemele.
O a doua strategie, mult mai utilizată, este standardizată şi nu necesită extensii complicate
ale limbajelor de programare existente. Această soluŃie se bazează pe cursori.
5.6.2 Cursori
Cursorul este un mecanism care permite accesarea liniilor unui tabel una câte una.
Cursorul se defineşte utilizând o interogare. Sintaxa pentru definirea unui cursor este:
open NumeCursor
Comanda fetch preia o linie din cursor şi întoarce valorile acesteia în variabile ale
programului din ListaVariabile. ListaVariabile trebuie să includă câte o variabilă pentru fiecare
element din lista Ńintă a interogării, astfel încât fiecare element din ListaVariabile să fie
compatibil din punct de vedere al tipului cu domeniile elementelor din lista Ńintă. Un concept
important este acela de linie curentă, care reprezintă ultima linie utilizată într-o operaŃie fetch.
Parametrul Pozitie este utilizat pentru setarea liniei curente. Acest parametru poate lua una din
valorile următoare:
• next – linia următoare devine linie curentă;
• first – prima linie a rezultatului interogării devine linie curentă;
• last - ultima linie a rezultatului interogării devine linie curentă;
70
• absolute Expresie – linia de pe poziŃia i a rezultatului interogării devine linie curentă,
unde i este rezultatul evaluării expresiei, care trebuie să fie de tip integer;
• relative Expresie - linia de pe poziŃia i, plecând de la linia curentă, a rezultatului
interogării devine linie curentă; i are semnificaŃia de mai sus.
Aceste valori ale parametrului Pozitie pot fi folosite doar dacă este activată opŃiunea
scroll. În caz contrar, valoarea implicită a parametrului este next.
Comenzile update şi delete permit modificarea bazei de date prin intermediul cursorilor.
Spre exemplu, sintaxa comenzii update este este:
update NumeTabel
set Atribut = <Expresie | NULL | default>
{, Atribut = <Expresie | NULL | default>}
where current of NumeCursor
Exemplu
declare CursorAngajati scroll cursor for
select Nume, Prenume, Salariu
from Angajati
where Salariu < 100 and Salariu > 40
Exemplu
void AfiseazăSalariiDepartament (char NumeDept[ ])
{
char Nume[20], Prenume[20];
long int Salariu;
71
$ open DeptAng
$ fetch DeptAng into :Nume, :Prenume, :Salariu;
printf (”Departament %s\n”, NumeDept);
while (sqlcode == 0)
{
printf (”Numele Angajatului: %s %s”, Nume, Prenume);
printf (”Salariu: %d\n”, Salariu);
$ fetch DeptAng into :Nume, :Prenume, :Salariu;
}
În cazul în care rezultatul interogării constă într-un singur tuplu (interogări scalare) nu
mai este necesară definirea unui cursor pentru interfaŃarea cu limbajul de programare. Se poate
stabili direct căror variabile din program li se atribuie valorile rezultatului interogării prin
utilizarea clauzei into. Sintaxa instrucŃiunii select se extinde în modul următor:
Exemplu
$ select Nume, Prenume into :NumeAng, : PrenumeAng
from Angajati
where ID = :IDAng
72
avantaje considerabile din punct de vedere al performanŃei. Spre exemplu, dacă o comandă este
îndeplinită în mod repetat, cu această soluŃie translaŃia se face doar o dată, pe când interacŃiunea
cu maşina la fiecare execuŃie separată a comenzii poate necesita propria fază de translaŃie.
SQL dinamic permite două tipuri de interacŃiuni. Interogarea poate fi îndeplinită imediat,
aceasta însemnând că execuŃia interogării se face imediat după analiză, sau gestiunea interogării
are loc în două faze, analiză şi execuŃie.
Exemplu
execute immediate
”delete from Departament where Dept = ’Administratie’ ”;
În schimb, când o instrucŃiune este executată de mai multe ori sau când programul trebuie
să realizeze un schimb de parametri de intrare/ieşire cu interogarea, se poate distinge între cele
două faze.
Exemplu
prepare :InstructiuneSQL from ”select Oras from Departament where Dept = ?”
În momentul în care o instrucŃiune SQl pregătită nu mai este necesară se poate dealoca
memoria utilizând comanda deallocate prepare, care are sintaxa:
deallocate prepare NumeComanda
De exemplu, pentru a dealoca instrucŃiunea anterioară se foloseşte comanda
deallocate prepare :InstructiuneSQL
73
execute NumeComanda [into ListaTinta] [using ListaParametri]
Lista Ńintă conŃine lista parametrilor în care trebuie scris rezultatul execuŃiei instrucŃiunii
(această parte este opŃională în cazul în care comanda SQL nu are parametri de ieşire). Lista de
parametri specifică ce valori trebuie luate de parametrii variabili din listă (această parte se omite
de asemenea dacă în comanda SQL nu există parametri de intrare).
Exemplu
execute :InstructiuneSQL into :oras using :departament
Dacă presupunem că şirul ProducŃie este atribuit variabilei departament, efectul
comenzii este executarea interogării:
select Oras from Departament where Dept = ’Productie’
iar rezultatul se memorează în variabila oras.
Utilizarea cursorilor în SQL dinamic. Utilizarea cursorilor în SQL dinamic este similară cu
folosirea acestora în SQL static. Există doar două diferenŃe. Prima este că identificatorul
interogării este atribuit cursorului în locul interogării însăşi. Cea de-a doua constă în faptul că
acele comenzi pentru utilizarea cursorilor permit specificarea clauzelor into şi using, care la
rândul lor permit specificarea eventualilor parametri de intrare sau ieşire.
Exemplu
prepare :InstructiuneSQL from :SQLString
declare CursorPrg cursor from :InstructiuneSQL
open CursorPrg using :VariabilaPrg
5.6.4 Proceduri
Exemplu
Să considerăm următoarea procedură SQL, care actualizează numele oraşului în care se
găseşte un departament.
procedure AtribuieOras (:Dep char(20), :Oras char(20))
update Departament
set Oras = :Oras
where Dept = :Dept;
Procedura este apelată dând valori parametrilor. Următorul exemplu arată cum se face
apelul procedurii de mai sus în interiorul unui program în C, folosind două variabile, NumeDept
şi NumeOras.
Exemplu
$ AtribuieOras (:NumeDept, :NumeOras);
Standardul SQL-2 este limitat la definirea procedurilor formate dintr-o singură comanda
SQL. Multe sisteme au înlăturat această limitare. Există sisteme care permit doar secvenŃe de
comenzi în interiorul unei proceduri, şi sisteme care permit utilizarea structurilor de control, a
74
declaraŃiilor de variabile locale şi a apelului programelor externe. SQL-3 extinde aceste aspecte
şi pune la dispoziŃie o sintaxă bogată pentru definirea procedurilor.
Următorul exemplu arată o procedură ne-standard compusă dintr-o secvenŃă de două
instrucŃiuni SQL.
Exemplu
procedure SchimbaToateOrasele (:OrasNou char(20), :OrasVechi char(20))
begin
update Departament
set Oras = :OrasNou
where Oras = :OrasVechi;
update Angajati
set Oras = :OrasNou
where Oras = :OrasVechi;
end;
Procedura dă atributului Oras valoarea variabilei :OrasNou, pentru toate liniile tabelelor
Departament şi Angajati în care atributul Oras este egal cu valoarea variabilei :OrasVechi.
Una din extensiile uzuale puse la dispoziŃie de sistemele actuale este structura de control
if-then-else.
Exemplu
procedure SchimbaOras (:NumeDept char(20), :OrasNou char(20))
begin
if not exists (select * from Departament where Dept = :NumeDept)
insert into EroareDept values (:NumeDept)
else
update Departament
set Oras = :OrasNou
where Dept = :NumeDept;
end if;
end;
După cum am indicat mai sus, există sisteme comerciale care oferă extensii procedurale
puternice ale SQL. Există de asemenea posibilitatea de a scrie întreaga aplicaŃie în aceste
extensii ale SQL. Următorul program este scris în PL/SQL, extensia furnizată de sistemul
relaŃional ORACLE SERVER.
Exemplu
procedure Debit (ContClient char(5), Retragere integer) is
SumaVeche integer;
SumaNoua integer;
SumaMinima integer;
begin
select Suma, Limita into SumaVeche, SumaMinima
from ContBanca
where NumarCont = ContClient
for update of Suma;
SumaNoua := SumaVeche – Retragere;
if SumaNoua > Limita then
75
update ContBanca set Suma = SumaNoua
where NumarCont = ContClient;
else
insert into LimitaDepasita
values (ContClient, Retragere, sysdate);
end if;
end Debit;
Procedura permite retragerea sumei Retragere din contul cu codul ContClient, dacă în cont
sunt suficienŃi bani. Se utilizează variabilele locale (SumaVeche, SumaNoua, SumaMinima)
şi o structură de control if-then-else.
76
Partea a II-a
Proiectarea bazelor de date
Capitolul 6. Tehnici de proiectare şi modele
Proiectarea bazei de date este doar una din activităŃile dezvoltării unui sistem
informaŃional în interiorul unei organizaŃii.
În figura 1 este prezentat ciclul de viaŃă a unui sistem informaŃional.
Studiul de fezabilitate serveşte definirii cât mai precise a costurilor diferitelor soluŃii
posibile şi stabilirii priorităŃilor în crearea componentelor sistemului.
Extragerea şi analiza cerinŃelor constă în definirea şi studiul proprietăŃilor şi
funcŃionalităŃii sistemului informaŃional. Această etapă presupune interacŃiunea cu clienŃii pentru
77
extragerea cerinŃelor. Rezultatul este o descriere (informală) completă a datelor care intervin şi a
operaŃiilor care acŃionează asupra datelor respective. Se stabilesc de asemenea necesităŃile
hardware şi software ale sistemului.
Proiectarea se împarte în general în două taskuri: proiectarea bazei de date şi
proiectarea operaŃională. La început se stabilesc structura şi organizarea datelor, iar apoi se
definesc caracteristicile programelor. Cei doi paşi sunt complementari şi se pot parcurge
simultan sau consecutiv. Descrierea datelor şi a programelor rezultate din această etapă este
formală şi se referă la modele specifice.
Implementarea constă în crearea sistemului informaŃional în concordanŃă cu structura şi
caracteristicile precizate în etapa de proiectare. Se construieşte baza de date şi se scrie codul
programelor.
Validarea şi testarea constau în verificarea funcŃionării şi a calităŃii sistemului
informaŃional. Testele trebuie să conŃină, pe cât posibil, toate condiŃiile de operare posibile.
Operarea este activitatea în care sistemul informaŃional funcŃionează îndeplinind
scopurile pentru care a fost creat. Presupunând ca nu există erori majore sau că nu este schimbată
funcŃionalitatea sistemului, această activitate constă doar în managementul şi întreŃinerea
sistemului.
În practică aceste etape nu sunt în general secvenŃiale, deoarece în timpul uneia dintre
activităŃile menŃionate este necesară revenirea la o etapă anterioară. Mai mult, câteodată este
necesară introducerea unei noi activităŃi – prototipizarea – care constă în utilizarea unor unelte
software specifice pentru crearea rapidă a unei versiuni simplificate a sistemului informaŃional
cu ajutorul căreia se testează funcŃionalitatea acestuia. Prototipul poate fi prezentat clienŃilor
pentru a verifica dacă au fost extrase şi modelate corect cerinŃele acestora.
Metodologiile din domeniul proiectării bazelor de date se împart în trei faze (vezi figura
2).
78
Figura 2. Fazele proiectării bazelor de date
Proiectarea conceptuală. Scopul acestei faze este de a reprezenta cerinŃele informale ale
aplicaŃiei în termenii descrierii complete şi formale dar independent de criteriul folosit pentru
reprezentare în sistemul de management al bazei de date. Rezultatul acestei faze este schema
conceptuală şi se referă la un model de date conceptual (care permite descrierea organizării
datelor la un nivel înalt de abstractizare fără a lua în considerare aspectele de implementare). În
această fază, proiectantul trebuie să încerce să reprezinte conŃinutul bazei de date fără a lua în
considerare mijloacele prin care informaŃiile respective vor fi implementate în sistem sau
eficienŃa programelor ce utilizează aceste informaŃii.
79
Proiectarea fizică. În această fază, schema logică se completează cu detalii de
implementare fizică (organizarea fişierelor şi indecşi) puse la dispoziŃie de SGBD. Rezultatul
acestei faze se numeşte schema fizică şi se referă la un model de date fizic. Acest model depinde
de sistemul de management al bazei de date şi ia în considerare criteriile pentru organizarea
fizică a datelor.
Să precizăm ce fel de cerinŃe ale aplicaŃiei sunt utilizate în cele trei faze ale proiectării
bazelor de date. Se poate face o distincŃie între cerinŃele de date care constau în conŃinutul bazei
de date şi cerinŃele operaŃionale care constau în utilizarea bazei de date de clienŃi sau
programatori.
În proiectarea conceptuală, cerinŃele de date furnizează majoritatea informaŃiilor, în timp
ce cerinŃele operaŃionale se folosesc doar pentru a verifica dacă schema conceptuală este
completă.
În proiectarea logică pe de altă parte, schema conceptuală, care este furnizată ca intrare,
rezumă cerinŃele de date; în schimb, cerinŃele operaŃionale se folosesc pentru a obŃine schema
logică.
În proiectarea fizică schema logică şi cerinŃele operaŃionale se folosesc pentru
optimizarea performanŃelor sistemului. În această fază trebuie luate în considerare caracteristicile
SGBD-ului utilizat.
Rezultatul procesului de proiectare a bazei de date nu este dat doar de schema fizică, ci şi
de schema conceptuală şi cea logică. Schema conceptuală furnizează o reprezentare de nivel înalt
a bazei de date care poate fi extrem de folositoare pentru documentare. Schema logică furnizează
o descriere a conŃinutului bazei de date şi, lăsând la o parte aspectele de implementare, este utilă
pentru realizarea interogărilor şi modificărilor bazei de date.
Modelul Entitate – RelaŃie (E–R) este un model de date conceptual ce pune la dispoziŃie o
serie de construcŃii capabile să descrie datele necesare unei aplicaŃii într-o manieră uşor de
înŃeles şi independentă de criteriile de gestiune şi organizare a datelor din sistem.
ConstrucŃiile modelului E-R definesc scheme ce descriu modul de organizare şi dictează
care apariŃii de date (valori pe care baza de date le poate stoca la diferite momente de timp) sunt
legale.
ConstrucŃiile modelului E-R sunt prezentate în figura 3.
ConstrucŃiile de bază ale modelului E-R vor fi prezentate în continuare.
80
Entitate
RelaŃie
Atribut simplu
Atribut compus
m1,M1 m2,M2
Cardinalitatea unei relaŃii
m,M
Cardinalitatea unui atribut
Identificatori interni
Identificator extern
Generalizare
SubmulŃime
RelaŃii – reprezintă legături logice între două sau mai multe entităŃi. REZIDENłĂ este un
exemplu de relaŃie care poate exista între entităŃile ORAŞ şi ANGAJAT.
81
O apariŃie a unei relaŃii este un n-tuplu format din apariŃii ale entităŃilor, câte o apariŃie
pentru fiecare entitate implicată. În figura 5 este prezentat un exemplu conŃinând apariŃii ale
relaŃiei EXAMEN între entităŃile STUDENT şi CURS.
Într-o schemă entitate relaŃie, fiecare relaŃie are un nume unic şi este reprezentată grafic
prin simbolul conŃinând numele relaŃiei.
După cum se poate observa în figura 6, între aceleaşi entităŃi pot exista mai multe relaŃii.
Pentru numele relaŃiilor este indicată folosirea substantivelor în locul verbelor, pentru a
evita sugerarea unei „direcŃii”.
Un aspect important al relaŃiilor constă în aceea că mulŃimea apariŃiilor unei relaŃii este o
relaŃie matematică între mulŃimile de apariŃii ale entităŃilor implicate (este o submulŃime a
produsului cartezian al celor două mulŃimi de apariŃii ale entităŃilor implicate). Astfel este
asigurat faptul că nici un n-tuplu nu va apărea de două ori pentru apariŃiile unei relaŃii. Acest
aspect are consecinŃe importante: spre exemplu, relaŃia EXAMEN din figura 6 nu are capacitatea
de a raporta faptul că un student oarecare dă un examen de mai multe ori (deoarece aceasta ar
trebui să producă perechi identice).În acest caz, examenul trebuie reprezentat de o entitate legată
de entităŃile STUDENT şi CURS prin intermediul a două relaŃii binare.
Sunt posibile relaŃiile recursive care reprezintă relaŃii între o entitate şi ea însăşi.
82
Figura 7. Exemple de relaŃii recursive
83
Figura 9. Schemă E-R cu relaŃii, entităŃi şi atribute
84
Cardinalitatea unei relaŃii – este specificată pentru fiecare entitate participantă la relaŃie şi
descrie numărul minim, respectiv maxim de apariŃii ale relaŃiei la care poate participa o apariŃie a
entităŃii. Într-o schemă E-R cardinalităŃile minime şi maxime ale participărilor entităŃilor în
relaŃii sunt specificate în paranteze, ca în figura 12.
În principiu este posibil să atribuim orice valoare întreagă mai mare ca 0 cardinalităŃii
unei relaŃii, singura cerinŃă fiind ca valoarea minimă a cardinalităŃii să fie mai mică decât cea
maximă. În majoritatea cazurilor este suficientă utilizarea a trei valori: 0, 1 sau N (N este o
valoare întreagă mai mare ca 1):
• cardinalitatea minimă 0 – participarea la relaŃie este opŃională;
• cardinalitatea minimă 1 – participarea la relaŃie este obligatorie;
• cardinalitatea maximă 1 – fiecare apariŃie a entităŃii este asociată cel mult unei
singure apariŃii a relaŃiei;
• cardinalitatea maximă N – fiecare apariŃie a entităŃii este asociată unui număr arbitrar
de apariŃii ale relaŃiei.
85
• relaŃii mai mulŃi-la-mai mulŃi - cardinalităŃile maxime sunt N pentru ambele entităŃi
(v. figura 13c).
În ceea ce priveşte cardinalitatea minimă, să precizăm faptul că este rar cazul în care
participarea este obligatorie pentru toate entităŃile implicate. Aceasta se întâmplă deoarece atunci
când se adaugă o nouă apariŃie a entităŃii, adesea apariŃiile corespunzătoare ale altor entităŃi
legate de aceasta nu sunt cunoscute încă sau nu există. Spre exemplu, să considerăm schema din
figura 13a. Când se primeşte o nouă comandă, nu există încă o factură şi deci nu este posibilă
construirea unei apariŃii pentru relaŃia ONORARE care conŃine noua comandă.
În relaŃiile n-are, entităŃile implicate au aproape întotdeauna cardinalitatea maximă egală
cu N. Când o entitate este implicată într-o relaŃie n-ară cu cardinalitatea maximă egală cu 1,
înseamnă că una din apariŃiile sale poate fi legată de o singură apariŃie a relaŃiei, şi deci la un
singur n-tuplu al apariŃiilor unei alte entităŃi implicate în relaŃie. Această înseamnă de fapt ca este
posibilă înlocuirea relaŃie n-are cu n relaŃii binare unu-la-mai mulŃi care leagă astfel o entitate cu
altele.
Cardinalitatea atributelor –descrie numărul minim, respectiv maxim de valori ale atributelor
asociate fiecărei apariŃii a unei entităŃi sau relaŃii.
În general, cardinalitatea unui atribut este (1,1) şi este omisă pe schemă. În acest caz
atributul este o funcŃie ce asociază o singură valoare fiecărei apariŃii a entităŃii (relaŃiei).Valoarea
unor atribute poate fi null sau pot exista valori diferite ale atributului asociate unei apariŃii a
entităŃii. Aceste situaŃii pot fi reprezentate prin alocarea cardinalităŃii minime egală cu 0 (în
primul caz) respectiv cu cardinalitatea egală cu N (în al doilea caz).
Identificatori – sunt specifici fiecărei entităŃi din schemă şi descriu conceptele (atributele şi/sau
entităŃile) schemei ce permit identificarea unică a apariŃiilor acelei entităŃi.
Identificatorii se clasifică în:
86
• identificator intern – format din unul sau mai multe atribute ale entităŃii. Este
cunoscut sub numele de cheie. Spre exemplu, entitatea AUTOMOBIL cu atributele
Model, NrÎnmat, Culoare are ca identificator intern atributul NrÎnmat, presupunând
ca nu există două automobile cu acelaşi număr de înmatriculare. Pentru entitatea
PERSOANĂ cu atributele DatăNaştere, Nume, Prenume şi Adresă, un identificator
intern poate fi format din mulŃimea atributelor Nume, Prenume şi DatăNaştere. În
figura 15 se pot observa notaŃiile pentru identificatorii interni. Se poate observa
diferenŃa între un identificator intern format dintr-un singur atribut (figura 15a) şi un
identificator intern format din mai multe atribute (figura 15b).
• identificator extern. Există cazuri când atribute ale unei entităŃi nu sunt suficiente
pentru a identifica în mod unic apariŃiile entităŃii. Să considerăm entitatea STUDENT
din figura 16. Schema descrie studenŃii înscrişi la diverse universităŃi, doi studenŃi din
universităŃi diferite putând avea acelaşi număr de înregistrare. În acest caz, pentru a
putea identifica un student în mod unic avem nevoie atât de numărul său de
înregistrare, cât şi de universitatea de care acesta aparŃine. Un identificator corect
pentru entitatea student este format din atributul NrÎnreg şi entitatea
UNIVERSITATE. Un astfel de identificator se numeşte identificator extern. Se
observă că identificarea este posibilă prin relaŃia obligatorie unu-la-mai mulŃi dintre
entităŃile UNIVERSITATE şi STUDENT, care asociază fiecare student cu o singură
universitate. Astfel, o entitate E poate fi identificată prin alte entităŃi doar dacă fiecare
astfel de entitate este implicată într-o relaŃie în care E participă cu cardinalitatea (1,1)
ObservaŃii.
• un identificator poate implica unul sau mai multe atribute, cu condiŃia ca fiecare
dintre ele să aibă cardinalitate (1,1);
• un identificator extern poate implica una sau mai multe entităŃi, cu condiŃia ca fiecare
dintre ele să fie într-o relaŃie în care entitatea de identificat participă cu cardinalitatea
(1,1);
• un identificator extern poate implica o entitate care este la rândul său identificată
extern, atâta timp cât nu se generează cicluri;
87
• fiecare entitate trebuie să aibă un identificator (intern sau extern) dar poate avea mai
mult de unul. Dacă există mai mult de un identificator atunci atributele şi entităŃile
implicate într-o identificare pot fi opŃionale (cardinalitatea minimă egală cu zero).
Se poate observa că numele unui oraş identifică o filială a companiei. Aceasta înseamnă
că există doar o filială în oraşul respectiv. Un departament este identificat de nume şi de filiala a
cărei parte este (putem deduce din cardinalitate că o filială are mai multe departamente dar
fiecare departament aparŃine unei singure filiale. Un departament are cel puŃin un număr de
telefon. Un angajat (identificat printr-un cod) poate aparŃine unui singur departament (dar există
posibilitatea să nu aparŃină nici unui departament –cazul în care este nou angajat spre exemplu)
şi poate conduce cel mult un departament. În plus, fiecare departament are un singur manager şi
unul sau mai mulŃi angajaŃi. Mai mulŃi angajaŃi (dar cel puŃin unul) pot lucra la un proiect
(identificat prin numele său) şi fiecare angajat lucrează în general la mai multe proiecte (existând
posibilitatea să nu lucreze la nici unul). De asemenea, data livrării proiectului poate să nu fie
precizată.
Generalizări – reprezintă legături logice între o entitate părinte E şi una sau mai multe entităŃi
copii, E1, ..., En; entitatea E este mai generală, în sensul că E1, ..., En sunt cazuri particulare ale
lui E. În această situaŃie spunem că E este o generalizare a lui E1, ..., En, iar E1, ..., En sunt
particularizări ale entităŃii E. Spre exemplu, PERSOANĂ este o generalizare pentru BĂRBAT şi
FEMEIE.
ProprietăŃi.
• fiecare apariŃie a unei entităŃi copil este apariŃie a entităŃii părinte;
• fiecare proprietate a entităŃii părinte (atribut, identificator, relaŃie, generalizare) este
de asemenea o proprietate a entităŃii copil. Spre exemplu, dacă entitatea PERSOANĂ
are atributele Nume şi Vârstă, atunci entităŃile BĂRBAT şi FEMEIE au de asemenea
aceste atribute. Mai mult, identificatorul pentru PERSOANĂ este de asemenea un
88
identificator valid pentru entităŃile BĂRBAT şi FEMEIE. Această proprietate se
numeşte moştenire.
Generalizarea se reprezintă grafic ca în figura 18. Se observă că pentru entităŃile copii nu
se reprezintă proprietăŃile moştenite.
Exemple.
Generalizarea PERSOANĂ pentru BĂRBAT şi FEMEIE este totală (persoanele pot fi
numai bărbaŃi sau femei) şi exclusivă (o persoană este fie bărbat fie femeie).
Generalizarea VEHICUL pentru AUTOMOBIL şi BICICLETĂ este parŃială (există şi
alte tipuri de vehicule) şi exclusivă.
Generalizarea PERSOANĂ pentru STUDENT şi ANGAJAT este parŃială şi suprapusă
(există studenŃi care sunt şi angajaŃi).
Generalizarea suprapusă poate fi transformată uşor într-o generalizare exclusivă prin
adăugare uneia sau mai multor entităŃi copil pentru reprezentarea entităŃilor ca sunt „intersecŃia”
între entităŃile ce se suprapun. În ultimul exemplu prezentat se poate adăuga entitatea
STUDENTANGAJAT pentru a obŃine o generalizare exclusivă.
Generalizările totale se reprezintă în mod obişnuit cu o săgeată plină, ca în figura 19.
În general, o entitate poate fi implicată în mai multe generalizări diferite. Există
generalizări cu mai multe nivele, cunoscute sub numele de ierarhii. De asemenea, o generalizare
poate avea un singură entitate copil, cunoscută sub numele de submulŃime. În figura 19 este
prezentată o ierarhie. RelaŃia dintre entităŃile MANAGER PROIECT şi ANALIST este un
exemplu de submulŃime.
89
Figura 19. Exemplu de ierarhie a generalizărilor între entităŃi
Modelul E-R este realizat pe baza a două construcŃii de bază: entitate şi relaŃie;
• o entitate poate participa în mai multe relaŃii sau în nici una;
• o relaŃie implică două sau mai multe entităŃi;
• participarea unei entităŃi într-o relaŃie are o cardinalitate minimă şi una maximă;
90
• pot fi utilizate pentru descrierea datelor dintr-un sistem informaŃional existent deja
(spre exemplu pentru integrarea cu alte baze de date);
• se mai pot folosi de asemenea în cazul modificării cerinŃelor clienŃilor.
O schemă E-R este adeseori insuficientă pentru a descrie toate aspectele unei aplicaŃii în
detaliu. În primul rând într-o schemă E-R sunt precizate doar numele conceptelor, acest fapt fiind
insuficient pentru a explica semnificaŃia acestora. Spre exemplu, în figura 17, nu este clar dacă
entitatea PROIECT se referă la un proiect intern al companiei sau la un proiect extern la care
compania respectivă este parte.
Mai mult, dacă schema este complexă, se poate întâmpla să nu poată fi reprezentate toate
proprietăŃile conceptelor care apar într-un mod inteligibil. În schema din figura 17 ar fi greu de
introdus şi alte atribute pentru ANGAJAT fără a reduce accesibilitatea schemei.
Pe de altă parte, este imposibilă reprezentarea unor proprietăŃi ale datelor prin intermediul
schemelor E-R. În exemplul din figura 17 să presupunem că un angajat poate fi manager doar în
departamentul de care aparŃine. Această proprietate nu poate fi exprimată direct în schemă
deoarece se referă la două concepte independente (management şi membru) descrie prin două
relaŃii şi nu există construcŃii care să permită corelarea a două relaŃii. Un alt exemplu care nu se
poate implementa direct pe schema E-R ar fi acela în care se impune ca un angajat să nu poată
avea un salariu mai mare decât managerul departamentului de care aparŃine. Ambele proprietăŃi
menŃionate sunt de tipul constrângere de integritate. Modelul E-R nu furnizează mijloace
potrivite pentru reprezentarea constrângerilor complexe impuse datelor.
Din motivele precizate mai sus, o schemă E-R trebuie însoŃită de o documentaŃie care să
faciliteze interpretarea schemei şi descrierea proprietăŃilor care nu pot fi exprimate direct prin
construcŃiile puse la dispoziŃie de modelul E-R.
Reguli de operare
Regulile de operare reprezintă una din uneltele utilizate de analişti pentru a descrie
proprietăŃile unei aplicaŃii care nu pot fi exprimate direct cu ajutorul modelului conceptual.
Această abordare permite specificarea regulilor unei aplicaŃii. Spre exemplu, faptul că un angajat
nu poate câştiga mai mult decât managerul său este o regulă de operare.
Pentru regulile din prima categorie precizată anterior nu este posibilă definirea unei
sintaxe exacte şi de aceea se folosesc propoziŃii exprimate în limbaj natural. Aceste reguli sunt
formulate în termenii vocabularului.
Regulile ce descriu constrângeri de integritate şi derivări folosesc definiŃii formale.
91
Constrângerile de integritate pot fi exprimate sub forma aserŃiilor care sunt declaraŃii ce
trebuie satisfăcute întotdeauna de baza de date. Pentru claritate, unele declaraŃii trebuie să fie
„atomice”.
O notaŃie de tipul if <condiŃie> then <acŃiune> nu este potrivită pentru a
exprima o regulă.
O structură mai potrivită pentru a exprima o regulă de operare sub forma unei aserŃii
poate fi:
<concept> trebuie/nu trebuie <expresie a conceptelor>
unde conceptele pot corespunde fie unui concept a schemei E-R la care se referă fie unui concept
derivat.
Spre exemplu, pentru a exprima constrângerile pentru schema din figura 17, se utilizează
următoarele reguli de operare:
(RO1) managerul departamentului trebuie să aparŃină departamentului;
(RO2) un angajat nu trebuie să aibă salariul mai mare decât managerul departamentului
căruia îi aparŃine;
(RO3) un departament din filială Iaşi trebuie manageriat de un angajat cu mai mult de 10 ani
vechime în companie
Regulile de operare care descriu derivări pot fi exprimate prin specificarea operaŃiilor
(matematice sau de alt fel) care permit obŃinerea conceptelor derivate. O structură posibilă este
următoarea:
<concept> este obŃinut prin <operaŃii asupra conceptelor>
Dacă în exemplul tratat până acum entitatea DEPARTAMENT are un atribut
NumărDeAngajaŃi, se poate introduce o regulă de forma:
(RO4) numărul angajaŃilor dintr-un departament este obŃinut prin numărarea angajaŃilor care
aparŃin departamentului respectiv;
În momentul în care schema conceptuală este translată într-o bază de date (fazele logice
şi fizice ale proiectării) se pot implementa prin diferite metode reguli de operare ne-descriptive
pentru a garanta consistenŃa datelor astfel încât acestea să respecte proprietăŃile impuse. Se pot
aborda următoarele căi:
• utilizarea SQL pentru definirea schemei logice a bazei de date prin intermediul
constrângerilor predefinite sau a aserŃiilor;
• utilizarea declanşatorilor sau a regulilor active;
• utilizarea manipulărilor SQL potrivite invocate din interiorul unui program.
DocumentaŃia pentru conceptele variate reprezentate într-o schemă pot fi organizate uşor
sub forma unui dicŃionar de date. Acesta este format din două tabele:
• primul tabel descrie entităŃile din schemă: numele lor, definiŃii informale în limbaj
natural, lista tuturor atributelor (cu o descriere a acestora) şi identificatorii posibili;
• al doilea tabel descrie relaŃiile: numele lor, descriere informală, lista atributelor (cu
descrieri posibile) şi lista entităŃilor implicate împreună cu cardinalităŃile de
participare la relaŃie.
92
Un exemplu de dicŃionar de date pentru schema din figura 17 este prezentat în figura 20.
Este de notat faptul că dicŃionarul de date poate fi utilizat şi pentru documentarea unor
constrângeri impuse datelor şi altor forme de reguli de operare.
Se mai poate alcătui un tabel în care se listează regulile organizate după tip. Unele reguli
pot fi exprimate în formele precizate în secŃiunea anterioară. Să reamintim faptul că este
importantă reprezentarea tuturor regulilor care descriu constrângeri ce nu sunt exprimate în
schemă, dar poate fi de asemenea folositoare reprezentarea regulilor deja reprezentate în schemă.
Un exemplu de documentaŃie de acest tip referitoare la schema din figura 17 este prezentat în
figura 21.
Constrângeri
(RO1) managerul departamentului trebuie să aparŃină departamentului;
(RO2) un angajat nu trebuie să aibă salariul mai mare decât managerul departamentului
căruia îi aparŃine;
(RO3) un departament din filială Iaşi trebuie manageriat de un angajat cu mai mult de 10 ani
vechime în companie
(RO4) un angajat care nu aparŃine unui departament nu trebuie să participe la nici un proiect.
Derivări
(RO5) bugetul unui proiect este obŃinut prin înmulŃirea sumei salariilor angajaŃilor ce
lucrează la el cu 3
Probleme propuse.
93
a) CorectaŃi schema, luând în considerare proprietăŃile fundamentale ale
generalizărilor.
b) Schema reprezintă doar femeile care muncesc; modificaŃi schema astfel încât să
reprezinte toŃi muncitorii, bărbaŃi şi femei.
c) Atributul JudeŃ poate fi privit ca o sub-proprietate a atributului łară; restructuraŃi
schema în acest sens.
2. AdăugaŃi cardinalităŃile minime şi maxime şi identificatorii pentru schema obŃinută după
rezolvarea problemei 1; specificaŃi dacă există constrângeri de integritate pe schemă care nu
pot fi exprimate prin modelul entitate-relaŃie.
3. ReprezentaŃi următoarele informaŃii printr-o schemă entitate-relaŃie:
o companie produce CD-uri cu un cod şi un titlu; pe fiecare CD au fost înregistraŃi
unul sau mai mulŃi cântăreŃi, fiecare având un nume şi o adresă şi câŃiva dintre
aceştia şi un nume de scenă.
4. CompletaŃi schema din problema 3 cu informaŃii care vi se par că lipsesc.
5. CreaŃi o schemă E-R pentru a reprezenta următoarele concepte, utilizând, dacă este cazul,
construcŃii de tip generalizare. IndicaŃi atributele entităŃilor implicate şi tipul generalizărilor,
rezolvând eventualele suprapuneri.
AngajaŃii unei companii se împart în manageri, programatori, analişti, şefi de
proiect şi secretare. Există analişti care sunt de asemenea programatori. Şefii de
proiect trebuie să fie manageri. Fiecare angajat are un cod, nume şi prenume.
Fiecare categorie de angajaŃi are un salariu de bază. Fiecare angajat (în afară de
manageri) are fixat un număr de ore de muncă.
94
Capitolul 7. Proiectarea conceptuală
Proiectarea conceptuală a bazelor de date constă în construirea unei scheme Entitate-
RelaŃie care furnizează o descriere optimă a cerinŃelor clienŃilor. ConstrucŃia schemei este un
proces iterativ, aceasta suferind o serie de transformări şi corecŃii.
În acest capitol se vor descrie strategii pentru dezvoltarea unei scheme conceptuale.
Exemplu
Se cere proiectarea unei baze de date pentru o companie ce organizează cursuri de
instruire şi pentru care s-au colectat specificaŃiile prezentate în figura 1. Datele au fost extrase
prin interviuri cu angajaŃii companiei.
1 Dorim crearea unei baze de date pentru o companie care face cursuri de instruire
2 Pentru aceasta trebuie să stocăm date despre instruiŃi şi instructori. Pentru
3 fiecare participant la curs (în jur de 5000), identificaŃi prin cod, vrem să stocăm
4 codul numeric personal, numele, vârsta, sexul, locul naşterii, numele
5 angajatorului, adresa şi numărul de telefon, angajatorii anteriori (şi perioada
6 angajării), cursurile urmate (există circa 200 de cursuri) şi aprecierea finală la
7 fiecare curs. Avem nevoie de asemenea să reprezentăm seminariile la care
8 fiecare participant este aşteptat în prezent şi, pentru fiecare zi, locurile şi orele la
9 care clasele sunt ocupate.
10 Fiecare curs are un cod şi un titlu şi fiecare curs poate fi organizat de oricâte ori.
11 Fiecărei organizări a unui curs particular îi spunem „ediŃie” a cursului. Pentru
12 fiecare ediŃie vom reprezenta data de start, data de sfârşit şi numărul
13 participanŃilor. Dacă un instruit este dintr-o profesie liberală trebuie cunoscut
14 domeniul de expertiză şi dacă este necesar titlul său. Pentru oricine care
15 lucrează la companie, vom stoca nivelul şi poziŃia deŃinută.
16 Pentru fiecare instructor (circa 300) vom preciza numele, vârsta, locul naşterii,
17 ediŃia cursului predat, cursurile predate în trecut şi cursurile pe care un titular este
18 calificat să le Ńină.
19 Se stochează numerele de telefon ale tuturor instructorilor.
20 Un instructor poate fi angajat permanent al companiei de training sau poate fi
21 angajat temporar.
95
Vom stabili câteva reguli pentru scrierea specificaŃiilor mai precis şi fără ambiguităŃi:
• Se alege un nivel potrivit de abstractizare. Se evită termenii prea generali sau prea
specifici. În cazul nostru, termenul perioadă (linia 5), titlu (linia 14) şi apreciere (linia
6) pot fi specificaŃi mai precis (dată start şi dată sfârşit, titlu profesional şi notă).
• Se standardizează structura propoziŃiei. Spre exemplu „pentru <concept> păstrăm
<proprietăŃi>”.
• Se evită frazele complexe (angajat este preferat lui oricine care lucrează pentru o
companie – linia 15)
• Se identifică sinonimele şi omonimele (ex.: titular şi instructor, participant curs şi
instruit, respectiv loc care înseamnă locul de naştere cât şi locul unde se Ńin orele).
Pentru sinonime se foloseşte un singur termen ir pentru omonime se caută alŃi
termeni.
• Se marchează explicit referinŃele. AbsenŃa referinŃelor dintre termeni duce la concepte
ambigue (ex.: la linia 5 adresa şi numărul de telefon se referă la angajat sau
angajator?)
• Se construieşte un vocabular. Pentru fiecare termen, vocabularul conŃine o scurtă
descriere, sinonime posibile şi referinŃe la alŃi termeni conŃinuŃi de vocabular cu care
este în legătură logică. Un exemplu de vocabular este cel prezentat în figura 2.
În acest moment se pot rescrie specificaŃiile folosind cele menŃionate mai sus şi se
încearcă gruparea cerinŃelor ca în figura 3.
După specificarea datelor trebuie specificate operaŃiile care trebuie executate asupra
acestor date. În cazul nostru operaŃiile ar putea fi:
• OperaŃia 1: se inserează un nou instruit incluzând datele despre el (se realizează de
aproximativ 40 de ori pe zi)
• OperaŃia 2: se atribuie un instruit unei ediŃii a unui curs (de 50 de ori pe zi)
• OperaŃia 3: se inserează un nou instructor, incluzând toate datele şi cursurile pe care
acesta este calificat să le predea (de două ori pe zi)
• OperaŃia 4: se atribuie un instructor calificat pentru o ediŃie a unui curs (de 15 ori pe
zi)
• OperaŃia 5. se afişează toate informaŃiile despre o ediŃie anterioară a cursului: titlu,
orar, număr de instruiŃi (de 10 ori pe zi)
• OperaŃia 6: afişează toate cursurile disponibile, cu informaŃii despre instructorii
calificaŃi să le Ńină (de 20 de ori pe zi)
• OperaŃia 7: pentru fiecare instructor, se găsesc instruiŃii pentru toate cursurile pe care
le Ńine sau le-a Ńinut(de 5 ori pe săptămână)
96
• OperaŃia 8: se realizează o analiză statistică a tuturor instruiŃilor cu toate informaŃiile
despre ei, despre ediŃiile cursurilor pe care le-au urmat şi notele obŃinute (de 10 ori pe
lună)
CerinŃe generale
Se doreşte crearea unei baze de date pentru o companie care derulează cursuri de
instruire. Se doreşte păstrarea datelor pentru instruiŃi şi instructori.
Pentru dezvoltarea unei scheme conceptuale pe baza specificaŃiilor impuse se pot aplica
strategii de proiectare din alte domenii, strategii ce vor fi descrise în continuare.
Schema conceptuală este obŃinută printr-o serie de rafinări succesive ale schemei iniŃiale
ce descrie toate cerinŃele prin intermediul câtorva concepte abstracte.
Procedura este descrisă în figura 4. Fiecare nivel reprezentat conŃine o schemă ce descrie
informaŃii diverse la diferite grade de detaliu.
Trecerea de la un nivel la altul se face cu ajutorul unor transformări numite primitive de
transformare de sus în jos (v. figura 5). Primitivele operează pe un singur concept al schemei şi
îl transformă într-o structură de complexitate mai ridicată, capabilă să descrie conceptul iniŃial în
detaliu.
97
Transformarea T1 – se aplică atunci când o entitate descrie două concepte logice diferite legate
unele de altele. Spre exemplu în aplicaŃia descrisă în secŃiunea anterioară se poate începe cu
entitatea CURS. Acest concept pare prea abstract, putând face deosebirea între TIPCURS (care are
un cod şi un titlu) şi EDIłIECURS (care are o dată de start şi una de sfârşit). Aceste două entităŃi
pot fi legate prin relaŃia TIP.
Transformarea T2 – este aplicată atunci când o entitate este alcătuită din sub-entităŃi. În
aplicaŃia noastră această transformare are loc atunci când ne dăm seama că printre cei instruiŃi se
poate distinge între ANGAJAT şi LIBERPROFESIONIST.
Transformarea T3 – se aplică atunci când o relaŃie descrie două sau mai multe concepte diferite
legând aceleaşi entităŃi. Spre exemplu, în relaŃia PREDARE între instructori şi cursuri,
PREDARECURENTĂ poate fi separată de PREDAREANTERIOARĂ.
98
Transformare Concept iniŃial Rezultat
T1
De la o entitate la două entităŃi
şi relaŃia dintre ele
T2
De la o entitate la o
generalizare
T3
De la o relaŃie la relaŃii
multiple
T4
De la o relaŃie la o entitate cu
relaŃii
T5
Adăugarea atributelor la o
entitate
T6
Adăugarea atributelor la o
relaŃie
99
Strategia bottom-up (de jos în sus)
100
Transformare Concept iniŃial Rezultat
T1
Generarea unei entităŃi
T2
Generarea unei relaŃii
T3
Generarea unei generalizări
T4
Agregarea unor atribute pe o
entitate
T5
Agregarea unor atribute pe o
relaŃie
101
Figura 8. Exemplu de strategie inside-out
Strategia mixtă
Se poate adopta o strategie mixtă care combină avantajele strategiilor top-down, bottom-
up şi inside-out. ProiectanŃii descompun cerinŃele în componente conform strategiei bottom-up,
dar nu se dezvoltă componentele separat. În acelaşi timp se defineşte o schemă cadru care
conŃine, la nivel abstract, principalele componente ale aplicaŃiei. Schema cadru furnizează o
viziune sintetică asupra procesului de proiectare şi uşurează integrarea schemelor dezvoltate
separat.
Spre exemplu, pentru exemplul prezentat în secŃiunile anterioare o schemă cadru posibilă
este prezentată în figura 9.
Din acest punct se pot examina separat conceptele principale prin rafinări graduale
(urmând paşii strategiei top-down) sau se pot extinde componentele cu concepte care nu au fost
încă reprezentate (conform strategiei bottom-up).
Corectitudinea schemei. O schemă conceptuală este corectă dacă utilizează corect construcŃiile
puse la dispoziŃie de modelul conceptual. Se pot defini două tipuri de erori:
102
• erorile sintactice marchează utilizarea ilegală a unei construcŃii (ex.: generalizarea
dintre relaŃii în detrimentul entităŃilor).
• erorile semantice marchează utilizarea unei construcŃii care nu-şi urmăreşte definiŃia
(ex.: utilizarea unei relaŃii pentru a descrie faptul că o entitate este o specializare a
altei entităŃi).
Caracterul complet al schemei. O schemă conceptuală este completă dacă include concepte ce
reprezintă toate cerinŃele de date şi care permit execuŃia tuturor operaŃiilor incluse în cerinŃele
operaŃionale.
Accesibilitatea schemei. O schemă conceptuală este accesibilă când reprezintă cerinŃele într-un
mod natural şi uşor de înŃeles.
Minimalitatea schemei. O schemă este minimală când toate specificaŃiile datelor sunt
reprezentate doar o singură dată în schemă. O schemă nu este minimală când apar redundanŃele
– concepte derivate din altele. O sursă tipică de redundanŃe este prezenŃa ciclurilor determinate
de prezenŃa relaŃiilor şi/sau generalizărilor. Câteodată redundanŃele sunt necesare din motive de
proiectare, aceste situaŃii fiind precizate în documentaŃie.
1. Analiza cerinŃelor
• Construirea unui vocabular
• Analiza cerinŃelor şi eliminarea ambiguităŃilor
• Gruparea cerinŃelor
2. Etapa de bază
• Identificarea celor mai relevante concepte şi reprezentarea lor într-o schemă
cadru
3. Descompunerea (folosită dacă este potrivită sau necesară)
• Descompunerea cerinŃelor cu referire la conceptele prezentate în schema
cadru
4. Etapa iterativă (se repetă pentru toate schemele până când fiecare specificaŃie este
reprezentată)
• Rafinarea conceptelor pe baza cerinŃelor
• Adăugarea de concepte noi care descriu părŃi ale cerinŃelor nereprezentate
încă
5. Integrarea
• Integrarea sub-schemelor într-o schemă generală Ńinând cont de schema cadru
6. Analiza calităŃii
• Verificarea corectitudinii şi realizarea restructurărilor necesare
103
• Verificarea caracterului complet al schemei şi realizarea restructurărilor
necesare
• Verificarea minimalităŃii, listarea redundanŃelor şi dacă este necesar realizarea
restructurărilor necesare
• Verificarea accesibilităŃii şi realizarea restructurărilor necesare dacă este
necesar
Se consideră exemplul unui proces de instruire din cadrul unei companii despre care am
mai discutat şi în secŃiunile anterioare. Am indicat o schemă cadru posibilă în figura 9. Din acest
punct se poate decide analizarea separată a specificaŃiilor pentru instruiŃi, cursuri şi instructori şi
de a aplica o strategie inside-out pentru fiecare.
Ne vom referi întâi la instruiŃi. Se pot identifica două tipuri: angajaŃi şi liber
profesionişti. Aceste entităŃi se reprezintă ca specializări ale entităŃii INSTRUIT; generalizarea
este totală. Este necesară reprezentarea angajatorilor instruiŃilor. Aceasta se poate face
introducând entitatea ANGAJATOR care este legată printr-o relaŃie de ANGAJAT. Este necesară de
asemenea distincŃia între conceptele angajare actuală şi anterioară. Decidem să divizăm relaŃia în
două relaŃii: ANGAJAREANTERIOARĂ şi ANGAJAREACTUALĂ. Prima are o dată de start şi una
de sfârşit şi este legată de entitatea INSTRUIT (deoarece şi liber profesioniştii se poate să fi fost
angajaŃi). A doua relaŃie are doar dată de start şi este legată de entitatea ANGAJAT. Adăugând
atribute entităŃilor şi relaŃiilor, cardinalităŃi pentru relaŃii şi identificatori ai entităŃilor se obŃine
schema din figura 10.
104
Pentru instructori se disting cazurile în care aceştia sunt fie angajaŃi permanenŃi ai
companiei, fie angajaŃi temporar. Se realizează astfel o generalizare totală, cu entitatea părinte
INSTRUCTOR. Se adaugă atributele precizate în specificaŃii: Nume, Vârstă, OraşDeNaştere şi
Telefon. Se observă cu nu se poate stabili un identificator pe baza acestor atribute. Din acest
motiv, se decide folosirea CNP-ului instructorului chiar dacă nu este cerut în specificaŃii. Schema
rezultată este prezentată în figura 11.
În ceea ce priveşte entitatea CURS, există două concepte distincte legate: un concept
abstract al cursului (cu nume şi cod) şi ediŃia cursului (cu dată de start, dată de sfârşit şi numărul
de instruiŃi). Vom reprezenta aceste concepte cu două entităŃi distincte legate prin relaŃia TIP.
Clasele unui curs se pot descrie printr-o entitate legată de ediŃiile cursurilor prin relaŃia
COMPOZIłIE. Se adaugă apoi atribute, cardinalităŃi şi identificatori. O clasă este identificată prin
sală, timp şi dată. Pentru ediŃiile unui curs, presupunem că două ediŃii ale aceluiaşi curs nu pot
începe în aceeaşi zi şi astfel un identificator pentru entitatea EDIłIECURS este format din
atributul DatăStart şi entitatea CURS. Schema rezultată este prezentată în figura 12.
105
Schema finală E-R pentru o companie de instruire
În acest moment se începe verificarea schemei obŃinute. Se verifică dacă schema este
completă prin întoarcerea la specificaŃii şi verificarea dacă toate datele sunt reprezentate şi toate
operaŃiile pot fi efectuate. Spre exemplu, să considerăm operaŃia 7, în care se cer instruiŃii pentru
toate cursurile Ńinute de un instructor. Datele pentru această operaŃie se găsesc pe schemă în felul
următor: se pleacă de la entitatea INSTRUCTOR, se trece prin relaŃiile PREDARECURENTĂ şi
PREDAREANTERIOARĂ, entitatea EDIłIECURS, relaŃiile PREZENłĂCURENTĂ şi
PREZENłĂANTERIOARĂ şi apoi se ajunge la entitatea INSTRUIT. Cu privire la minimalitate, să
notăm că există o redundanŃă în schemă: atributul NrParticipanŃi al entităŃii EDIłIECURS se
poate obŃine prin numărarea numărului de instanŃe ale entităŃii INSTRUIT care sunt legate de
ediŃia respectivă. Se va discuta despre eliminarea sau menŃinerea acestei redundanŃe în capitolul
următor, referitor la proiectarea logică.
Trebuie menŃionat în final că schema trebuie să aibă o documentaŃie potrivită. Este
importantă descrierea restricŃiilor posibile care nu sunt exprimate în schemă, sub forma regulilor
de operare. Un exemplu ar fi precizarea că un instructor predă un curs doar dacă este calificat să
o facă.
Probleme propuse
1. Se doreşte crearea unei baze de date prin care să se gestioneze împrumuturile dintr-o
bibliotecă. SpecificaŃiile obŃinute prin interviu sunt următoarele:
Un cititor care utilizează biblioteca are un card pe care este memorat un cod, numele şi
adresa. Utilizatorul face o cerere pentru împrumutul unor cărŃi catalogate în bibliotecă.
Fiecare carte are un titlu şi o listă a autorilor şi pot exista mai multe exemplare pentru fiecare
carte. Fiecare carte din bibliotecă este identificată printr-un cod. Urmând cererea, se consultă
o arhivă a cărŃilor disponibile (aceasta conŃine care nu sunt împrumutate în prezent). Dacă
este disponibilă cartea, se caută cartea pe rafturi. Odată ce cartea este găsită este dată
cititorului. Textul este apoi clasificată ca fiind împrumutată. După ce cartea este citită, este
returnată, pusă înapoi pe raft şi re-clasificată ca disponibilă. Pentru fiecare împrumut se
înregistrează orele şi datele luării şi returnării cărŃii.
106
Să se analizeze specificaŃiile, să se filtreze ambiguităŃile şi să se grupeze după tip. Să se
acorde o atenŃie deosebită diferenŃei dintre conceptul de carte şi de copie a unei cărŃi.
IdentificaŃi legăturile logice dintre grupurile de specificaŃii obŃinute.
107
Capitolul 8. Proiectarea logică
Scopul proiectării logice este de a construi o schemă logică ce reprezintă corect şi eficient
toate informaŃiile descrise într-o schemă entitate-relaŃie.
Translatarea din schema conceptuală în cea logică nu este un proces simplu deoarece, în
primul rând, nu toate construcŃiile modelului E-R pot fi translatate natural într-un model
relaŃional. Spre exemplu, dacă o entitate poate fi reprezentată simplu printr-o relaŃie, pentru o
generalizare există mai multe variante. În al doilea rând, scopul proiectării conceptuale este de
reprezenta datele la un nivel înalt de abstractizare, fără a Ńine cont de detaliile de implementare.
Proiectarea logică trebuie să ia în considerare performanŃele impuse produsului final. Din acest
motiv, proiectarea logică presupune parcurgerea următoarelor etape:
• Restructurarea schemei E-R – fază independentă de modelul logic ales şi care se
bazează pe criterii de optimizare a schemei şi de simplificare a următoarei etape;
• Translarea în modelul logic –care Ńine cont de un anumit model logic (modelul
relaŃional spre exemplu) şi poate include alte optimizări, bazate pe caracteristicile
modelului logic.
La intrarea primei etape există schema conceptuală şi estimarea încărcării bazei de date
(cantitatea de date şi cerinŃele operaŃionale). Rezultatul acestei etape este schema E-R
restructurată, care nu mai este o schemă E-R propriu-zisă deoarece utilizează aspecte de
implementare pentru reprezentarea datelor.
Această schemă şi modelul logic ales formează intrarea celei de-a doua etape, care va
produce schema logică a bazei de date, împreună cu constrângerile de integritate aferente şi
documentaŃia.
108
• costul unei operaŃii – evaluat în funcŃie de numărul de apariŃii ale entităŃilor şi
relaŃiilor ce sunt parcurse pentru a executa o operaŃie asupra unei baze de date;
• cerinŃa de stocare – evaluată în funcŃie de numărul de octeŃi necesari stocării datelor
descrise de schemă.
Pentru a evalua aceşti indicatori avem nevoie de următoarele informaŃii:
• volumul de date
– numărul de apariŃii ale fiecărei entităŃi şi relaŃii din schemă;
– dimensiunea fiecărui atribut.
• caracteristicile operaŃiilor:
– tipul operaŃiei (interactivă sau batch);
– frecvenŃa operaŃiei (numărul mediu de execuŃii într-un anumit interval de timp);
– datele implicate (entităŃi şi/sau relaŃii).
109
Tabelul volumelor
Concept Tip Volum
Filială E 10 Tabelul operaŃiilor
Departament E 80 OperaŃie Tip FrecvenŃă
Angajat E 2000 Op 1 I 50/zi
Proiect E 500 Op 2 I 100/zi
CompoziŃie R 80 Op 3 I 10/zi
Membru R 1900 Op 4 B 2/săptămână
Management R 80
Participare R 6000
Figura 3. Exemplu de tabele ale volumelor şi operaŃiilor
110
PARTICIPARE (deoarece am presupus că un angajat lucrează în medie la trei proiecte). Apoi, prin
această relaŃie accesăm în medie trei apariŃii ale entităŃii PROIECT. Aceste informaŃii pot fi
sumate în tabelul accesărilor din figura 5. În ultima coloană a acestui tabel se menŃionează tipul
accesului (R pentru citire, W pentru scriere)
Tabelul accesărilor
Concept Tip Accesări Tip
Angajat Entitate 1 R
Membru RelaŃie 1 R
Departament Entitate 1 R
Participare RelaŃie 3 R
Proiect Entitate 3 R
Figura 5. Tabelul accesărilor pentru operaŃia 2
• analiza redundanŃelor - decide ştergerea sau păstrarea unor redundanŃe din schema
E-R;
• eliminarea generalizărilor - înlocuieşte toate generalizările cu alte construcŃii;
• partiŃionarea/combinarea entităŃilor şi relaŃiilor – decide dacă este convenabilă
partiŃionarea unui concept în mai multe sau unirea mai multor concepte separate în
unul singur;
• selecŃia identificatorilor primari – alege un identificator pentru acele entităŃi care au
mai mult de un identificator.
Analiza redundanŃelor
Într-o schemă conceptuală o redundanŃă corespunde unei informaŃii ce poate fi derivată
din alte date. Cele mai frecvente exemple sunt:
111
• atribute ale căror valori pot fi derivate, pentru fiecare apariŃie a unei entităŃi/relaŃii,
din valorile altor atribute pentru aceeaşi apariŃie. În exemplul de mai jos, fiecare
atribut poate fi dedus din celelalte două prin operaŃii aritmetice
• atribute ce pot fi derivate din alte atribute aparŃinând altor entităŃi/relaŃii, de obicei
prin intermediul funcŃiilor agregat. În exemplul următor, atributul ValoareTotala
a entităŃii ACHIZITIE poate fi calculat din valorile atributului Pret a entităŃii PRODUS
prin sumarea preŃurilor produselor achiziŃionate, după cum se specifică în relaŃia
COMPUNERE.
• relaŃii ce pot fi derivate din alte relaŃii în prezenŃa ciclurilor. RelaŃia INVATARE dintre
studenŃi şi profesori poate fi derivată din relaŃiile PREZENłĂ şi ATRIBUIRE. PrezenŃa
ciclurilor nu generează în mod automat redundanŃe. Spre exemplu, dacă se înlocuieşte
relaŃia INVATARE cu relaŃia SUPERVIZARE reprezentând legătura dintre studenŃi şi
supervizori, atunci schema nu mai este redundantă.
112
Decizia menŃinerii sau eliminării unei redundanŃe poate fi luată prin compararea costului
operaŃiilor ce implică informaŃia redundantă şi capacitatea de stocare necesară în cazul prezenŃei,
respectiv absenŃei redundanŃei.
Exemplu
Să considerăm exemplul referitor la persoane şi oraşe
113
Presupunând că accesul în scriere costă de două ori mai mult decât accesul în citire,
numărul de accesări / zi în prezenŃa redundanŃelor este 2 x 1500 + 500 = 3500.
Eliminarea generalizărilor
114
EntităŃile E1 şi E2 sunt eliminate şi proprietăŃile acestora sunt adăugate proprietăŃii părinte
E0. Se adaugă entităŃii părinte atributul Atype pentru a distinge tipul (E1 sau E2) unei apariŃii a lui
E0. A11 şi A21 pot avea valoarea NULL pentru unele apariŃii ale entităŃii E0. RelaŃia R2 va avea
cardinalitatea minimă 0 pentru E0 deoarece apariŃiile lui E2 formează o submulŃime a apariŃiilor
entităŃii E0.
Entitatea părinte E0 este eliminată şi, prin proprietatea de moştenire, atributele sale,
identificatorii şi relaŃiile în care era implicată sunt adăugate entităŃilor copil E1 şi E2. RelaŃiile
R11 şi R12 reprezintă restricŃia relaŃiei R1 pe apariŃiile entităŃii E1, respectiv E2.
Generalizarea este transformată în două relaŃii „una la unu” ce leagă părintele de copiii E1
şi E2. Nu există transfer de atribute sau relaŃii şi entităŃile E1 şi E2 sunt identificate extern prin
entitatea E0. În noua schemă apar constrângeri în plus: nici o apariŃie a lui E0 nu poate participa
115
în ambele relaŃii RG1 şi RG2.; mai mult, dacă generalizarea este completă, fiecare apariŃie a lui E0
trebuie să participe în exact una din relaŃiile RG1 şi RG2.
Pentru a alege una din cele trei variante trebuie avute în vedere următoarele aspecte:
• Prima opŃiune este convenabilă atunci când operaŃiile implică apariŃii şi atribute ale
E0, E1 şi E2 într-un mod asemănător. În acest caz, deşi se stochează valori NULL,
alegerea asigură mai puŃine accesări în comparaŃie cu celelalte variante în care
apariŃiile şi atributele sunt distribuite celorlalte entităŃi.
• A doua opŃiune este posibilă doar dacă generalizarea este totală, altfel apariŃiile lui E0
care nu sunt apariŃii nici ale lui E1 nici ale lui E2 nu vor putea fi reprezentate. Această
metodă este utilă când există operaŃii care se referă doar la apariŃiile lui E1 sau ale lui
E2 şi astfel se face distincŃia între aceste entităŃi. Nu mai există în principiu atribute ce
pot lua valori NULL. Numărul de accesări este mai redus în comparaŃie cu a treia
metodă, deoarece nu este necesară accesarea lui E0 pentru a accesa atribute ale E1 şi
E2 .
• A treia metodă este utilă atunci când generalizarea nu este totală şi operaŃiile se referă
fie la apariŃiile şi atributele lui E1(E2) fie ale lui E0 şi astfel se face distincŃia între
entităŃile părinte şi copil. Stocarea este mai mică în raport cu prima metodă datorită
absenŃei valorilor NULL dar creşte numărul accesărilor pentru a păstra consistenŃa
apariŃiilor.
OpŃiunile prezentate nu sunt singurele posibile. O variantă ar fi cea din figura 8. În acest
caz, pe baza consideraŃiilor anterioare, s-a decis înglobarea E0 şi E1 şi lăsarea separată a lui E2.
Atributul Atype este adăugat pentru a distinge apariŃiile lui E0 de cele ale E1.
Creşterea eficienŃei accesului la datele dintr-o bază de date se poate realiza conform
următorului principiu: operaŃiile de acces sunt reduse prin separarea atributelor aceluiaşi
concept (entitate sau relaŃie) ce sunt accesate de operaŃii diferite, respectiv prin combinarea
atributelor aparŃinând unor concepte diferite ce sunt accesate de aceleaşi operaŃii.
116
PartiŃionarea entităŃilor
Un exemplu de partiŃionare a entităŃilor este prezentat în figura 9: entitatea ANGAJAT este
substituită prin două entităŃi legate printr-o relaŃie 1:1. Una din entităŃi descrie informaŃii despre
statutul unui angajat, iar cealaltă descrie informaŃii personale ale unui angajat. Acest tip de
restructurare este utilă doar dacă operaŃiile ce implică frecvent entitatea originală necesită, pentru
un angajat, ori numai informaŃii personale, ori numai informaŃii legate de angajare.
117
Entitatea AGENTIE este separată în două entităŃi: una având acelaşi nume şi aceleaşi
atribute cu entitatea originală, în afară de atributul multi-valoare (Telefon) şi o entitate
TELEFON cu atributul Numar. EntităŃile sunt legate de o relaŃie 1:N. Evident, dacă atributul este
opŃional, atunci cardinalitatea minimă pentru entitatea TELEFON trebuie să fie 0.
Combinarea entităŃilor
OperaŃia de combinare se efectuează în general asupra relaŃiilor 1:1 şi mai rar asupra
relaŃiilor 1:N sau N:N. Motivul constă în apariŃia redundanŃelor în atributele non-cheie ale
entităŃii având cardinalitatea N.
118
Figura 12. Exemplu de partiŃionare a unei relaŃii
În cazul în care există entităŃi ce deŃin mai mulŃi identificatori apare necesitatea stabilirii
acelor atribute ce formează identificatorul primar. Identificatorul primar va avea drept
corespondent în modelul relaŃional o cheie primară.
Criteriile de alegere a unui identificator primar sunt:
• Atributele ce pot deŃine valori NULL nu pot forma un identificator primar.
• Este indicat ca un identificator primar să conŃină un atribut sau cât mai puŃine
atribute.
Avantajele acestei alegeri ar fi:
- indecşi de dimensiune redusă (un index este o structură auxiliară pentru acces
rapid la date);
- spaŃiu redus pentru crearea legăturilor logice între relaŃii;
- sunt facilitate operaŃiile de joncŃiune.
• Un identificator intern este de preferat unuia extern, care poate implica mai multe
entităŃi şi aceasta din cauză că identificatorii externi sunt translaŃi în chei ce conŃin
identificatorii tuturor entităŃilor implicate în identificatorul extern.
• Este de preferat un identificator ce este utilizat de majoritatea operaŃiilor pentru a
accesa apariŃiile entităŃii. În acest fel operaŃiile vor fi executate eficient, fiind
avantajate de indecşii construiŃi automat de sistemul de gestiune a bazei de date.
Dacă în această etapă nu există nici un identificator care să satisfacă criteriile anterioare,
se va introduce un atribut suplimentar în entitate, atribut ce va fi utilizat exclusiv pentru
identificarea apariŃiilor entităŃii.
119
EntităŃi şi relaŃii N:N
120
PRODUS(Cod, Nume, Pret)
COMPUNERE(Componenta, Subcomponenta, Cantitate)
Atributele Componenta şi Subcomponenta au ca domeniu mulŃimea de coduri ale
produselor. Trebuie impuse constrângeri de referinŃă între Componenta şi PRODUS şi
Subcomponentă şi PRODUS.
Translarea relaŃiilor E-R ce implică mai mult de două entităŃi este similară cazului
relaŃiilor E-R între două entităŃi (relaŃii binare). Ca exemplu este dată schema din figura 15.
Schema este translată în:
FURNIZOR(IDFurnizor, NumeFurnizor)
PRODUS(Cod, Tip)
DEPARTAMENT(Nume, Telefon)
LIVRARE(Furnizor, Produs, Departament, Cantitate)
RelaŃii 1:N
121
JUCATOR(Nume, DataNastere, Pozitie)
ECHIPA(Nume, Oras, CuloriEchipa)
CONTRACT(NumeJucator, DataNastereJucator, Echipa, Salariu)
Cheia relaŃiei CONTRACT este formată numai din identificatorul entităŃii JUCATOR
deoarece cardinalităŃile indică faptul că fiecare jucător are contract la o singură echipă.
Se observă că relaŃiile JUCATOR şi CONTRACT au aceeaşi cheie. Acest lucru indică
posibilitatea combinării celor două relaŃii în una singură, fără să existe pericolul introducerii de
redundanŃe. Această combinare este posibilă datorită corespondenŃei 1:1 între instanŃele celor
două relaŃii. Astfel, pentru schema din figura 16 se preferă translarea:
JUCATOR(Nume, DataNastere, Pozitie, Echipa, Salariu)
ECHIPA(Nume, Oras, CuloriEchipa)
Trebuie impusă o constrângere de referinŃă între atributul Echipa şi relaŃia ECHIPA.
Să considerăm cazul în care entitatea JUCATOR participă opŃional la relaŃia
CONTRACT (pot exista jucători care nu au contract cu nici o echipă). Ambele translări
prezentate anterior sunt valide. Ce-a de-a doua prezintă dezavantajul că pot exista valori NULL
în relaŃia JUCATOR pentru atributele Echipa şi Salariu.
Regulă: entitatea ce participă la o relaŃie E-R cu cardinalitatea maximă 1 este translată
într-o relaŃie M-R ce include identificatorii celorlalte entităŃi implicate în relaŃia E-R şi posibilele
atribute ale relaŃiei E-R. Astfel nu mai este nevoie de o relaŃie M-R separată pentru relaŃia din
schema E-R.
Ca exemplu, să presupunem că entitatea PRODUS participă în relaŃia din figura 15 cu
cardinalităŃile minimă şi maximă 1. Aceasta înseamnă că pentru fiecare produs există un singur
furnizor care livrează produsul respectiv şi un singur departament deservit. Schema este
translatată sub forma:
FURNIZOR(IDFurnizor, NumeFurnizor)
DEPARTAMENT(Nume, Telefon)
PRODUS(Cod, Tip, Furnizor, Departament, Cantitate)
Se impun constrângeri de referinŃă între atributul Furnizor al relaŃie PRODUS şi
relaŃia FURNIZOR şi între atributul Departament al relaŃiei PRODUS şi relaŃia
DEPARTAMENT.
122
Există o constrângere de referinŃă între atributul Universitate şi relaŃia
UNIVERSITATE.
Este de notat faptul că, prin reprezentarea identificatorului extern, a fost reprezentată şi
relaŃia dintre entităŃi.
Acest tip de translare este valid indiferent de cardinalitatea cu care participă celelalte
entităŃi la relaŃie.
RelaŃii 1:1
Pentru relaŃiile 1:1 există mai multe posibilităŃi de translare. Să considerăm relaŃia din
figura 18, cu participare obligatorie din partea celor două entităŃi implicate.
Pe lângă aceste două soluŃii, există posibilitatea obŃinerii unei singure relaŃii, incluzând
toate atributele din schema E-R. Motivul pentru care această soluŃie va fi eliminată este
următorul: dacă după faza de restructurare (care precede faza de translare) schema E-R conŃine
două entităŃi legate printr-o relaŃie 1.1, este de dorit ca în faza de translare cele două concepte să
rămână separate.
Să considerăm cazul unei relaŃii 1:1 cu participarea opŃională a uneia dintre entităŃi, ca în
schema din figura 19.
123
DEPARTAMENT(Nume, Telefon, Filiala, Sef, DataStart)
Într-o primă fază se translează fiecare entitate într-o relaŃie din modelul relaŃional.
Translarea entităŃilor cu identificatori interni este imediată:
124
E3(A31, A32)
E4(A41, A42)
E5(A51, A52)
E6(A61, A62, A63)
În figura 21 sunt prezentate, pe scurt, posibilităŃi de translare din modelul E-R în modelul
relaŃional
Simbolurile X şi Y indică o cardinalitate permisă. Asteriscul indică posibilitatea prezenŃei
valorilor NULL iar linia de subliniere întreruptă marchează o cheie alternativă celei marcate prin
linie continuă.
125
Tip Schema iniŃială Translare posibilă
RelaŃie binară
N:N
RelaŃie ternară
N:N
RelaŃie 1:N cu
participare
obligatorie
RelaŃie 1:N cu
participare sau
opŃională
RelaŃie cu
identificatori
externi
RelaŃie 1:1 cu
participare
obligatorie sau
pentru ambele
entităŃi
RelaŃie 1:1 cu
participare
opŃională pentru
o entitate
126
sau
RelaŃie 1:1 cu
participare
opŃională pentru
ambele entităŃi
sau
Figura 21. Translări din modelul E-R în modelul relaŃional
În acest mod se pot păstra informaŃii despre relaŃiile din modelul E-R, permiŃându-se
reconstrucŃia informaŃiilor reprezentate prin relaŃia originală. În exemplul din figura 22,
proiectele în care angajaŃii sunt implicaŃi pot fi regăsite prin intermediul relaŃiei PARTICIPARE.
În figura 23 este prezentat un alt exemplu referitor la schema din figura 16.
127
Este de remarcat faptul că această metodă permite de asemenea reprezentarea explicită a
relaŃiilor din schema iniŃială E-R cărora, în schema relaŃională echivalentă, nu le corespunde nici
o relaŃie (spre exemplu relaŃia CONTRACT din modelul E-R din figura 16).
În figura 24 este reprezentată schema relaŃională corespunzătoare exemplului anterior de
translare a unei scheme complexe cu obŃinerea unui număr minim de relaŃii (figura 20). În acest
mod se pot identifica uşor legăturile logice dintre diferitele relaŃii care apar.
Faza de restructurare
Tabelul volumelor
Concept Tip Volum
Clasă E 8000 Tabelul operaŃiilor
EdiŃieCurs E 1000 OperaŃie Tip FrecvenŃă
Curs E 200 Op 1 I 40/zi
Instructor E 300 Op 2 I 50/zi
Temporar E 250 Op 3 I 2/zi
Permanent E 50 Op 4 I 15/zi
Instruit E 5000 Op 5 I 10/zi
Angajat E 4000 Op 6 I 20/zi
LiberProfesionist E 1000 Op 7 I 5/zi
Angajator E 8000 Op 8 B 10/lună
PrezenŃăAnterioară R 10000
PrezenŃăCurentă R 500
CompoziŃie R 8000
Tip R 1000
PredareAnterioară R 900
PredareCurentă R 100
Calificare R 500
AngajareActuală R 4000
AngajareAnterioară R 10000
Figura 26. Tabelele volumelor şi operaŃiilor pentru schema din figura 25
129
Accesări în prezenŃa redundanŃei Accesări în absenŃa redundanŃei
OperaŃia 2 OperaŃia 2
Concept Tip Accesări Tip Concept Tip Accesări Tip
Instruit E 1 R Instruit E 1 R
PrezenŃăCurentă R 1 W PrezenŃăCurentă R 1 W
EdiŃieCurs E 1 R
EdiŃieCurs E 1 W
OperaŃia 5
OperaŃia 5 Concept Tip Accesări Tip
Concept Tip Accesări Tip EdiŃieCurs E 1 R
EdiŃieCurs E 1 R Tip R 1 R
Tip R 1 R Curs E 1 R
Curs E 1 R CompoziŃie R 8 R
CompoziŃie R 8 R Clasă E 8 R
Clasă E 8 R PrezenŃăAnterioară R 10 R
Figura 27. Tabelele accesărilor pentru schema din figura 25
Se obŃine:
• În prezenŃa redundanŃei: pentru operaŃia 2 avem 2 x 50 = 100 accesări în citire / zi şi
tot atâtea accesări în scriere / zi, în timp ce, pentru operaŃia 5, avem 19 x 10 = 190
accesări în citire / zi dintr-un total de 490 accesări / zi (s-a considerat că accesul în
scriere costă de două ori mai mult decât accesul în citire);
• În absenŃa redundanŃei: pentru operaŃia 2 avem 50 de accesări în citire / zi şi tot atâtea
în scriere, în timp ce pentru operaŃia 5 avem 29 x 10 = 290 accesări în citire / zi, dintr-
un total de 440 accesări / zi (s-a considerat că accesul în scriere costă de două ori mai
mult decât accesul în citire).
130
Dezavantajul acestei alegeri este acela că relaŃiile COMPOZIłIE şi TIP se vor duplica. Pe de altă
parte, operaŃiile 7 şi 8 nu fac o distincŃie majoră între ediŃiile curente şi anterioare ale unui curs şi
ar putea fi mai costisitoare dacă necesită vizitarea a două entităŃi distincte. Din aceste motive, nu
vom partiŃiona entitatea EDIłIECURS.
Două restructurări posibile ar putea avea loc prin combinarea relaŃiilor
PREDAREANTERIOARĂ ŞI PREDARECURENTĂ şi respectiv a relaŃiilor PREZENłĂANTERIOARĂ
ŞI PREZENłĂCURENTĂ. În ambele cazuri avem de-a face cu două concepte similare între care
câteva operaŃii (7 şi 8) nu fac diferenŃa. Combinarea acestor relaŃii mai poate duce la un avantaj
şi anume că nu mai este necesar transferul apariŃiilor de la o relaŃie la alta la sfârşitul unei ediŃii a
unui curs. Un dezavantaj ar fi acela că atributul Notă, care nu apare la o ediŃie curentă a
cursului va avea valori NULL. Din tabelul de volume se observă că numărul de apariŃii ale
relaŃiei PREZENłĂCURENTĂ este de 500. Presupunând că avem nevoie de 4 octeŃi pentru a stoca
notele, cererea de stocare va fi de doar aproximativ 2 KocteŃi. Decidem deci să combinăm cele
două perechi de relaŃii după cum se poate vedea în figura 28. Trebuie adăugată o constrângere
care nu poate fi reprezentată direct pe schemă şi anume aceea ca un instructor să nu poată preda
mai mult de o ediŃie a unui curs în aceeaşi perioadă. Similar, un participant nu poate fi prezent la
mai mult de o ediŃie a unui curs la un anumit moment.
În final, este necesară eliminarea atributului multi-valoare Telefon din entitatea
INSTRUCTOR. Pentru aceasta se introduce o nouă entitate TELEFON legată printr-o relaŃie 1:N de
entitatea INSTRUCTOR (din care se elimină atributul respectiv).
SelecŃia identificatorilor primari. Doar entitatea INSTRUIT are doi identificatori: CNP-ul
şi codul intern. Este preferabil să se aleagă al doilea identificator deoarece CNP-ul poate necesita
câŃiva octeŃi pentru stocare în timp ce codul, care trebuie să distingă între 5000 de apariŃii (vezi
tabelul volumelor) nu necesită mai mult de doi octeŃi.
Entitatea EDIłIECURS este identificată prin atributul DatăStart şi prin entitatea CURS.
Într-o reprezentare relaŃională, acest identificator trebuie utilizat pentru a implementa două relaŃii
(PREZENłĂ şi PREDARE). Se poate observa că fiecare curs are un cod şi că numărul mediu de
ediŃii pentru un curs este 5. Aceasta înseamnă că este convenabil să adăugăm un atribut Cod cu
domeniul small integer pentru a identifica o ediŃie a unui curs, în locul identificatorului extern.
Schema rezultată în urma restructurării poate fi observată în figura 28.
131
Translarea în modelul relaŃional
Folosind tehnicile de translare prezentate anterior, schema din figura 28 poate fi translată
în următoarea schemă relaŃională:
132
Bibliografie