Documente Academic
Documente Profesional
Documente Cultură
Modelul relaional de
organizare a datelor
Ca n attea alte domenii, i n teoria i practica bazelor de date se manifest o
dorin apsat de a scpa de btrni, de a ncerca i altceva. Modelul relaional
este btrnul care nu vrea s se retrag. Comparaia cu Ion Iliescu se oprete aici,
modelul relaional fiind infinit mai benefic pentru istoria recent a omenirii.
Aprut la nceputul anilor 70, modelul s-a dovedit a avea oarecum soarta rock-
ului acelorai ani, cu contestatari destul de vocali, dar cu nlocuitori mult mai palizi
(ex. disco-ul, punk-ul), la propriu, la figurat i mai ales la trecerea timpului.
Afirmaia de mai sus este incorect politic, imposibil de demonstrat tiinific i
degrab aductoare de ranchiun. Aa c nu are rost s v enervai (mai bine v
punei CD-ul cu albumul London Calling al celor de la The Clash). Lumea
academic, n general, lumea liber-schimbist n ale bazelor de date fremta, spre
finalul anilor 80 i nceputul 90, la ideea c relaionalul i-a gsit naul n persoana
modelului obiectual. Statisticile indicau c n anul 2000, odat cu sfritul lumii,
bazele de date orientate pe obiecte vor trece de 50% din pia. Dup cum spuneam
n primul capitol, nici n prezent procentul BDOO nu ar trece de 5 sau 6 %.
N-a vrea s nelegei c relaionalul nu va fi depit ntr-o zi de obiectual sau
de alt model (sau post-model, cum este XML-ul). De asemenea, mrturisesc c nu
am (deocamdat) contract cu modelul relaional. Afirmaia la care subscriu este c
modelul relaional s-a dovedit un model bun i, din multe puncte de vedere, este
nc valabil pentru gestiunea datelor n firme i organizaii, att sub forma sa
original, ct mai ales mbogit cu tipuri de date definite de utilizator (vezi
capitolul 19).
Modelul relaional de organizare a datelor s-a conturat n dou articole
publicate n 1969 i 1970 de ctre E.F. Codd, matematician la centrul de cercetri
1
din San Jose (California) al firmei IBM . n acel moment, tehnologia bazelor de
date era centrat pe modelele ierarhic i reea, modele ce depind ntr-o mai mare
msur de organizarea intern a datelor pe suportul de stocare (celebrii pointeri pe
care i-am pomenit fr a-i arta n primul capitol). Codd a propus o structur de
date tabelar, independent de tipul de echipamente i software de sistem pe care
2.1. Structura
Modelul relaional al datelor se poate defini printr-o serie de structuri de date
(relaii alctuite din tupluri), operaii aplicate asupra structurilor de date (selecie,
proiecie, jonciune etc.) i reguli de integritate care s asigure consistena datelor
3
(chei primare, restricii refereniale s.a.) .
(v1 , v 2 , v 3 , v 4 ) unde v 1 D1 , v 2 D 2 , v 3 D 3 , v 4 D 4
iar relaia n ansamblu corespunde unui subansamblu din ansamblul tuturor
tuplurilor posibile alctuite din patru elemente, ansamblu care este produsul
cartezian al celor patru domenii.
4
Di
i =1
4 Punctul indic marca, zecimal, cei doi de nou ce urmeaz punctului fiind asociai banilor
(subdiviziunii leului).
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 35
R D1 x D2 x D3 x ... x Dn ,
n fiind gradul sau ordinul relaiei. Relaiile de grad 1 sunt unare, cele de grad 2 -
binare, ..., cele de grad n - n-are. Aceast definiie pune n eviden aspectul
constant al relaiei, de independen n timp (se spune c n acest caz relaia este
definit ca un predicat).
O a doua definiie abordeaz o relaie R ca un ansamblu de m-uplete (m-
tupluri) de valori:
R = { t 1 , t 2 , ..., t k , ..., t m}, unde t k = (dk1 ,dk2 , ..., d ki ,...,dkn )
n care:
dk1 este o valoare n D1, dk2 este o valoare n D2, , dkn este o valoare n Dn;
n - reprezint ordinul lui R;
m - cardinalitatea lui R.
Pentru un (mic) plus de claritate, vezi figura 2.3. Reprezentarea sub form de
tabel, deci ca ansamblu de tupluri, pune n eviden aspectul dinamic, variabil al
relaiei. Abordarea predicativ (prima definiie) sau ansamblist (a doua definiie)
reprezint un criteriu important de delimitare a limbajelor de interogare a bazelor
de date relaionale.
5
domeniu al relaiei . Precizarea fr ambiguitate a rolului jucat de fiecare domeniu
n cadrul relaiei impune ca numele atributelor s fie diferite. O relaie poate fi
simbolizat i astfel:
Principalele caracteristici ale unei relaii pot fi, astfel, sistematizate dup cum
urmeaz:
- n cadrul unei baze de date, o relaie prezint un nume distinct de al
celorlalte relaii.
- Valoarea unui atribut ntr-un tuplu oarecare este simpl (atomic sau
elementar).
- Fiecare atribut are un nume distinct.
- Orice valoare a unui atribut face parte din domeniul pe care a fost definit
acesta.
- Ordinea dispunerii atributelor n relaie nu prezint importan.
- Fiecare tuplu este distinct, adic nu pot exista dou tupluri identice ntr-o
aceeai relaie.
5 [Saleh 1994],p.29
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 37
Structura unei baze de date mai cuprinde restricii i alte obiecte discutate n
paragrafele 2.2 i 2.3.
2.2. Restricii
De ce ne intereseaz restriciile ntr-o baz de date ? Termenul de restricie
(regul sau constrngere) este oarecum iritant, att pentru studeni, ct i pentru
profesori, deoarece semnaleaz existena unor constrngeri instituite i oarecum
obligatorii, i, de vreme ce sunt impuse, nsemn c nu sunt prea plcute (dect, n
cel mai bun caz, pentru cel care le-a instituit). Partea cea mai enervant este c
respectarea restriciilor este (supra)vegheat de o anumit autoritate nzestrat cu
anumite instrumente de constrngere, de la bastoane de cauciuc, la creterea i
scderea impozitelor, salariilor, banilor de buzunar etc.
Ei bine, n bazele de date, regulile sunt ceva mai acceptabile. Cei care lucreaz
cu bazele de date sunt foarte interesai n declararea restriciilor, pentru c, odat
definite, de respectarea lor se va ngriji SGBD-ul. Esenial este c, ajutai de reguli,
putem crete gradul de corectitudine i de ncredere pentru datele din baz. n cele
ce urmeaz vor fi prezentate, pe scurt, cele mai importante restricii definibile ntr-
o BD relaional: de domeniu, de atomicitate, de unicitate, refereniale i
restriciile-utilizator.
2.2.2. Atomicitate
Conform teoriei bazelor de date relaionale, orice atribut al unei tabele oarecare
trebuie s fie atomic, n sensul imposibilitii descompunerii sale n alte atribute.
Implicit, toate domeniile unei baze de date sunt musai atomice (adic elementare).
n aceste condiii, se spune c baza de date se afl n prima form normal sau prima
form normalizat (1NF).
Astzi, atomicitatea valorii atributelor a devenit o int predilect a atacurilor
dumnoase la adresa modelului relaional, pe motiv de imposibilitate a
gestionrii unor structuri de date mai complexe, specifice unor domenii ca
proiectare asistat de calculator, baze de date multimedia etc. Muli autori, dintre
care merit amintii cu deosebire Chris J. Date i Hugh Darwen, se opun ideii de
atomicitate formulat de Codd.
La drept vorbind, singurul lucru cert despre atomicitate este relativitatea
acesteia. S relum un exemplu de atribut compus (non-atomic) - Adresa6. Fiind
alctuit din Strad, Numr, Bloc, Scar, Etaj, Apartament, discuia despre
atomicitatea adresei pare de prisos, iar descompunerea sa imperativ. Trebuie ns
s ne raportm la obiectivele bazei. Fr ndoial c pentru BD a unei filiale
CONEL sau ROMTELECOM, sau pentru poliie, preluarea separat a fiecrui
element constituent al adresei este foarte important. Pentru un importator direct,
ns, pentru un mare en-grossist sau pentru o firm de producie lucrurile stau
ntr-o cu totul alt lumin. Partenerii de afaceri ai acestora sunt persoane juridice,
iar adresa intereseaz numai la nivel general, caz n care atributul Adresa nu este
considerat a fi non-atomic.
Alte exemple de atribute ce pot fi considerate, n funcie de circumstane,
simple sau compuse: DataOperaiuniiBancare (Data + Ora), BuletinIdentitate (Serie
+ Numr), NrnmatriculareAuto (privit global, sau pe cele trei componente:
numr, jude, combinaie trei de litere).
O relaie (tabel) n 1NF nu trebuie s conin atribute care se repet ca grupuri
(grupuri repetitive). ntr-o alt formulare, toate liniile unei tabele trebuie s conin
acelai numr de atribute. Fiecare celul a tabelei (intersecia unei coloane cu o
linie), altfel spus, valoarea unui atribut pe o linie (nregistrare), trebuie s fie
6 Este un exemplu dintre cele mai frecvente n majoritatea crilor despre baze de date.
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 39
atomic. Detalii despre atomicitate i grupuri repetitive gsii (i) n [Fotache 2005]
i [Sitar-Tut 2006].
2.2.3. Nenulitate
Modelul relaional prevede ca, atunci cnd nu se cunoate valoarea unui atribut
pentru o anumite entitate, sau cnd pentru acel obiect, entitate, persoan etc.
atributul este inaplicabil, s se foloseasc (meta)valoarea NULL. Dup cum am
discutat, celui de-al treilea client din figura 2.1 nu i se cunoate adresa. Dac am
avea o tabel PRODUSE cu atributele CodProdus, DenumireProdus, UM, Culoare,
este posibil ca, pentru anumite sortimente, cum ar tricouri, cmi, jachete,
atributul s fie important, n timp ce pentru altele, precum vodc, cafea, lapte
atributul Culoare s nu furnizeze nici o informaie, adic s nu fie aplicabil. Iar
dac laptele poate fi doar alb, vodca chiar c nu are culoare (sunt foarte muli
specialiti n acest domeniu, i putei interoga !).
ntr-o baz de date relaional avem posibilitatea de a le impune unora dintre
atribute (sau tuturora) s aib ntotdeauna valori specificate, altfel spus, le
interzicem valorile nule, n timp ce altor atribute li se pot permite valori nule. Ca
regul, atributele importante, ce in de identificarea sau caracterizarea unei entiti,
proces, fenomen, precum i cele implicitate n calculul unor informaii importante,
sunt declarate NOT NULL, iar atributele fr importan deosebit pot fi mai
relaxate.
2.2.4. Unicitate
O relaie nu poate conine dou linii identice (dou linii care prezint aceleai
valori pentru toate atributele). Mai mult, majoritatea relaiilor prezint un atribut,
sau o combinaie de atribute, care difereniaz cu siguran un tuplu de toate
celelalte tupluri ale relaiei. Cheia primar a unei relaii (tabele) este un atribut sau
un grup de atribute care identific fr ambiguitate fiecare tuplu (linie) al relaiei
(tabelei). Dup Codd, exist trei restricii pe care trebuie s le verifice cheia
primar:
- unicitate: o cheie identific un singur tuplu (linie) al relaiei;
- compoziie minimal: atunci cnd cheia primar este compus, nici un
atribut din cheie nu poate fi eliminat fr distrugerea unicitii tuplului n
cadrul relaiei; n cazuri limit, o cheie poate fi alctuit din toate atributele
relaiei;
40 Capitolul 2
7
Joe Celko inventariaz patru proprieti dezirabile pentru o cheie :
Familiaritate: valorile cheii s fie uor de neles pentru utilizatori.
Stabilitate: valorile cheii nu trebuie s fie volatile.
Minimalitate.
Simplitate: sunt de preferat chei scurte i simple.
Tot el atrage atenia ca cele patru proprieti pot intra, uneori, n conflict. O
cheie stabil poate s se dovedeasc complex i dificil de gestionat. Identificarea
cheii primare pentru o relaie face parte (mpreun cu stabilirea tabelelor prin
gruparea atributelor, stabilirea celorlalte restricii) din procesul de proiectare a
bazei de date. Uneori, precum n cazul tabelei JUDEE, stabilirea cheii primare nu
ridic probleme. Fiecare jude are un indicativ auto unic, deci atributul Jud
candideaz la postul de cheie a relaiei. La fel se poate spune i despre denumirea
judeului. Rezult c relaia JUDEE prezint dou chei candidate: Jud i Judet.
Alegerea unei dintre cheile candidat are n vedere criterii precum lungimea,
uurina n reinere i/sau editare. Fiind mai scurt, desemnm atributul Jud drept
cheie primar, situaie n care Judet devine cheie alternativ.
Tabela CLIENI are cheia primar simpl CodClient. CodClient reprezint un
numr unic asociat fiecrei firme creia i-am fcut vnzri (clienii notri sunt
exclusiv persoane juridice, adic firme). Exist ns suficiente cazuri n care cheia
primar este compus din dou, trei s.a.m.d. sau, la extrem, toate atributele relaiei.
S lum spre analiz o relaie PERSONAL care conine date generale despre
angajaii firmei. Fiecare tuplu al relaiei se refer la un angajat, atributele fiind:
Nume, Prenume, DataNaterii, Vechime, SalariuTarifar.
- Atributul Nume nu poate fi cheie, deoarece chiar i ntr-o ntreprindere de
talie mijlocie, este posibil s existe doi angajai cu acelai nume.
- Dac apariia a dou persoane cu nume identice este posibil, atunci
apariia a dou persoane cu acelai Prenume este probabil.
- Nici unul din aceste atributele DataNaterii, Vechime, SalariuTarifar nu
poate fi "nzestrat" cu funciunea de identificator.
n acest caz, se ncearc gruparea a dou, trei, patru s.a.m.d. atribute, pn cnd
se obine combinaia care va permite diferenierea clar a oricrei linii de toate
7 [Celko1999], p.247
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 41
s asigure unicitatea fiecrui tuplu. n acest sens, E.F. Codd a propus consiliului
ANSI X3H2 o funcie special care s msoare gradul de repetabilitate a valorii
unuia sau mai multor atribute, funcie care ar semna ntructva cu funcia
11
COUNT() din SQL folosit mprerun cu GROUP BY .
Pe lng noiunile cheie-candidat, cheie primar, cheie alternativ, modelul
relaional utilizeaz i sintagma supercheie. O supercheie poate fi definit ca un set
de coloane ce ndeplinete condiia de cheie (unicitate), dar care conine cel puin
12
un subset care este, el-nsui, cheie . Cu alte cuvinte, din cele trei condiii ale cheii
primare, o supercheie o ndeplinete numai pe prima (unicitate), fr a avea ns
compoziia minimal i fr a pune problema restriciei de entitate (valorile nule
ale atributelor componente).
Domeniul unui atribut care este cheie primar ntr-o relaie este denumit
domeniu primar. Dac ntr-o relaie exist mai multe combinaii de atribute care
confer unicitate tuplului, acestea sunt denumite chei candidate. O cheie candidat
care nu este identificator primar este referit drept cheie alternativ.
O baz de date relaional este alctuit din relaii (tabele) aflate n legtur.
Stabilirea legturii se bazeaz pe mecanismul cheii strine (externe) i, implicit, a
restriciei refereniale. Figura 2.4 prezint o legtur n care sunt implicate tabelele
FACTURI i CLIENI. Atributul CodClient joac un rol de agent de legtur
ntre tabelele CLIENI i FACTURI. Pentru relaia CLIENI, atributul CodClient
este cheie primar, n timp ce n tabela FACTURI, CodClient reprezint coloana de
referin sau cheia strin (extern), deoarece numai pe baza valorilor sale se poate
face legtura cu relaia printe CLIENI.
Cheile strine, denumite i chei externe sau coloane de referin, sunt deci atribute
sau combinaii de atribute care pun n legtur linii (tupluri) din relaii diferite.
Tabela n care atributul de legtur este cheie primar se numete tabel-printe (n
cazul nostru, CLIENI), iar cealalt tabel-copil.
Legat de noiunea de cheie strin apare conceptul de restricie referenial. O
restricie de integritate referenial apare atunci cnd o relaie face referin la o
13
alt relaie. C.J.Date definete restricia de integritate referenial astfel : Fie D un
Observaii
- Pentru muli utilizatori i profesioniti ai bazelor de date, denumirea de
"relaional" desemneaz faptul c o baz de date este alctuit din tabele
puse n legtur (relaie) prin intermediul cheilor externe i primare.
Aceasta este, de fapt, a doua accepiune a termenului de baze de date
relaionale (i cea eronat), prima, cea "clasic", avnd n vedere percepia
fiecrei linii dintr-o tabel ca o relaie ntre clase de valori.
- Majoritatea SGBD-urilor prezint mecanisme de declarare i gestionare
automat a restriciilor refereniale, prin actualizri n cascad i
interzicerea valorilor care ar nclca aceste restricii.
- Respectarea restriciilor refereniale este una din cele mai complicate
sarcini pentru dezvoltatorii de aplicaii ce utilizeaz baze de date. Din
44 Capitolul 2
2.2.6. Restricii-utilizator
(specializare & master) dureaz doi ani. Aa c, pentru AnStudii regula este
similar atributului CicluStudii:
AnStudii >= 1 AND AnStudii <= 3
AnStudii BETWEEN 1 AND 3
AnStudii IN (1, 2, 3)
Dac, ns, dorim s fim mai exaci i s inem cont c valoarea maxim a anului
de studii pentru al doilea ciclu este 2, putem imagina o regul mai complex: CASE
WHEN CicluStudii IN (1,3) THEN AnStudii BETWEEN 1 AND 3 ELSE AnStudii
BETWEEN 1 AND 2 END. Ei bine, aceast regul (expresie) conine dou atribute,
nefiind una la nivel de atribut, ci la nivel de nregistrare.
16 Este o alt variant (care se vrea mai impresionant) a restriciei prin care anul de studii se
sincronizeaz cu ciclul de studii.
46 Capitolul 2
Tabela FACTURI ar putea conine, printre altele, dou atribute valorice, unul
pentru pstrarea valorii totale (inclusiv TVA) a facturii respective, i un altul care
stocheaz cuantumul TVA colectate pentru factur. Majoritatea produselor i
serviciilor comercializate la noi n ar au un procent al taxei pe valoarea adugat
de 19%. Exist, ns, i produse la care procentul poate fi 9% sau chiar 0%) De
aceea, TVA colectat pentru o factur este mai mic sau cel mult egal dect/cu
19% din valoarea fr tva. S ncercm o formul: ValoareaTotal = ValoareaFrTVA
+ TVA. Dac factura conine numai produse cu 19%: ValoareaTotal =
ValoareaFrTVA + 0.19 * ValoareaFrTVA, sau ValoareaTotal = 1.19 * ValoareaF-
rTVA. Dar tabela noastr are doar atributele ValoareTotal i TVAColectat, aa
c nlocuim ValoareaFrTVA prin diferena celorlalte dou. Scriem: ValoareTotal
= 1.19 * (ValoareTotal TVAColectat), i dup calcule de matematic superioar,
TVAColectat * 1.19 = 0.19 * ValoareTotal, altfel spus TVAColectat = ValoareTotal *
0.19 / 1.1917. Prin urmare, expresia restriciei la nivel de nregistrare este:
TVAColectat BETWEEN 0 AND ValoareTotal * 0.19 / 1.1918.
Cele dou tipuri de restricii pot lucra n tandem. Astfel, pentru tabela
STUDENI putem declara:
- O restricie pentru atributul CicluStudii: CicluStudii IN (1, 2, 3)
Reguli complexe
Exist i alte tipuri de restricii a cror validare presupune verificarea valorilor
(unuia sau mai multor atribute) de pe dou sau mai multe linii (nregistrri) ale
unei aceleai tabele, sau chiar aflate n tabele diferite. Iat cteva exemple mai mult
sau mai puin realiste:
- o factur poate avea maximum 30 de linii (produse vndute);
- se interzice emiterea unei noi facturi (o nou vnzare) dac datoriile firmei
client sunt mai mari de 20000 lei (iar directorul acesteia nu este membru n
partidul/partidele de guvernmnt);
- pentru o bibliotec universitar, numrul maxim de cri mprumutate, la
orice moment dat, depinde de categoria cititorului: 5 pentru studenii din
ciclul 1, 7 pentru studenii din ciclurile 2 i 3, i 10 pentru profesori.
Modalitile prin care aceste restricii pot fi declarate/implementate sunt destul
de eterogene n standardele SQL i n practic (SGBD-uri): aseriuni, reguli i,
probabil, cele mai frecvente, declanatoarele (triggerele) pe care le vom discuta n
detaliu mai ctre finalul crii.
Un formalism frecvent printre non-profesioniti este cel din Access vezi figura
2.6. Principalul avantaj este c, datorit modului de dispunere a atributelor n
tabele, reprezentarea relaiilor cu multe atribute nu ridic probleme precum
formalismul anterior. Exist, ns, i cteva dezavantaje majore:
- nu se pot vizualiza cheile alternative (alte atribute/grupuri de atribute cu
valori unice n tabela respectiv);
- nu se pot deosebi atributele cu valori obligatorii (NOT NULL) de cele
pentru care se pot accepta valori nule;
- restriciile refereniale trebuie ghicite dup numele atributelor, ntruct
linia care leag tabela copil de tabela printe nu este trasat (dect
accidental) n dreptul atributelor cheie extern i cheie primar;
- pentru Access, conectarea unei tabele printe cu una copil nu nseamn
automat i c restricia referenial a fost instituit.
Tabela PACIENI ofer cte o linie pentru fiecare bolnav, fericit sau nefericit,
care a trecut pragul spitalului (i a fost nregistrat). Atribute:
- IdPacient este un numr ntreg care identific fiecare persoan-pacient;
- NumePacient ir de caractere cu funcionalitate evident;
- CNP Codul Numeric Personal al pacientului;
- Adresa ir de caractere ce indic domiciliul (din cartea de identitate)
pacientului;
- Loc localitatea n care i are domiciliul pacientul (este separat de
adres);
- Jude judeul n se care se gsete localitatea;
- ar ara n care i are domiciliul pacientul;
- Serie_Nr_Act_Identitate seria i numrul actului de identitate al
pacientului.
Cheia primar a tabelei este IdPacient. Interesant este c acesta este singurul
atribut al tabelei care nu poate accepta valori nule, ceea ce pare destul de curios.
Motivul este c la clinic pot sosi victime nensoite ale unor accidente rutiere care
nu au asupra lor niciun act de identitate, i, pn n momentul n care devin
contiente i li se recupereaz documentele, trebuie preluate n baza de date fr a
se ti mai nimic despre ele.
Tabela TRIAJ conine, pe fiecare dintre linii, un caz, adic sosirea unei
persoane n stare mai bun mai mai rea. n decursul anilor, o persoan care se
regsete n tabela PACIENI pe o singur linie/nregistrare, poate avea mai multe
linii din TRIAJ corespondente. Astfel, un ghinionist poate a avut pe 13 mai 2005 o
criz renal, pe 13 ianuarie 2007 a alunecat pe ghea i i-a rupt un picior, iar pe 13
iunie 2008 a avut un accident rutier n care i-a rupt o coast. Toate cele trei bucurii
s-au petrecut n preajma spitalului, care l poate considera client fidel. Atribute:
- IdExaminare este un numr ntreg care identific orice sosire a unui
pacient n camera de gard, sosire care devine caz;
- DataOra_Examinare momentul (data/ora) sosirii/examinrii
pacientului;
- IdPacient numrul ntreg care identific pacientul;
- Simptome ir de caractere n care medicul de gard descrie cum se
prezenta pacientul n momentul sosirii;
52 Capitolul 2
Tabela JUDEE conine cte o linie pentru fiecare jude n care sunt clieni.
Atribute:
- Jud indicativul auto al judeului (alctuit din dou litere, majuscule);
- Jude denumirea judeului;
- Regiune regiunea istoric (provincia) din care face parte judeul.
Cheia primar este atributul Jud, iar atributul Jude este cheie alternativ.
Niciunul dintre atribute nu accept valori nule. Restricii-utilizator:
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 53
Tabela CODURI_POTALE conine cte o linie pentru fiecare cod potal dintr-
un ora sau comun:
- CodPot codul potal;
- Loc denumirea comunei/oraului;
- Jud indicativul auto al judeului n care se afl oraul/comuna.
Cheia primar este atributul CodPot. Atributul Jud este cheie strin, tabela
printe fiind JUDEE. Nici CodPost, nici Loc nu trebuie s accepte valori NULL.
Restricii-utilizator:
Valoarea lui Jud este alctuit numai din majuscule (eventual, un spaiu,
pentru Bucureti);
Fiecare cuvnt din Localitate ncepe cu majuscul; restul literelor sunt mici.
Tabela CLIENI pstreaz date generale ale clienilor firmei pentru care s-a
constituit baza de date (o linie un client). Atribute:
- CodCl codul clientului;
- DenCl denumirea clientului (persoan juridic);
- CodFiscal codul fiscal;
- Adresa adresa sediului firmei client;
- CodPot codul potal al comunei sau oraului;
- Telefon telefonul (principal) al clientului.
Cheia primar este atributul CodCl, iar CodFiscal este cheie alternativ ntruct
clienii sunt exclusiv persoane juridice (firme). Atributul CodPot este cheie
strin, tabela printe fiind CODURI_POTALE. DenCl i Adresa ncep cu
majuscule. Numai Adresa i Telefon pot avea valori NULL. De asemenea, valoarea
minim acceptat pentru atributul CodCl este 1001.
- Nume;
- Prenume;
- Adresa adresa domiciliului stabil (din cartea de identitate);
- Sex;
- CodPot codul potal al adresei;
- TelAcas numrul telefonului de acas;
- TelBirou numrul telefonului (fix) de la birou;
- TelMobil numrul mobilului;
- Email adresa e-mail.
Dei este un numr compus din 13 poziii, este recomandabil ca CNP s fie
declarat de tip ir de caractere. Aceasta deoarece n firm exist rezideni din alte
ri care au poziii de vrf n firme romneti (sau reprezentane ale unor firme
strine). Ori, codul identificator din paaport poate fi alctuit din litere i cifre.
Cheia primar este atributul CNP (s presupunem c firma le poate obine, dei
e puin plauzibil). Fiind vorba de persoane exterioare companiei, un atribut
precum Marca este mai puin indicat. Atributul CodPost este cheie strin, tabela
printe fiind CODURI_POTALE. Alte restricii:
fiecare cuvnt din Nume i Prenume ncepe cu majuscul; restul literelor
sunt mici;
adresa ncepe cu majuscul;
atributul Sex poate lua numai dou valori: B de la Brbtesc i F de la
Femeiesc.
Tabela FACTURI conine cte o linie pentru fiecare factur emis, factur ce
reflect o vnzare (ctre un client). Atribute:
- NrFact numrul facturii;
- DataFact data ntocmirii facturii;
- CodCl codul clientului cruia i s-au vndut produsele/serviciile consem-
nate n factur;
- Obs observaii; e folosit relativ rar, pentru a introduce eventuale detalii
sau probleme care au aprut n legtur cu o factur.
Cheia primar este atributul NrFact. Explicaia este una simpl: gestionarea
facturilor emise este, conform legii, strict. Nu pot exista dou facturi (care reflect
dou vnzri) cu un acelai numr20. CodCl este cheie strin (tabela printe este
CLIENI). Ca restricie utilizator suplimentar, s zicem c interzicem preluarea
facturilor ntocmite nainte de 1 ianuarie 2007 sau dup 31 decembrie 2015
(DataFact >= DATE2007-01-01 AND DataFact <= DATE2015-12-31).
20 n ultimii ani, legislaia s-a mai domolit n privina numerotrii facturilor. Companiile pot
refolosi numere de facturi n fiecare an (prima factur din orice an poate avea, spre exemplu, numrul
100001), ns noi vom menine restricia de unicitatate a valorilor NrFact n tabela FACTURI.
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 57
Tabele temporare
O caracteristic fundamental a oricrei BD este persistena. Tabelele prezentate
pn acum sunt cele care asigur aceast caracteristic, ntruct, dup crearea lor
(i, implicit, stocarea schemei lor n dicionarul de date), informaiile introduse i
modificate sunt pstrate pe o durat nedeterminat, pn la tergerea lor explicit
sau pn la vreun nedorit dezastru hardware sau software.
Mai mult, n condiiile n care la baza de date are acces un mare numr de
utilizatori, modificrile efectuate de un utilizator (i confirmate prin ncheierea
eventualei tranzacii) n coninutul unei tabele sunt vizibile celorlali utilizatori.
Exist ns i posibilitatea de a declara tabele a cror schem s fie stocat n
dicionar, dar pentru care coninutul s fie volatil. Astfel, pot fi create tabele al
cror coninut s fie vizibil doar sesiunii de lucru care face apel la tabela respectiv,
pe perioada ntregii sesiuni. Acestea sunt tabelele temporare globale. Structura
tabelelor temporare locale este, de asemenea, pstrat n dicionarul de date, ns
vizibilitatea coninutului lor este limitat doar la un singur modul/bloc apelant n
cadrul sesiunii. La ce ar putea folosi tabele ale cror coninut ar fi aa de efemer ?
S lum un exemplu: dorim s analizm structura vnzrilor pe o regiune din care
face parte utilizatorul (sau o regiune aleas), dup mai multe criterii, pe ultimele 12
luni. Datele fiind istorice, iar BD folosit de muli utilizatori/aplicaii, n loc s
consultm repetat tabelele persistente, le putem menaja crend una sau mai
multe tabele temporare pe care s le stoarcem (pe ndelete) de informaii. Pe toat
durata vieii, liniile tabelelor temporare rmn neschimbate, deci rezultatele sunt
corecte (consistente). n capitolul 14 vom vedea modul n care pot fi create n SQL
tabelele temporare.
Tabele virtuale
n englez sintagma pentru acest tip de tabel este view, adic vedere sau
imagine. De aceea, n lucrrile romneti pot fi ntlnite mai multe titulaturi. O
tabel virtual stabilete o legtur semantic (printr-o expresie relaional sau
interogare) ntre tabele persistente i/sau alte tabele virtuale, neavnd tupluri
proprii, ca o relaie de baz (static). Coninutul (instanierea) tabelei virtuale
depinde, la un moment oarecare dat, de coninutul tabelelor de baz din care
deriv. Pentru a nelege mai bine diferena, explicaia se poate rezuma astfel: tabela
virtual este cea pentru care pe disc se memoreaz numai schema, nu i coninutul.
Ca i tabelele temporare (i cele obinuite), definiia unei tabele virtuale se
pstreaz pe disc. nregistrrile unei tabele temporare sunt stocate pn la
finalizarea modulului/blocului de cod (cazul celor locale) sau sesiunii (cazul celor
globale), n timp ce nregistrrile unei tabele virtuale nu se pstreaz. i tabelele
temporare i cele virtuale pot fi actualizate. Actualizarea nu ridic nicio problem
n cazul tabelelor temporare. n schimb, actualizarea unei tabele virtuale trebuie s
se propage n tabelele persistente din care provind tuplurile acesteia. Sunt situaii
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 59
destul de frecvente n care o modificare a unei linii ntr-o tabel virtual nu poate fi
tradus cu exactitate n modificri ale tabelelor de baz, cazuri n care, de obicei,
aceste modificri sunt respinse de ctre SGBD.
Tabelele virtuale ofer oricrui utilizator al unei baze de date posibilitatea
prezentrii datelor n funcie de nevoile sale specifice. De asemenea, raiuni de
securitate i confidenialitate a anumitor informaii pot conduce la izolarea unor
date fa de utilizatorii neautorizai, lucru deplin posibil prin intermediul view-
urilor. Pornind de la aceleai tabele de baz, se pot crea oricte tabele virtuale, n
funcie de situaie. Tabelele virtuale constituie suportul crerii schemelor externe.
Odat definit, o tabel virtual poate fi referit ca o tabel de baz oarecare.
Proceduri stocate
O procedur stocat este o secven de program (cod) a crei
definiie/semntur face parte integrant din baza de date. Avantajele utilizrii
procedurilor stocate decurg din faptul c acestea sunt parte din structura (schema)
bazei, fiind pstrate n dicionarul de date (catalogul sistem). Exist mai multe
tipuri de proceduri stocate: funcii pentru calculul unor valori implicite,
proceduri/funcii de validare la nivel de linie sau nregistrare, funcii/proceduri
de calcul a unor expresii complexe etc. ncepnd cu versiunea 1999 a standardului,
SQL-ul prezint o component important PSM (Persistent Stored Modules) care
ncearc s instituie un etalon n redactarea procedurilor stocate. Unificarea PSM
este o sarcin delicat. SQL-ul a aprut i s-a consacrat la limbaj neprocedural, care
nu lucreaz cu module de program clasice. Aa c fiecare productor de SGBD-uri
i-a perfecionat unul (sau chiar mai multe) limbaje procedurale. Alinierea la
specificaiile PSM este un proces de durat i oarecum de uzur (dar nu pentru
noi).
Declanatoare
Declanatorul (trigger) a aprut ca un tip special de procedur stocat care este
executat automat cnd un eveniment predefinit (inserare, actualizare sau tergere)
modific o tabel. Utilitatea declanatoarelor este evident la formularea unor
restricii mai complexe dect suport comenzile CREATE/ALTER TABLE, cum
ar fi: actualizarea automat a unor atribute calculate, jurnalizarea modificrilor
suferite de baza de date, pstrarea integritii refereniale etc.
Exist diferene sensibile ntre SGBD-uri i n ceea ce privete sintaxa declana-
toarelor, deoarece acestea sunt redactate n extensiile procedurale ale SQL, care
prezint diferenieri majore de la un productor la altul. n ultimii zece ani, au
aprut i alte evenimente-declanatoare n afara celor trei, cum ar fi: conectarea la
baza de date care echivaleaz cu deschiderea unei sesiuni de lucru, nchiderea
sesiunii, crearea unui obiect n BD, pornirea sau oprirea bazei de date etc.
Secvene
Secvena este un alt tip de obiect al unei BDR care nu face parte, propriu-zis,
din modelul relaional. A aprut din necesitatea asigurrii unicitii cheilor
primare/alternative. S lum cazul atributului CodCl din tabela CLIENI. La
60 Capitolul 2
inserarea unui client, valoarea sa pentru atributul CodCl ar trebui s fie superioar
celei a precedentului client introdus, sau, n orice caz, dac nu superioar, mcar
diferit. Dac ar fi un singur utilizator cu drept de introducere a firmelor client n
BD, lucrurile ar fi relativ simple, corectitudinea valorilor CodCl depinznd de
atenia sa. Acest scenariu este cu totul improbabil n aplicaiile pentru afaceri, n
care pot exista zeci, chiar sute sau mii de utilizatori ce lucreaz simultan cu baza,
iar, mai ales, n primele sptmni de la darea n folosin a aplicaiei, clienii pot fi
introdui de ctre mai muli utilizatori (uneori chiar simultan).
Secvena este un obiect care, la fiecare invocare a sa, genereaz o valoare unic,
indiferent de cte cereri/invocri simultane sunt. Crearea unei secvene
presupune, n afara numelui su, precizarea minimului, maximului i a incremen-
tului valorilor generate.
21 Evocarea are un uor aer de poveste. Eu le-am auzit de la Fabian Pascal, care le preluase de la
Chris Date.
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 61
Dup civa ani, IBM se hotrte s aloce bani ntr-un proiect care s se
materialezeze ntr-un SGBD relaional - System/R. Proiectul s-a derulat n
laboratorul Santa Teresa din San Jose, California. Prima faz - anii 1974 i 1975 - s-a
concretizat ntr-un prototip al SGBDR-ului, prototip care a fost rescris n anii 1976
i 1977 pentru a permite interogarea simultan a mai multor tabele i accesul multi-
utilizator. IBM a distribuit produsul pe parcursul anilor 1978 i 1979 la civa
colaboratori ai si pentru evaluri, dar n 1979 firma abandoneaz proiectul
System/R, considerndu-l nefezabil22. System/R a fost ns punctul de plecare
pentru realizarea unuia dintre cele mai cunoscute SGBDR-uri, DB2.
ntre timp, au fost realizate alte SGBD-uri, fie n stadiu de prototip, fie finisate
de-a binelea: INGRES (Interactive Graphics and Retrieval System) - al Universitii
Berkeley, QUERY BY EXAMPLE - Centrul de cercetri T.J. Watson, PRTV (Peterlee
Relationnel Test Vehicle) - Centrul tiinific Peterlee (Marea Britanie) patronat de
firma IBM, RDMS (Relational Data Management System) - General Motors,
INFORMIX (denumit iniial Relational Data Systems) etc.
Ca reper, reinem i anul 1977, cnd un grup de ingineri de la Menlo Park,
California, a fondat compania Relational Software Inc., cu scopul declarat de a
dezvolta un SGBD bazat pe limbajul SQL. Produsul, denumit Oracle, a fost lansat
n 1979 i a reprezentat primul SGBDR comercial. Dincolo de faptul c Oracle
precede cu doi ani primul SGBDR comercial al firmei IBM, orientarea sa a fost
extrem de bine gndit, rulnd pe minicalculatoarele VAX (Digital Equipment
Corporation), sensibil mai ieftine dect mainframe-urile IBM, i, deci, cu un
segment de pia mai mare. Astfel, succesul a fost considerabil. Astzi, firma,
redenumit Oracle Corporation, este liderul produselor software dedicate mediilor
de lucru cu bazele de date.
Primul SGBDR comercializat de IBM a fost SQL/DS (DS - Data System) anunat
n 1981 i comercializat n 1982. n 1983 IBM a lansat DB2, dedicat iniial
mainframe-urilor sale, dar care n timp a fost portat pe toate sistemele de operare
importante.
Pn la jumtatea anilor '80, SGBD-urile relaionale au stat n umbra celor
ierarhice i reea. Motivul principal l-a constituit viteza mai mic, parametru
esenial n sistemele "confruntate" cu accesul simultan a sute sau chiar mii de
utilizatori. n a doua parte a anilor '80 performanele SGBDR-urilor au fost net
ameliorate. Ctigul de vitez, care s-a adugat atuului principal, interogarea ad-
hoc prin utilizarea limbajelor de generaia a IV-a (SQL, QBE, Quel), a lrgit
continuu segmentul ocupat de SGBDR-uri.
Cele mai simple i ieftine SGBDR-uri sunt cele pentru uz individual sau
aplicaii de tip file-server. Exemplele clasice sunt Visual FoxPro, Paradox i Access.
Visual FoxPro-ul a avut n ara noastr un mare succes, comparabil doar cu cel din
cteva ri est-europene. Modul n care calculatoarele i reelele de calculatoare au
ptruns i s-au extins la noi explic adoptarea sa n multe aplicaii de ntreprindere
i predarea sa n coli, licee i universiti. Generaia mea de truditori n ale bazelor
23
de date este, n bun parte, generaia Foxpro . Astzi termenul este, frecvent, unul
peiorativ, dar la timpul su (la nceputul anilor 90), cu greu se putea gsi la noi
ceva mai bun, ieftin (i uor de copiat).
Astzi Visual FoxPro (vezi figura 2.11), ajuns la versiunea 9, a ieit la pensie.
Microsoft-ul s-a hotrt s opreasc producia i suportul pentru acest SGBD
venerabil. Semnele rele erau vizibile de mai bine de zece ani. Microsoft nu a mai
venit cu modificri importante legate de gestiunea bazelor de date n FoxPro de la
versiunea Visual FoxPro 5 lansat 1994. Versiunile ulterioare au mai corectat din
erori, au mai introdus cteva opiuni privitoare la nucleul SQL (mai ales la
versiunea 9), i cam att. Este adevrat, VFP nu este doar un SGBD, ci un mediu
integrat de dezvoltare de aplicaii, cu foarte bune generatoare de rapoarte, meniuri
Figura 2.11. Afiarea coninutului unui proiect (inclusiv schema BD) n Visual FoxPro
Totui, pentru a intra n lumea bun a serverelor BD, VFP trebuia nzestrat cu
24
opiuni de creare a utilizatorilor , a profilurilor, de alocare i revocare de drepturi
pe toate obiectele bazei de date. Mai mult, ar fi trebuit s permit nativ
25
arhitecturi client/server i web , module de arhivare, restaurare i replicare, dar
mai ales s se descurce cu recuperarea bazei n cazuri de dezastre (ntreruperi de
curent, blocri ale Windows-ului). Or, responsabilii de aplicaii complexe realizate
n VFP, cu zeci de utilizatori conectai simultan la BD, tiu ce este adrenalina cnd
26
pic nite indeci .
Dei i-a fost anunat sfritul, mai am o speran pentru VFP, i anume ca,
odat ce Microsoft i va lua minile de pe produs, ar putea intra n lumea open-
source, i cunoate o nou via (ar fi, cred, a treia).
Cel mai celebru SGBD din categoria non-serverelor BD este Access, copilul pe
27
care Microsoftul l-a preferat n dauna Visual FoxPro-ului . Access-ul are toate
atuurile care l-au fcut aa de popular, de la uurina folosirii, pn la integrarea cu
celelalte aplicaii din Office i migrarea natural la SQL Server. i Access este mai
mult dect un SGBD vezi figura 2.12.
Figura 2.12. Afiarea coninutului unui proiect (inclusiv tabelele BD) n Access
ns, dei i-au fost adugate funciuni redutabile, Access nu este (nc) un
server BD, iar dialectul su SQL este unul rezonabil, dar nu impresionant, n niciun
caz superior celui din VFP.
26 Vorbesc din propria experien. Cea mai mare jen profesional (de pn acum) o am din urm
cu vreo zece ani, cnd, mpreun cu ali colegi din Catedra de Informatic Economic, am ncercat s
modificm modul de nscriere la concursul de admitere al FEAA Iai. Ghinionul a fost c decanul a avut
ncredere n noi, dar, contrar testelor preliminare, n primele patru ore de la nceperea nscrierilor (se
adunaser vrei dou sute de persoane) ne-au picat indecii de vreo zece ori. Ulterior, am aflat c dintre
cele douzeci de staii (PC-uri) de nscriere, dou erau mufate un pic greit (i, absolut aleatoriu,
pierdeau din cnd n cnd legtura cu serverul pentru cteva fraciuni de secund).
27 n fine, poate c exprimarea e cam melodramatic, dar ca fox-ist (i ofticos pe deasupra) n-am
putut s m abin.
SQL. Dialecte DB2, Oracle, PostgreSQL i SQL Server 65
Figura. 2.13. Obiecte dintr-o baz de date Oracle (afiate de clientul SQL Developer)
Titlul figurii 1.6 fcea trimitere la structura unui SGBD. De fapt, numai
serverele BD sunt construite pe arhitectura respectiv. Conform standardului SQL
[ISO/IEC 2007-1], un server SQL:
gestioneaz sesiunile SQL care se deruleaz ntre server i un client prin
intermediul unei conexiuni SQL;
execut comenzile SQL primite de la client, recepioneaz i transmite
datele cerute;
66 Capitolul 2
ului, cel puin primele dou standarde majore, SQL-89 i SQL-92 fiind, n mare
msur, copii ale dialectului SQL din DB2, aa cum se prezenta la acea dat.
vezi figura 2.15. Titulara produsului este un pic nepoliticoas (probabil c cea mai
28
decent denumire ar fi fost One of the SQL Servers), dar pe pia a prins .
condiiile n care avea implementat unul dintre cele mai slabe dialecte SQL, iar
procedurile stocate erau evocate doar, din cnd n cnd, pe grupurile de discuii.
De la versiunea 5, MySQL-ul este mai apropiat de un nivel decent de opiuni
specifice serverelor BD.
Nivelul jenant (n materie de SQL) al MySQL-ului a fost unul dintre motivele
alegerii (cu civa ani n urm) a PostgreSQL-ului ca server BD open-source
reprezentativ pentru lucrul cu studenii. Dei nescutit de probleme tehnice n a
doua parte a anilor 90, astzi PostgreSQL-ul, ajuns la versiunea 8.3, poate fi folosit
n aplicaii sofisticate, avnd un nivel de funcionalitate redutabil. Mai mult, n
materie de aliniere la standardele SQL, PostgreSQL merit toate laudele.
Figura 2.16 ilustreaz modul n care sunt prezentate obiectele unei baze date n,
probabil, cel mai popular client PostgreSQL i anume pgAdmin client pe care
l vom folosi i noi pentru exemplificare comenzilor SQL i modulelor de proceduri
stocate.
Figura. 2.16. Obiecte dintr-o baz de date PostgreSQL afiate n clientul pgAdmin
70 Capitolul 2