Documente Academic
Documente Profesional
Documente Cultură
Lucrare de Licenta Baze de Date
Lucrare de Licenta Baze de Date
CAPITOLUL I
exista efectiv numai pe timpul rularii programului pe cand intr-o baza de date in
general datele sunt definite o data pentru totdeauna si nu mai sunt necesare redefiniri.
Limbajele LDD si LC sunt de cele mai multe ori extinderi ale unor limbaje de
programare numite limbaje gazda. Compilarea succesiunilor de comenzi pentru
descrierea datelor sau pentru operarea cu date se reduce in acest caz la o precompilare
adica transformarea acestor comenzi intr-o succesiune de instructiuni ale limbajului
gazda care prin executare sa dea efectul dorit. O alta modalitate de operare este aceea
a transformarii comenzilor in lansari de programe executabile.
O structura posibila pentru SGBD este data in figura 1.1. In aceasta figura
procesorul de cereri prelucreaza cererile utilizatorilor presentate la terminal sau sub
forma de programe de aplicatii scrise in LC transformandu-le in comenzi executabile
de catre gestionarul bazei de date; compilatorul LDD interpreteaza transforma
descrierile utilizatorului in comenzi pentru initierea sau modificarea unei baze de date;
gestionarul bazei de date transforma comenzile de cereri si descrieri de baze de date in
operatii executabile de catre sistemul de gestiune a fisierelor care opereaza asupra
datelor aflate in diferite fisiere.
frecvent
(cerere C1
procesor
utilizator) cereri
(schema
baza date)
Figura 1.1.
Dintre sarcinile pe care le indeplineste gestionarul bazelor de date fac parte si
urmatoarele:
- Reducerea redondantelor prin identificarea informatiilor comune si alcatuirea
corespunzatoare a aplicatiilor.
- Eliminarea inconsistentelor ce rezulta din eliminarea redondantelor.
- Utilizarea simultana a datelor de mai multi utilizatori.
- Standardizarea informatiilor.
- Asigurarea securitatii bazelor de date in sensul acordarii si urmaririi modului
de acces al utilizatorilor la diferite parti componente ale bazelor de date.
- Asigurarea integritatii bazelor de date in sensul pastrarii corectitudinii datelor
continute in baza de date prin testele aplicate datelor introduse in baza de date.
3. Scheme externe
Informatiile ce apar in scheme externe pot fi luate ca atare din nivelele logic si
fizic sau pot fi deduse din aceste informatii pe baza unor calcule. De exemplu pentru o
persoana poate sa apara intr-o vedere atributul varsta dar la nivel logic si fizic atributul
varsta nu este indicat din cauza permanentei modificari a continutului lui. In acest caz
se foloseste la nivel logic un atribut data_nasterii care prin scadere din data curenta
permite aflarea varstei persoanei respective. Alte informatii ce pot sa apara in vederi si
care de obicei nu sunt prevazute in schemele conceptuale privesc numarul de elemente
dintr-o multime, media valorilor unei multimi de elemente numerice si alte informatii
asemanatoare.
Vederile sunt definite prin intermediul unui sublimbaj de definire a datelor
(SLDD) care de cele mai multe ori este inclus in LDD sau este foarte apropiat ca
structura de LDD. Exista sisteme de baze de date care permit mai multe SLDD in
acelasi timp fiecare utilizator alegandu-si modul propriu de descriere al datelor.
Informatiile ce se obtin din baza de date pot fi apoi prelucrate prin proceduri scrise in
anumite limbaje de programare.
Pentru utilizatorul obisnuit modul de definire a vederilor este transparent el
putand sa obtina sau sa modifice informatiile dorite prin intermediul unor comenzi cu
structura data, folosind forme predefinite pe care le completeaza sau utilizand un
sistem de meniuri.
Informatiile privind structura unei vederi sunt sintetizate grafic intr-o diagrama
entitate-relatie care pune in evidenta entitatile ce intervin reprezentate prin
dreptunghiuri, atributele asociate lor reprezentate prin elipse si diferitele relatii ce se
stabilesc intre entitati reprezentate prin sageti (cu varf dublu catre entitatea pentru care
pot apare mai multe elemente in relatie cu un element din cealalta entitate. Pentru
vederea definita in exemplul 1.2 se poate asocia diagrama din figura 2.
4. Scheme conceptuale
Schema conceptuala a bazei de date combina subschemele vederilor ce privesc
o anumita aplicatie intr-un model unitar. Modul de descriere si de reprezentare este
acelasi cu modul de descriere si de reprezentare al vederilor. Deci si in schema
conceptuala intervin notiunile de entitate, relatie, cheie, diagrama entitate-relatie si
altele.
In combinarea vederilor se tine seama de posibilitatea identificarii unor entitati,
de transformarea unor relatii, de completarea unor informatii, de modul de
reconstituire a informatiilor la nivelul vederilor. In plus trebuie sa se tina seama si de
modelul de baze de date ales pentru cazul particular dat.
O schema conceptuala trebuie sa se bazeze pe un model teoretic si sa fie simpla
in sensul de a fi usor de inteles si de prelucrat. Numarul elementelor ce o constituie sa
nu fie prea mare, diferitele concepte folosite sa fie separate clar, sa se pastreze
simetriile, sa se tina sub control redondantele sunt cateva din principiile ce se aplica in
acest caz.
Pana acum sistemele de gestiune a bazelor de date au fost clasificate in trei
grupe mari in functie de tipul elementelor cu care lucreaza:
- modelul retea permite lucrul cu entitati si relatii binare de tipul unu-la-unu si
unu-la-mai-multi cu diagrama rezultata un graf oarecare.
- modelul arborescent (ierarhic) permite lucrul cu entitati si relatii binare de
tipul unu-la-unu si unu-la-mai-multi si diagrama alcatuita dintr-o multime de arbori.
- modelul relational in care intervin numai relatii si operatii cu ele.
In capitolele urmatoare vom descrie aceste modele punand accent pe modelul
relational care este cel mai raspandit fiind foarte eficient in special pentru baze de date
de dimensiuni mici, fiind mai mult studiat si din punct de vedere teoretic si nu in
ultimul rand fiind mai usor de manuit de utilizatori.
5. Scheme interne
CAPITOLUL AL II-LEA
MODELUL LOGIC AL DATELOR
CURSUL 3
1. Modelarea logica a datelor
Poate cea mai importanta parte din procesul construirii unei baze de date il
constituie studiul sistemului ce urmeaza sa fie reflectat in baza de date. Stabilirea
informatiilor relevante pentru sistem si a relatiilor dintre ele este de cea mai mare
importanta pentru etapele urmatoare.
Baza de date reprezinta un model al lumii reale si nu poate reprezenta decat un
numar limitat de caracteristici ale ei necesare in unele aplicatii. Oricat de perfectionat
ar fi modelul utilizat exista aplicatii care se pot concepe astfel incat sa nu poata fi
satisfacute de baza de date. Deci apar interpretari subiective ale lumii reale reflectate in
baza de date.
Pentru a construi o baza de date corespunzatoare unui sistem real dat se face
mai intai o apreciere generala a sistemului. In aceasta apreciere se includ informatii
privind structura sistemului, elementele esentiale ale sistemului care sunt cuprinse intro schita preliminara. Schita cuprinde printre alte informatii si modul in care sistemul
este vazut de diferitele persoane implicate in sistemul respectiv. Se creaza un model
informational in care sunt cuprinse principalele functiuni si fluxul de informatii din
sistem. Sistemul trebuie privit unitar si nu ca o alaturare a componentelor sale. In baza
de date multe parti sunt folosite in comun de diferitele componente ale sistemului.
Modelul utilizat frecvent in acest caz se numeste modelul entitate/relatie (E/R)
descris de Chen in 1976 si perfectionat ulterior. Acest model are drept obiecte
semantice urmatoarele:
- Entitatea ce este definita ca un lucru ce poate fi unic identificabil. Se pot
deosebii entitati obisnuite (regular entities) si entitati speciale (weak entities) a caror
existenta este dependenta de existenta altor entitati.
- Proprietatea sau atributul ce defineste o latura a entitatii sau relatiei putand
lua valori intr-un domeniu asociat. Proprietatile pot sa fie simple sau compuse, chei (sa
identifice unic entitatea respectiva), univaloare sau multivaloare (grup repetitiv), sa
poata fi omisa (necunoscuta sau neaplicabila), de baza sau derivata si asa mai departe.
- Relatia ce defineste o asociere intre entitati. Numarul de edntitati ce apar intro relatie se numeste gradul relatiei. O entitate E poate sa participe la relatia R total
(prin toate elementele lui E) sau partial. Relatiile pot sa fie de tipul unu-la-unu, unu-lamai-multi (mai-multi-la-unu) sau mai-multi-la-mai-multi.
- Subtipul unei entitati este un tip de entitate ce formeaza o submultime a
entitatii respective, de obicei cu proprietati suplimentare. Tipul de entitate de care
apartine un subtip se numeste supertip. Pentru fiecare entitate in parte se poate stabili
un tip ierarhic prin subordonarile de forma subtip si supratip.
Modelul logic al bazei de date este reprezentat grafic prin diagrame
entitate/relatie. In aceste diagrame entitatile sunt reprezentate sub forma de
dreptunghiuri ce contin numele entitatii respective. Pentru entitatile speciale linia ce
inconjoara dreptunghiul este dubla. Proprietatile sunt reprezentate prin elipse ce contin
numele proprietatii respective si unite cu linii de entitatile la care sunt asociate. Elipsa
se deseneaza punctat daca proprietatea este derivata si dublat daca este multivaloare.
Proprietatile compuse au legate de ele componentele lor reprezentate tot sub forma de
elipse. Cheile sunt subliniate. Relatiile sunt reprezentate sub forma de romburi
etichetate cu numele tipului relatiei respective. Rombul se dubleaza daca relatia indica
legatura intre o entitate speciala si entitatea de care depinde ea. Relatia este unita prin
linii cu entitatile ce apar in ea etichetate cu "one" sau "many" dupa caz. Linia se
dubleaza daca participarea in relatie a entitatii este totala. Orice subtip Y al lui X se
marcheaza cu o linie de la Y la X pe care se pune semnul de incluziune de multimi (a
lui Y in X).
Un alt model utilizat in proiectarea logica a datelor este modelul relational
extins (extended relational model sau pe scurt RM/T) introdus de Codd. In acest
model nu se face distinctie intre entitati si relatii. Entitatile sunt clasificate in trei tipuri:
entitati nucleu (existenta independenta), entitati caracteristice (ce descriu unele
proprietati ale altor entitati) si entitati asociative (ce descriu asocieri intre diferite
entitati). In sistemul RM/T atat cheile primare cat si cheile straine se considera
surogate, combinatii ce determina unic in sistem informatia respectiva pe toata durata
existentei ei. Baza de date contine cate o E-relatie pentru fiecare tip de entitate,
acestea fiind relatii unare ce contin surogatele entitatilor din tipul de entitate asociat.
Tipurile de proprietati ale unui tip de entitate dat sunt reprezentate printr-o multime de
P-relatii.
Sistemul RM/T contine o serie de reguli de integritate si anume: regula
integritatii entitatii (cheile nu pot sa contina valoarea null), regula integritatii
referentiale (necesitatea existentei elementului referit printr-o cheie straina nenula),
regula integritatii E-relatiilor (pentru E-relatii sunt permise inserari si stergeri dar nu
modificari), integritatea proprietatilor (o proprietate nu poate exista in baza de date
daca nu exista si entitatea pe care o descrie), integritatea caracteristicilor (o entitate
caracteristica nu poate exista in baza de date fara existenta entitatii pe care o descrie),
integritatea asocierii (o entitate asociativa nu poate exista in baza de date decat daca
exista si entitatile asociate de ea), integritatea desemnarii si integritatea subtipului.
Metodologia proiectarii folosind sistemul RM/T cuprinde urmatorii pasi:
determinarea entitatilor nucleu, determinarea entitatilor asociative, determinarea
desemnarilor, determinarea entitatilor caracteristice, determinarea proprietatilor si
determinarea supertipurilor si subtipurilor.
2. Vederile utilizatorilor
Fiecare aplicatie presupune utilizarea unei parti din baza de date, folosind
informatiile intr-un mod determinat. Aceasta parte de informatie se numeste vedere. O
baza de date poate sa aiba una sau mai multe vederi. La fiecare vedere corespunde un
grup de utilizatori. Pentru un grup particular se definesc tipurile de cereri de informatii
si modul de determinare a datelor din baza de date care formeaza raspunsuri la aceste
cereri.
CAPITOLUL AL III-LEA
MODELE DE BASE DE DATE
CURSUL 4
Dupa cum am aratat in primul capitol, sistemele de baze de date au in vedere
trei tipuri de structuri de reprezentare a informatiilor la nivel logic si de operare cu ele
si anume modelul relational, modelul retea si modelul arborescent sau ierarhic. In
continuare vom da cartacteristicile acestor modele si unele limbaje caracteristice cu o
mentiune speciala pentru limbajul SQL pe care se bazeaza majoritatea sistemelor de
baze de date relationale folosite in zilele noastre.
In descrierea modelelor vom urmari pe de o parte modul de reprezentare a
datelor si relatiilor dintre ele iar pe de alta parte operatiile asupra datelor folosite
pentru a raspunde la cererile utilizatorilor si alte transformari posibil de efectuat asupra
datelor.
uniune si alegerea unor campuri din relatia obtinuta. Astfel de succesiuni se pot
implementa fara a mai fi nevoie de unele relatii intermediare sau cu micsorarea
numarului de campuri si de tupluri ceea ce presupune spatiu mai putin ocupat si timp
de calcul mai mic.
Un exemplu de gramatica pentru definirea algebrei relationale este urmatorul:
expresie ::= expresie-unara | expresie-binara
expresie-unara ::= redenumire | selectie | proiectie
redenumire ::= termen RENAME atribut AS atribut
termen ::= relatie | ( expresie )
selectie ::= termen WHERE comparatie
proiectie ::= termen | termen [ lista-atribute ]
lista-atribute ::= atribut | atribut , lista-atribute
expresie-binara ::= proiectie operator-binar expresie
operator-binar ::= UNION | INTERSECT | MINUS | TIMES | JOIN |
DIVIDEBY
atribut ::= ...
relatie ::= ...
comparatie ::= ...
Pentru atribute si relatii se folosesc identificatori si comparatiile se definesc
intre marimi scalare.
Se mai pot defini si alti operatori cu relatii cum ar fi:
- Extensia unei relatii care se defineste prin construirea unei noi relatii care are ca
atribute lista atributelor relatiei operand la care se adauga un nou atribut avand ca
valoare rezultatul obtinut prin evaluarea unei expresii scalare. Sintaxa unei astfel de
operatii este:
EXTEND termen ADD expresie-scalara AS atribut
- Totalizarea unei relatii permite aplicarea unor operatii agregate pe partile componente
ale unei relatii avand sintaxa:
SUMMARIZE termen GROUPBY (lista-atribute) ADD expresie AS atribut
in care lista-atribute selecteaza prin valorile pe au grupele la care se aplica evaluarea
respectiva. Daca lista este vida, evaluarea se aplica o singura data pentru toata relatia.
- Catul generalizat al relatiilor R(X,Y) si S(Y,Z) unde Y este lista atributelor comune
celor doua relatii, notat R DIVIDEBY S, este o relatie T(X,Z) ce contine toate
tuplurile de forma (x,z) asfel incat pentru orice y cu (y,z) din S rezulta ca (x,y) este un
tuplu din R. Se obseva ca daca Z este multimea vida se obtine catul dintre R si S, daca
X este multimea vida se obtine catul dintre S si R si daca Y este multimea vida se
obtine produsul cartezian al celor doua relatii.
- Uniunea externa (outer join) contine tuplurile uniunii naturale la care se adauga cate
un tuplu pentru acele tupluri dintr-o relatie care nu au corespondent in cealalta relatie.
Tuplurile adaugate astfel au valoarea null pentru toate atributele ce nu apar in relatia
din care provin.
CURSUL 5
1.1.2. Calculul relational pe tupluri
In calculul relational pe tupluri cererile se exprima prin expresii de forma {t |
/v(t)}, unde t este o variabila tuplu si /v este o formula costruita din atomi si o serie de
operatori pe care ii vom defini in cele ce urmeaza.
Atomii din formula /v sunt de unul din urmatoarele tipuri:
- R(r), unde R este numele unei relatii si r este o variabila tuplu.
Acest atom corespunde propozitiei "r este un tuplu al relatiei R".
- r[i] /0 s[j], unde r si s sunt variabile tuplu si /0 este un operator
de comparatie aritmetic. Acest atom corespunde propozitiei "a i-a
componenta a lui r este in relatie /0 cu a j-a componenta a lui s".
- r[i] /0 a sau respectiv a /0 r[i], unde r si /0 sunt ca mai sus iar a
este o constanta. Acesti atomi corespund propozitiilor "a i-a
componenta a lui r este in relatie /0 cu a", respectiv "a este in
relatie /0 cu a i-a componenta a lui r".
Formulele si calitatea ocurentelor variabilelor tuplu din formula de a fi libere
sau legate se stabilesc prin urmatoarele reguli:
1. Orice atom este o formula. Toate ocurentele de variabile tuplu
mentionate in atomi sunt libere pentru aceste formule.
2. Daca /v1 si /v2 sunt formule, atunci /v1 A /v2, /v1 V /v2 si ! /v1
sunt formule corespunzatoare respectiv propozitiilor "/v1 si /v2 sunt
adevarate", "/v1 sau /v2 sau ambele sunt adevarate" si "/v1 nu este
adevarata". Calitatea fiecarei ocurente de a fi libera sau legata in
/v1 si /v2 ramane aceeasi si in formulele rezulta prin combinarea cu
operatorii A, V si !.
3. Daca /v este o formula, atunci (/Et)(/v) este o formula ce corespunde
propozitiei "exista tuplul t astfel incat /v sa fie adevarata daca se
inlocuiesc aparitiile libere din /v ale lui t cu valorile respective"
Ocurentele libere ale lui t din /v devin legate in expresia rezultata
toate celelalte ocurente de variabile tuplu din /v raman cu aceeasi
calitate (libere sau legate) si in formula rezultata.
4. Daca /v este o formula, atunci (/Vt)(/v) este o formula ce corespunde
propozitiei "orcare ar fi tuplul t, inlocuid aparitiile libere ale
lui t in /v cu valorile respective /v este adevarata". Ocurentele
libere ale lui t din /v devin legate in expresia rezultata, toate
celelalte ocurente de variabile tuplu din /v raman cu aceeasi
Lema 3.1. Daca /v este o formula in calculul relational pe domenii atunci exista
o expresie in algebra relationala pentru relatia unara DOM(/v) pe care se poate stabili
valoarea de adevar a formulei /v.
Demonstratie. Pentru o relatie R de aritate k notam cu E(R) multimea
/P1(R) U /P2(R) U ... U /Pk(R). Fie C={c1,c2,...,cm} multimea constantelor care apar
in formula /v si R1,R2,...,Rn relatiile ce apar in /v. Se verifica imediat din definitie ca
pentru domeniul lui /v se poate lua expresia
DOM(/v) = E(R1) U E(R2) U ... U E(Rn) U C
acesata fiind o expresie din algebra relationala.
Lema 3.2. Pentru orice expresie /v a calculului relational pe domenii exista o
expresie echivalenta /v' a calculului relational pe domenii care nu are ocurente de A sau
/V. In plus, daca /v e sigura atunci si /v' este sigura.
Demonstratie. Plecand de la formula /v se fac pe rand urmatoarele transformari:
orice subformula de forma /v1 A /v2 se inlocuieste prin formula echivalenta !(!/v1
V !/v2) (legea DeMorgan) si apoi orice subformula de forma (/Vu)(/v1(u)) se
inlocuieste prin formula echivalenta !(/Eu)(!/v1(u)). Cum oricare dintre cele doua tipuri
de transformari aplicate unei formule sigure au ca rezultat tot o formula sigura rezulta
ca proprietatea din enumtul lemei este adevarata.
Teorema 3.3. Pentru orice expresie sigura a calculului relational pe domenii
exista o expresie echivalenta in algebra relationala.
Demonstratie. Fie {x1x2...xk | /v(x1,x2,...,xk)} o expresie sigura a calculului
relational pe domenii care contine numai operatori V, ! si /E (conform lemei 3.2
operatorii A si /V pot fi eliminati obtinand o expresie echivalenta). Din lema 3.1 rezulta
ca exista o expresie E a algebrei relationale pentru DOM(/v). Vom demonstra prin
inductie dupa numarul ocurentelor operatorilor dintr-o subformula /w a lui /v ca
daca /w are variabilele de domeniu libere y1,y2,...,ym, atunci expresia
DOM(/v)**m /O {y1y2...ym | /w(y1,y2,...,ym)}
are o expresie echivalenta in algebra relationala. Luand /w=/v se obtine rezultatul din
enunt.
Daca /w are zero operatori atunci /w este un atom care poate fi de una din
formele x1 0 x2, x1 0 a sau R(xi1,xi2,...,xik) unde 0 este un operator de comparatie
aritmetica si a este o constanta. Pentru x1 0 x2 expresia echivalenta este /S 1 0 2 (E X
E), pentru x1 0 a expresia echivalenta este /S 1 0 'a' (E) si pentru R(xi1,xi2,...,xik) se
construieste expresia /Pj1,j2,...,jm(/S F(R)) unde F este o formula ce contine termeni
u=v daca xiu si xiv reprezinta aceeasi variabila si u<v legati cu operatorul A iar indicii
j1,j2,...,jm sunt alesi in asa fel incat x1=xij1, x2=xij2, ..., xm=xijm, deci dau una din
pozitiile pe care se afla in R variabilele domeniu x1,x2,...,xm.
Sa presupunem acum ca /w are cel putin un operator si ca proprietatea
enuntata este adevarata pentru toate subformulele lui /v care au mai putine ocurente de
operatori decat /w. Vom trata trei cazuri distincte:
CURSUL 7
1.2. Limbaje relationale de cereri
In cele ce urmeaza vom da principalele caracteristici ale unor limbaje de cereri
din modele relationale pentru a arata cum se transpun ideile teoretice expuse in
paragraful precedent pe cazuri reale. Un limbaj de cereiri concret poate sa contina
numai unii din operatorii definiti anterior sau poate sa contina si alti operatori. Vom
numi limbaj complet un limbaj de cereri care poate sa simuleze algebra relationala sau
echivalent calculul relational (pe tupluri sau pe domenii).
Dintre posibilitatile oferite de limbajele de prelucrare a datelor unor sisteme
relationale de baze de date sunt si urmatoarele:
- comenzi pentru initiere, inserare, stergere sau modificare a unor
elemente componente ale bazei de date;
- posibilitati de calcule aritmetice prin folosirea in diferite
expresii a operatorilor aritmetici;
- comenzi pentru atribuire de relatii si pentru tiparirea relatiilor;
- operatii agregate de tipul medie, suma, minim, maxim aplicabile unor
relatii cu un singur camp si care in general dau o valoare.
1.2.1. ISBL - limbaj de tip algebra relationala
Limbajul de cereri ISBL (Information System Base Language) a fost conceput
de IBM United Kingdom Scientific Center din Peterlee, Anglia pentru a fi folosit in
sistemul experimental PRTV (Peterlee Relational Test Vehicle).
In ISBL majoritatea operatorilor algebrei relationale au corespondente dupa
cum urmeaza: R U S se reprezinta cu R + S, R - S se reprezinta cu R - S,
R @O S se reprezinta cu R.S, @S/F(R) se reprezinta cu R:F, @P/A1,...,An(R) se
reprezinta cu R%A1,...,An si R |X| S se reprezinta cu R * S, unde R si S pot fi orice
expresii relationale si F este o formula Booleana. Componentele relatiilor sunt referite
prin nume. Daca R si S au atribute diferite atunci R * S reprezinta produsul cartezian al
celor doua relatii.
O expresie relationala precedata de LIST permite tiparirea relatiei rezultate.
Atribuirea numelui R pentru o expresie E se face prin R = E. Se poate amana evaluarea
unei expresii dintr-o atribuire pana la referirea relatiei R din stanga egalitatii daca unele
relatii ce apar in E sunt precedate de N! care insemneaza "evaluare prin nume".
Exemplul 3.7. Daca pentru relatiile R(A,B) si S(C,D) scriem expresia
RCS = (R * S) : B=C % A,D
r @c R : F'
unde F' se obtine din F prin inlocuirea lui A sau a numarului de componenta
corespunzator lui A prin r/A. Se pot face atribuiri de forma
R/A1,A2,...,An <- <expresie>
unde <expresie> reprezinta o relatie n-ara, aceasta atribuire produce evaluarea
expresiei respective si atribuirea pentru ea a numelui R si a atributelor specificate. Nu
exista posibilitatea unei evaluari ulterioare ca in ISBL.
O operatie des utilizata in SQUARE este un tip special de selectie urmata de o
proiectie numita aplicatie avand forma generala
/A1,A2,...,An R /B1,B2,...,Bm(@01b1,@02b2,...,@0mbm)
unde R este numele unei relatii, A1,...,An si B1,...,Bm sunt atribute ale lui R, @0i
reprezinta un operator de comparatie aritmetica (=,@=/,<,@<=,> sau @>=) care poate
fi omis si in acest caz se ia prin lipsa =, iar bi este o constanta. Aplicatia precedenta
corespunde expresiei din algebra relationala:
@P/A1,A2,...,An(@S/B1@01b1@A...@ABm@0mbm(R))
Aplicatiile pot fi compuse folosind operatorul o. Compunerea are efectul unei
echiuniuni de relatii.
Exemplul 3.8. Prima cerere din exemplul 3.7 se poate exprima sub forma
/NUME CUMPARATORI/CONT (<0)
iar a doua cerere se poate exprima in SQUARE prin expresia
/NUMEMAG,MARFA,PRET MAGAZINE/MARFA o /MARFA
COMENZI/NUME("Popescu Dan")
In SQUARE sunt permise variabile tuplu numite variabile libere, ele putand sa
aiba ca indici o lista de nume de atribute ce dau componentele ce se considera pentru
tuplul respectiv. Daca nu apare aceasta lista se considera toate atributele relatiei
parcursa de variabila tuplu. Astfel o expresie de forma
(t1)/@a1 @c R1,..., (tk)/@ak @c Rk : @v
corespunde expresiei din calculul relational pe tupluri
{u | (@Et1)...(@Etk)(R1(t1)@A...@ARk(tk)@A@w@A@v)}
unde @w contine egalitati de forma u[j]=ti[m] cu m si i alese in asa fel incat j=|@a1|+|
@a2|+...+|@ai-1|+m si m@<=|@ai| si formula @v contine aplicatii, operatorii algebrici
U,@O,-, operatori Booleeni, operatii aritmetice si comparatii aritmetice si de multimi
(=,@=/,@C=,etc.). Expresia prezentata pentru produsul cartezian este un caz
particular de acest tip de expresie in care formula @v fiind omisa se presupune tot
timpul adevarata si deci luandu-se toate combinatiile de tupluri din relatia R cu toate
combinatiile de tupluri din relatia S se obtine produsul cartezian.
Exemplul 3.9. Prima cerere din exemplul 3.7 se mai poate scrie
t/NUME @c CUMPARATORI : t/CONT < 0
iar cea de-a treia cerere din acelasi exemplu se poate scrie
s/NUMEMAG @c MAGAZINE : (/MARFA COMENZI/NUME("Popescu
Dan")
@C=/MARFA MAGAZINE/NUMEMAG(s/NUMEMAG))
Inserarea unui tuplu in relatia R se face prin expresii de forma
@|v R/A1,A2,...,An(a1,a2,...,an)
unde A1,A2,...,An este lista atributelor lui R ce primesc valori in tuplu respectiv
a1,a2,...,an, restul atributelor ramanand nedefinite (valoarea null). Mai general,
operatia de inserare se poate scrie sub forma
@|v R/A1,A2,...,An(<expresie>)
unde valoarea <expresie> este o relatie n-ara S urmand sa se faca o inserare de tuplu in
R corespunzatoare fiecarui tuplu din S.
Stergerea unor tupluri se poate face cu expresii de forma
@|^ R/A1,A2,...,An(<expresie>)
unde <expresie> este ca mai sus si efectul este eliminarea din relatia R a tuturor
tuplurilor t pentru care exista un tuplu u in S care are aceleasi valori pentru atributele
A1,A2,...,An ca si t.
Modificarea unor tupluri se face cu expresii de forma
-> R/A1,A2,...,An;B1,B2,...,Bm (a1,a2,...,an,b1,b2,...,bm)
unde A-uri si B-uri sunt atribute ale lui R, B-uri putand fi precedati de operatorii
aritmetici +,-,X sau /, a-uri si b-uri sunt constante iar efectul este urmatorul: se cauta in
R acele tupluri pentru care valorile corespunzatoare atributelor A1,A2,...,An sunt
respectiv a1,a2,...,am si pentru aceste tupluri se inlocuiesc valorile fiecarui Bi cu bi
daca Bi nu este precedat de un operator sau cu valoarea rezultata din operatia
efectuata intre fosta valoare a lui Bi si bi daca Bi este precedat de un operator
aritmetic.
Exemplul 3.10. Pentru baza de date din exemplul 3.7 putem sa inseram un nou
cumparator prin instructiunea
range of t1 is R1
.
.
.
range of tk is Rk
retrieve (ti1.A1,...,tir.Ar)
where @v'
in care Am este al jm-lea atribut al relatiei Rim pentru m=1,2,...,k si @v' se obtine din
@v printr-o translatare dupa urmatoarele reguli:
- se inlocuiesc in @v referintele lui u[m] cu tim[jm]
- se inlocuiesc apoi referintele lui tm[n] prin tm.B unde B este al
n-lea atribut al relatiei Rm pentru toti n si m
- se inlocuiesc @<= cu <=, @>= cu >= si @=/ cu !=
- se inlocuiesc @A,V si @! cu and, or si respectiv not.
Expresia "range of t is R" spune ca toate operatiile care urmeaza pana la o
redefinire a lui t se fac o data pentru fiecare tuplu al lui R cu t considerat acel tuplu
particular. Rezultatul este tiparirea unui tabel ce are in capat denumirile atributelor
A1,A2,...,Ar si apoi tuplurile selectate. Se poate schimba numele atributului daca in loc
de tim.Am se pune in retrive B=tim.Am si in acest caz apare B in locul lui Am.
Forma generala a lui retrive este
RETRIEVE [ UNIQUE ] [INTO tablou ] (lista-rezultat)
[ WHERE conditie ]
[ SORT BY campuri ]
cu lista rezultat continand (despartite prin virgule) atribuiri
[ nume-variabila = ] expresie
Exemplul 3.13. Prima cerere din exemplul 3.8 se poate exprima prin
range of t is CUMPARATORI
retrive (t.NUME)
where t.CONT < 0
iar a doua cerere se poate scrie
range of t is COMENZI
range of s is MAGAZINE
retrieve (s.NUMEMAG,s.MARFA,s.PRET)
where t.NUME = "Popescu Dan" and t.MARFA = s.MARFA
In limbajul QUEL se pot sterge tupluri cu succesiunea urmatoare
range of t is R
delete t
where @v(t)
care sterge din R toate tulurile t care fac adevarata formula @v.
Se pot adauga tupluri la o relatie cu o succesiune de forma
range of t1 is R1
.
.
.
range of tk is Rk
append to S(A1=w1,...,An=wn)
where @v(t1,...,tk)
care adauga relatiei S cate un tuplu pentru fiecare combinatie t1,...,tk ce face @v
adevarata, tuplul respectiv avand drept valori rezultatul evaluarilor expresiilor
w1,...,wn in care intervin componente ale tuplurilor si constante eventual legate prin
operatii aritmetice, pentru atributele A1,...,An, restul atributelor fiind nedefinite
(valoarea null).
Se pot modifica tupluri dintr-o relatie prin succesiuni de forma
range of t is R
replace t ( lista-rezultate )
[ where conditie ]
Exemplul 3.14. Pentru a adauga cate o comanda de 3 paini pentru toti
cumparatorii care au cont pozitiv se poate scrie succesiunea
range of t in CUMPARATORI
append to COMENZI(NR_COM=urmcom+
+,NUME=t.NUME,MARFA="paine",CANTITATE=3)
where t.CONT > 0
unde am presupus o variabila C urmcom ce contine valoarea urmatorului numar de
comanda ce se atribuie unei noi comenzi.
In QUEL nu sunt eliminate automat duplicatele la proiectie. Se poate face
eliminarea duplicatelor cu instructiunea sort care aseaza si in ordine lexicografica
tuplurile relatiei.
Exemplul 3.15. Listarea numelor magazinelor si a adreselor lor se face cu
succesiunea
range of t is MAGAZINE
retrieve into MAG(NUME=t.NUMEMAG,ADRESA=t.ADRESAMAG)
sort MAG
print MAG
la tiparire cele doua coloane fiind numite NUME si ADRESA.
range of j is COM
delete u
where u.MG=j.MG
sort MAGA
print MAGA
In limbajul QUEL se pot folosi functiile agregate count, avg, sum, min sau max
ele aplicandu-se expresiilor ce contin relatii unare, constante si operatori aritmetici.
Functiile agregat countu, avgu si sumu elimina duplicatele. Referirea functiilor agregat
se face prin
functie-agregat ( expresie [ WHERE conditie ] )
Se pot partitiona tuplurile unei relatii in raport de valorile uneia sau mai multor
expresii calculate si aplicand functiile agregat pentru fiecare grup de tupluri pentru care
s-au obtinut aceleasi valori prin calculele facute cu o expresie de forma
agregat(E by F1,F2,...,Fk)
unde E si F1,F2,...,Fk sunt expresii cu operanzi constante sau termeni t.A unde t este o
variabila tuplu si A un atribut. Aceasta expresie produce gruparea inregistrarilor relatiei
R parcursa de t in clase care dau aceleasi valori pentru expresiile F1,F2,...,Fk si pentru
fiecare clasa in parte se calculeaza functia agregat pentru valorile expresiei E pentru
fiecare din tuplurile clasei respective.
Exemplul 3.17. Tiparirea marfurilor cu pretul mediu al lor se poate face cu
urmatoarea succesiune:
range of m is MAGAZINE
retrieve into MAG(MARFA=m.MARFA,PM=avg(m.PRET by m.MARFA))
sort MAG
print MAG
1.2.4. Query-by-Example - limbaj de tip calcul relational pe domenii
Limbajul Query-by-Example (QBE) a fost proiectat de IBM, Yoktown Hts si
utilizat in produsul QMF. El este conceput pentru lucrul la terminal cu utilizarea unui
editor de texte pentru a exprima cererile. Utilizatorul poate sa afeseze pe ecran prin
comenzi unul sau mai multe schelete de tabele prin care isi defineste relatiile si
atributele relatiilor cu caracteristicile lor. Apoi se pot folosi tabelele construite pentru
exprimarea cererilor de interogare sau modificare a bazei de date prin intermediul
editorului de ecran. Fiecare linie completata intr-un tabel reprezinta un tuplu ce
parcurge relatia respectiva.
In cereri se folosesc variabile de domeniu si constante pentru a identifica tupluri
din relatiile ale caror schelete apar pe ecran. Cand se gaseste un tuplu sau o combinatie
de tupluri care indeplinesc conditiile specificate se tiparesc toate variabilele precedate
de operatorul P. si toate valorile atributelor care contin in dreptul lor un P., iar dasca in
prima coloana, care corespunde numelui relatiei, apare operatorul P. atunci sunt tiparite
toate valorile atributelor tuplului corespunzator.
Un schelet de relatie este ca cel din fig.3.1 format numai din linii sub forma
unui tabel, fara sa aiba inscris nimic in el si se obtine de obicei prin apasarea unei taste.
_____________________________________________________________________
________
nume relatie | atribut
| atribut
| atribut
|
_______________|__________________|___________________|
______________________|
[comenzi
| [mentiune
| [mentiune
| [mentiune
|
penturu
| caracterizare | caracterizare | caracterizare
|
tupluri]
| atribut]
| atribut]
| atribut]
|
|
|
|
|
Figura 3.1.
Afisarea unei relatii existente in baza de date se face scriind intr-un schelet de
relatie pe prima linie si in prima coloana numele relatiei respective urmata de
operatorul P. primindu-se ca raspuns pe prima linie atributele corespunzatoare relatiei
respective. Apoi in dreptul atributelor se pot pune constante care sunt siruri de
caractere sau variabile care sunt siruri de caractere precedate de semnul '_'. Pentru
variabile se folosesc de obicei drept nume un tip de valoare pe care ar putea sa il ia
variabila respectiva (de aici vine si numele limbajului - cerere prin exemplu). Domeniul
unei variabile este constituit din toate domeniile atributelor in care acea variabila apare
in toate relatiile de pe ecran.
Exemplul 3.18. A doua cerere din exemplul 3.8 se poate exprima in QBE dupa
cum se arata in fig.3.2. Mai intai s-au adus pe ecran cele doua relatii folosite punand in
doua schelete pe primul loc COMENZI P. si respectiv MAGAZINE P. dupa care se
complecteaza cate o linie in fiecare relatie dupa cum se vede in figura. Variabila
_portocale este folosita aici pentru a pune in corespondenta o marfa ceruta de Popescu
Dan cu marfa vanduta de un magazin. Daca cele doua valori coincid, se selecteaza din
relatia MAGAZINE tuplul asociat si se tiparesc din el valorile corespunzatoare pentru
numele magazinului, marfa si pretul de vanzare al marfii respective in acel magazin.
Tiparirea si a adresei magazinului se poate face fie introducand un P. in dreptul lui
ADRESAMAG, fie punand un P. in dreptul lui MAGAZINE si nu se mai mentioneaza
P. in alta coloana.
_____________________________________________________________________
________
COMENZI
| NR_COM
| NUME
| MARFA
| CANTITATE |
______________|_____________|_________________|______________|
_______________|
|
| Popescu Dan | _portocale |
|
|
|
|
|
|
_____________________________________________________________________
________
MAGAZINE
| NUMEMAG | ADRESAMAG
| MARFA
| PRET
|
______________|_____________|_________________|______________|
_______________|
| P.
|
| P._portocale | P.
|
|
|
|
|
|
Figura 3.2.
O cerere din calculul relational pe domenii exprimata printr-o expresie de forma
{a1a2...an | (@Eb1)(@Eb2)...(@Ebm)(R1(c11,...,c1k1)@A...@ARp(cp1,...,cpkp))}
unde fiecare cij este un al sau un bl sau o constanta si fiecare variabila de domeniu al si
bl apare cel putin o data ca un cij se poate exprima in QBE dupa cum urmeaza. Se
afiseaza scheletele relatiilor R1,...,Rp (nu neaparat distincte) si se creaza nume de
variabile pentru fiecare din ai si bj (de obicei numele exprima valori posibile pentru
variabila respectiva precedarte de '_'). Apoi, pentru fiecare termen Ri(ci1,...,ciki) se
creaza un tuplu ce contine pe pozitia j pe cij daca aceasta este o constanta si respectiv
variabila asociata daca cij este un al sau un bl. Campurile ce contin variabile ce nu mai
apar in alta parte pot fi lasate libere. Daca toate atributele al apar intr-un tuplu al unei
relatii se prefixeaza acele variabile cu P., altfel se construieste o relatie suplimentara
(fara nume) cu un tuplu ce contine comanda P. in prima coloana si numele asociate
variabilelor a1,...,an in celelalte coloane.
Exemplul 3.19. Pentru a tiparii numele persoanei, marfa comandata, cantitatea
comandata si contul la toate comenzile facute se poate obtine expresia din calculul
relational pe domenii
{a1a2a3a4 | (@Eb1)(@Eb2)
(CUMPARATORI(a1b1a4)@ACOMENZI(b2a1a2a3))}
iar in QBE se exprima dupa cum se vede in fig.3.3.
_____________________________________________________________________
_________
CUMPARATORI | NUME
| ADRESA
| CONT
|
________________|___________________|_________________________|
_______________|
| _Popescu
|
| _999
|
|
|
|
|
_____________________________________________________________________
_________
COMENZI
| NR_COM | NUME
| MARFA
| CANTITATE |
________________|____________|________________|_______________|
_______________|
|
| _Popescu
| _portocale | _88
|
|
|
|
|
|
_____________________________________________________________________
_________
|
|
|
|
|
________________|____________|________________|_______________|
_______________|
P.
| _Popescu | _portocale | _88
| _999
|
|
|
|
|
|
Figura 3.3.
Daca o comanda P. se gaseste in mai multe relatii, tiparirea valorilor
corespunzatoare se face in tablele separate in momentul cand se determina o
combinatie de tupluri care verifica toate conditiile date.
Pentru selectarea unor tupluri se pot folosi in diferite coloane expresii de forma
@0c unde @0 este un operator de comparatie aritmetica iar c este o constanta sau o
variabila de domeniu a carei valoare este definita in alta parte. De exemplu punand >=5
intr-o coloana sunt selectate acele tupluri din relatie care au valorile corespunzatoare
acelui atribut cel putin 5.
Exemplul 3.20. Tiparirea tuturor comenzilor de portocale avand cerute cantitati
mai mari decat cea comandata de Popescu Dan se exprima prin epresia din figura 3.4.
_____________________________________________________________________
_________
COMENZI
| NR_COM | NUME
| MARFA
| CANTITATE |
________________|____________|________________|_______________|
_______________|
|
| Popescu Dan | portocale | _x
|
P.
|
|
| portocale | > _x
|
|
|
|
|
|
Figura 3.4.
Pentru diferite campuri se pot defini si combinatii formate din parti constante si
parti variabile ce corespund subsirurilor ce nu sunt continute in partea constanta. De
exemplu Calea Unirii _99 poate constitui o adresa, selectandu-se tuplurile cu adresa in
Calea Unirii indiferent de nunar, acest numar devine valoarea curenta a variabilei _99 si
poate fi utilizat in alta parte unde apare din nou aceasta variabila.
Se poate nega un tuplu punand in prima coloana a lui semnul @!. Negarea unui
tuplu inseamna selectarea acelor tupluri din relatie pentru care nu sunt verificate
conditiile tuplului negat.
Exemplul 3.21. Pentru a tiparii pentru fiecare marfa care sunt comenzile cu cele
mai mari cantitati cerute se poate scrie cererea din figura 3.5.
_____________________________________________________________________
________
COMENZI
| NR_COM | NUME
| MARFA
| CANTITATE |
________________|____________|________________|_______________|
______________|
|
|
| _portocale | _x
|
P.
|
|
| _portocale | > _x
|
Figura 3.5.
In QBE se pot folosi operatorii agregati CNT., SUM., AVG., MIN. si MAX. Se
mai pot folosii operatorii ALL. pentru pastrarea duplicatelor unei relatii si UN. pentru
eliminarea duplicatelor. Multe operatii din QBE elimina automat duplicatele.
Exemplul 3.22. Numarul magazinelor se poate afla cu cererea din fig.3.6.
_____________________________________________________________________
________
MAGAZINE | NUMEMAG
| ADRESAMAG
| MARFA
| PRET
|
___________|_________________|__________________|________________|
___________|
| P.CNT.UN.ALL._x |
|
|
|
|
|
|
|
|
Figura 3.6.
Modificarea continutului unor relatii se poate face prin comenzile I. pentru
inserare tuplu D. pentru eliminare tuplu si U. pentru modificare tuplu care se pun in
prima coloana a tuplui din relatia unde se fac modificari. Pentru valorile
corespunzatoare unui tuplu cu comanda I. se creaza un nou tuplu in relatie cu valorile
date, cu comanda D. se elimina tuplurile care au valorile specificate iar cu comanda de
modificare U. se determina inregistrarea care trebuie modificata din atributele cheie si
se introduc in campurile specificate noile valori.
Exemplul 3.23. Daca la magazinul Unirea se pun in vanzare portocale cu 2000
lei kilogramul (presupunand ca deja apare adresa magazinului in baza de date cel putin
o data) aceasta se poate exprima ca in fig.3.7. Marirea preturilor cu 10% pentru toate
marfurile vandute de magazinul Unirea se poate face prin cerea din fig.3.8.
_____________________________________________________________________
_________
MAGAZINE | NUMEMAG
| ADRESAMAG
| MARFA
| PRET
|
___________|_________________|__________________|________________|
____________|
I.
| Unirea
| _adresa
| portocale
| 2000
|
| Unirea
| _adresa
|
|
|
|
|
|
|
|
Figura 3.7.
_____________________________________________________________________
_________
MAGAZINE | NUMEMAG
| ADRESAMAG
| MARFA
| PRET
|
___________|_________________|__________________|________________|
____________|
U.
| Unirea
|
| _portocale | _x * 1.1 |
| Unirea
|
| _portocale | _x
|
Figura 3.8.
Pentru fixarea unor conditii suplimentare de selectie a tuplurilor se poate folosi
casuta conditionala (condition box) in care se pot scrie expresii booleene ce trebuiesc
sa fie adevarate pentru a se selecta valorile variabilelor ce apar in ele. Aceste expresii
nu trebuie sa contina operatorul "not", in schimb se pot folosi AND sau & pentru "si",
respectiv OR sau | pentru "sau".
Exemplul 3.24. Listarea magazinelor care vand portocalele cu pret mai mare
decat se vand merele in Piata Chibrit dar mai ieftin decat dublul pretului perelor din
Piata Norilor se poate face prin cererea din fig.3.9.
_____________________________________________________________________
________
MAGAZINE | NUMEMAG
| ADRESAMAG
| MARFA
| PRET
|
____________|________________|__________________|________________|
___________|
| P.
|
| portocale
| _pretpo |
| Piata Chibrit |
| mere
| _pretme |
| Piata Norilor |
| pere
| _pretpe |
|
|
|
|
|
_______________________________
| CONDITIONS
|
|_______________________________|
| _pretpo > _pretme
|
| _pretpo < _pretpe * 2
|
|
|
Figura 3.9.
Sistemul QBE contine o lista numita tabelul director a tuturor numelor relatiilor
din baza de date impreuna cu atributele asociate lor si anumite informatii despre
atribute. Tabelul director poate fi folosit ca oricare alta relatie putandu-se face cu el
interogari, inserari sau stergeri. Daca intr-un schelet de relatie se scrie in prima linie si
prima coloana P._relname sau numai P. sunt listate toate numele relatiilor existente in
baza de date iar cu comanda P._relname P. se listeaza numele relatiilor si numele
atributelor asociate lor.
Inserarea unei noi relatii in baza de date se face cu comanda I.REL I. urmata de
scrierea pe primul rand a atributelor relatiei numita REL. Pentru atribute se declara
anumite proprietati si anume:
- KEY spune daca atributul este (Y) sau nu (N) component al unei chei;
- TYPE stabileste tipul atributului care poate fi CHAR pentru cuvant de
lungime variabila, CHAR(n) pentru cuvant de lungime n, FLOAT pentru
numere reale sau FIXED pentru numere intregi;
- DOMAIN da nume domeniilor atributelor folosite in gasirea eventualelor
erori prin aparitia unei variabile in atribute cu domenii diferite;
- INVERSION indica existenta (Y) sau inexistenta (N) unui index dupa
atributul respectiv.
Exemplul 3.25. Pentru a crea relatia MAGAZINE se poate completa un schelet
de tabel dupa cum se arata in fig.3.10.
_____________________________________________________________________
________
I.MAGAZINE I. | NUMEMAG
| ADRESAMAG
| MARFA
| PRET
|
_______________|_______________|_________________|______________|
____________|
KEY
I. | Y
|
N
| Y
| N
|
TYPE
I. | CHAR
| CHAR
| CHAR
| FLOAT |
DOMAIN I. | NUME
| ADRESE
| MARFURI
| BANI
|
INVERSION I. | N
|
N
| Y
| N
|
|
|
|
|
|
Figura 3.10.
Completitudinea limbajului QBE se poate demonstra relativ usor. Pentru a
calcula T = R U S unde T este o relatie noua se procedeaza ca in fig.3.11.
_____________________________________________________________________
________
R
|
|
|
|
|
______________|_____________|______________|___________________|
_____________|
| _a1 | _a2
|
...
| _an |
|
|
|
|
|
_____________________________________________________________________
________
S
|
|
|
|
|
______________|_____________|______________|___________________|
_____________|
| _b1 | _b2
|
...
| _bn |
|
|
|
|
|
_____________________________________________________________________
________
T
|
|
|
|
|
______________|_____________|______________|___________________|
_____________|
I. | _a1 | _a2
|
...
| _an |
I. | _b1 | _b2
|
...
| _bn |
|
|
|
|
|
Figura 3.11.
Pentru diferenta relatiilor R si S se procedeaza la fel ca in fig.3.11 cu singura
deosebire ca al doilea tuplu din relatia T va avea comanda D. in loc de I. Pentru
produsul cartezian al relatiilor R si S se definesc variabile _a1,...,_an in R si _b1,...,_bm
in S iar in T se pune un tuplu cu comanda I. ce cuprinde toate variabilele definite.
Proiectia relatiei R dupa atributele Ai1, ..., Aik se face definind variabilele _a1,...,_ak in
GATA
lipsa) sau descrescator prin DESC. Campurile se pot indica atat prin nume cat si prin
numarul ce indica pozitia lor in tabel. Se pot folosi functiile agregate COUNT, SUM,
AVG, MAX si MIN care se pot aplica relatiilor unare avand ca rezultat numarul,
suma, media, cel mai mare si respectiv cel mai mic element din cele carora li s-a aplicat
functia respectiva cu eliminarea duplicatelor daca functia este precedata de DISTINCT.
Functiile agregate se pot aplica unor grupe de elemente indicate prin GROUP BY si
eventual selectate prin conditia din HAVING.
In conditiile din instructiunea SELECT pot fi utilizate si constructii de forma:
camp LIKE cuvant
camp NOT LIKE cuvant
camp IS NULL
camp IS NOT NULL
unde camp este de tip cuvant si cuvant poate sa contina caracterele "_" care inlocuieste
orice caracter, "%" inlocuieste orice cuvant si orice alt caracter este luat ca atare.
Rezultatul este o valoare de adevar dupa cum camp contine o valoare sir de caractere
ce se conformeaza modului de alcatuire din cuvant sau nu respectiv contine sau nu
valoarea null. Se pot folosi de asemenea IN sau NOT IN pentru a indica apartenenta
sau neapartenenta la o multime, EXISTS sau NOT EXISTS pentru a verifica existenta
sau inexistanta unui element intr-o multime
si se poate aplica UNION intre doua selectii pentru a realiza reuniunea.
Exemplul 3.13. A doua cerere din exemplul 3.7 se poate scrie in SQL
SELECT UNIQUE NUMEMAG,MARFA,PRET
FROM MAGAZINE
WHERE MARFA IN
SELECT MARFA
FROM COMENZI
WHERE NUME = 'Popescu Dan'
Se pot atribui nume unor tupluri ale unor relatii folosite ca variabile libere ce
pot fi utilizate in celelalte parti componente ale cererii. De exemplu
SELECT ... FROM R T WHERE ...
da numele T unui tuplu al relatiei R, acest nume putand fi folosit dupa SELECT sau
dupa WHERE, T.A semnificand valoarea componentei A a tuplului T.
Exemplul 3.14. A treia cerere din exemplul 3.7 se poate scrie in SQL
SELECT NUMEMAG
FROM MAGAZINE M
WHERE
(SELECT MARFA
FROM MAGAZINE
WHERE NUMEMAG = M.NUMEMAG)
CONTAINS
(SELECT MARFA
FROM COMENZI
WHERE NUME = 'Popescu Dan')
Daca dupa FROM apare o lista de relatii R1,R2,...,Rn, se considera toate
combinatiile de tupluri t1,t2,...,tn cu ti din Ri si pentru acele combinatii ce indeplinesc
conditiile ce urmeaza dupa WHERE se include la iesire lista componentelor specificate
dupa SELECT. Aparitia unei stelute dupa SELECT indica selectarea tuturor atributelor
si lipsa lui WHERE indica o conditie mereu adevarata deci sunt selectate toate
tuplurile.
Exemplul 3.15. A doua cerere din exemplul 3.7 se mai poate scrie
SELECT NUMEMAG,MAGAZINE.MARFA,PRET
FROM MAGAZINE,COMENZI
WHERE NUME = 'Popescu Dan' AND MAGAZINE.MARFA =
COMENZI.MARFA
Pentru a demonstra completitudinea limbajului SQL vom arata cum se pot
exprima operatiile de baza din algebra relationala in acest limbaj.
Reuniunea relatiilor R si S se exprima cu
(SELECT *
FROM R)
UNION
(SELECT *
FROM S)
Diferenta relatiilor R si S se exprima la fel ca reuniunea inlocuind cuvantul
UNION cu cuvantul MINUS.
Produsul cartezian al relatiilor R si S se exprima cu
SELECT *
FROM R,S
Proiectia lui R dupa atributele A1,A2,...,Ak se exprima cu
SELECT UNIQUE A1,A2,...,Ak
FROM R
Selectia din relatia R cu conditia F se exprima cu
SELECT *
FROM R
WHERE F
Se poate atribui un nume R relatiei rezultate ca o cerere precedand acea cerere
cu
ASSIGN TO R:
REFERENCES MARFA ) ;
DELETE
FROM tabel
[ WHERE conditie ] ;
INSERT
INTO tabel [ ( camp [, camp ] ... ) ]
VALUES ( valoare [, valoare ] ... ) ;
sau
INSERT
INTO tabel [ ( camp [, camp ] ... ) ]
subconditie ;
2.2. SQL programabil
In cazul utilizarii comenzilor SQL in programele scrise in diferite limbaje de
programare se aplica reguli suplimentare cum sunt urmatoarele:
- Toate instructiunile executabile din SQL interpretabil pot fi utilizate si in
SQL programabil.
- Instructiunile SQL sunt precedate de EXEC SQL si se termina printr-un simbol
special de terminare (de exemplu ';').
- Poate sa apara o instructiune executabila SQL ori de cate ori poate sa apara o
instructiune executabila din limbajul gazda.
- In instructiunile SQL pot fi incluse referinte la variabile din programul
gazda precedate de ':' pentru a le deosebi de numele SQL.
- Tabelele utilizate trabuiesc declarate in program prin instructiuni DECLARE
TABLE specifice limbajului.
- Dupa executarea unei instructiuni SQL se intoarce in program informatie intr-o
arie de comunicatie SQL (SQLCA) care printre altele are indicatorul SQLCODE ce
ce contine valoarea zero daca instructiunea s-a efectuat corect, o valoare
pozitiva indica o atentionare dupa executie si o valoare negativa indica o
eroare si o executie incompleta. Instructiunea EXEC SQL INCLUDE SQLCA
include
aria de comunicare SQL in program.
- Trebuie sa existe concordanta intre tipul variabilelor din program si tipul
datelor din baza de date implicate de ele.
- Pot sa existe variabile in program ce au nume ce sunt si nume de coloane in
baza de date.
3. Modelul retea
Modelul retea este cel mai apropiat de forma de reprezentare a bazelor de date
sub forma diagramelor entitate-relatie. Deosebirea consta doar in faptul ca toate
relatiile ce apar pot fi numai binare si de tipul unu-la-unu sau unu-la-mai-multi. Aceasta
restrictie permite reprezentarea grafica a unei baze de date de tip retea sub forma unui
graf directionat numit retea. In retea nodurile corespund entitatilor si relatiile sunt
reprezentate prin sageti intre noduri de la tata la fiu si anume sageti simple daca relatia
este de tipul unu-la-unu si sageti duble daca relatia este de tipul unu-la-mai-multi.
In modelul retea entitatilor le corespund fisiere logice care au drept campuri
atributele entitatii si eventuale campuri de legatura pentru relatii. Fiecarui element al
entitatii ii corespunde o inregistrare logica. Daca inregistrarile sunt identificate numai
prin relatia cu alte entitati atunci se mai adauga la inregistrarea logica inca un camp ce
cuprinde un numar de ordine care permite identificarea acelor inregistrari.
Reprezentarea unei relatii R pe mai multe entitati E1,E2,...,Ek se realizeaza
prin introducerea unei noi entitati S care sa aiba drept elemente tupluri de forma
(e1,e2,...,ek) corespunzatoare elementelor relatiei R si eventual un numar de ordine
pentru identificare si alte atribute asociate si adaugand cate o relatie de tipul unu-lamai-multi de la Ei (i=1,...,k) la S. Acest procedeu se poate aplica si pentru
transformarea relatiilor binare de tipul mai-multi-la-mai-multi.
Operatiile cele mai frecvente pentru modelul retea se impart in doua categorii:
cautarea unor elemente ale unor entitati cu anumite proprietati (proces similar cu
cautarea din modelul relational) sau cautarea unor informatii prin utilizarea legaturilor
intre entitati. Cea de-a doua operatie se numeste navigare.
4. Modelul ierarhic (arborescent)
CAPITOLUL AL IV-LEA
SISTEME DE GESTIUNE A BAZELOR DE DATE (SGBD)
1. SGBD INGRES
Sistemul INGRES (INteractive Graphics and REtrieval System) a
fost proiectat la universitatea Berkeley din Californiua si floseste
2. SGBD SYSTEM R
System R este un sistem de baze de date relationale construit
de IBM, San Jose. In acest sistem relatiile pot fi imbricate una in
alta tinand sema de relatii de forma unu-la-mai-multi sau se pot
construi structuri multilista ce conecteaza tupluri a doua relatii si
se pot crea indexi pe diferite multimi de atribute care sunt
3. SGBD ORACLE
Sistemul ORACLE este un SGBD de tip relational construit in
1979 de Oracle Corporation si avand ulterior ca interfata limbajul de
cereri SQL. El contine o interfata cu limbajul gazda, un generator de
aplicatii, un generator de rapoarte, un procesor de texte si altele.
Generatorul de aplicatii este bazat pe dialogul de tip intrebareraspuns permitand introducerea si validarea datelor, aplicatii de
cereri si reactualizari. Generatorul de rapoarte permite editarea
rapoartelor pe baza informatiilor continute in baza de date. Se pot
folosi parametrii predefiniti ce se pot schimba ulterior. Astfel se
pot construi prototipuri si transforma in timp daca este nevoie.
Procesorul de texte permite integrarea textelor in grafice si
rapoarte la iesire.
4. SGBD dBASE
5. SGBD DBTG
Un sitem de baze de date pentru modelul retea a fost pus la
punct de Data Base Task Group (DBTG) care a propus o notare formala
pentru retele prin limbajul de definire a datelor (DDL) si pentru
vederi (Subschema DDL) si limbajul de prelucrare a datelor (DML) cu
ajutorul caruia pot fi scrise programe pentru aplicatii.
Notiunea utilizata pentru reprezentarea legaturilor de tipul
unu-la-mai-multi este set. Daca m este o relatie unu-la-mai-multi de
la entitatea E1 la entitatea E2 pentru fiecare element e a lui E1 vom
nota cu Se multimea tuturor elementelor din E2 care sunt in relatia m
cu e. Evident ca pentru orice e1<>e2 multimite Ee1 si Ee2 sunt
disjuncte. Multimea tuturor perechilor (Se,e) cu e din E1 formeaza un
set. Pentru fiecare pereche (Se,e) e este proprietarul setului si
orice component al multimii Se se numeste elementul setului. In
general se spune despre E1 ca este proprietar si E2 este element in
cadrul setului. O restrictie facuta de DBTG pentru seturi este ca
proprietarul si elementul sa fie distincte.
Exemplul 4.1. Considerand entitatile MAGAZINE, CUMPARATORI si
COMENZI se poate descrie baza de date asociata cu urmatoarele
instructiuni:
RECORD MAGAZIME
1 NUMEMAG CHAR(20),
1 ADRESAMAG CHAR(30);
RECORD MARFA
1 NUMEMAR CHAR(15);
RECORD PRETURI
1 PRET REAL,
1 NUMEMAR
SOURCE
1 NUMEMAG
SOURCE
VIRTUAL
IS MARFA.NUMEMAR OF OWNER OF MARPR
VIRTUAL
IS MAGAZINE.NUMEMAG OF OWNER OF MAGPR;
RECORD CUMPARATORI
1 NUME CHAR(20),
1 ADRESA CHAR(30),
1 CONT REAL;
RECORD COMENZI
1 NR_COM INTEGER,
1 CANTITATE REAL;
DBTG SET MAGPR
OWNER IS MAGAZINE
MEMBER IS PRETURI;
DBTG SET MARPR
OWNER IS MARFA
MEMBER IS PRETURI;
DBTG SET MARCOM
OWNER IS MARFA
MEMBER IS COMENZI;
DBTG SET CUMCOM
OWNER IS CUMPARATORI
MEMBER IS COMENZI;
Exemplul anterior arata cum sunt descrise entitatile si
relatiile in DBTG prin DDL. Descrierea entitatilor se face prin
instructiunea RECORD urmata de descrierea atributelor structurate ca
in COBOL sau PL/I si descrierea relatiilor cu instructiunea DBTG SET
urmata de indicarea proprietarului (OWNER IS) si a elementului
(MEMBER IS). Pentru evitarea unor redondante se pot folosi campuri
virtuale care se inlocuiesc prin pointeri la elementele respective
din alte entitati sau la relatii care dau elemntele respective.
In vederi este permisa folosirea altor nume pentru
inregistrari, campuri sau seturi. In vederi se pot elimina unele
campuri, tipuri de inregistrari sau seturi dar nu se pot adauga
altele noi. Deci vederile in general sunt subscheme ale schemei
logice a bazei de date.
Implementarea relatiilor unu-la-mai-multi se face prin liste
circulare simplu sau dublu inlantuite in care capatul listei este un
proprietar si toate elementele corespunzatoare acestui proprietar
apar in lista. In acest caz in implementarea entitatilor se prevede
un camp suplimentar de pointer pentru fiecare relatie din care face
parte entitatea respectiva. O alta varianta de implementare a
relatiilor unu-la-mai-multi este folosirea inregistrarilor de lungime
variabila ce contin cate un proprietar impreuna cu elementele
asociate lui.
Indicatii privind modul de reprezentare fizica al entitatilor
pot fi date prin instructiunea LOCATION MODE care poate sa aiba una
din formele:
LOCATION MODE IS CALC <procedura> USING <lista campuri>
end
end LOOP
Pentru efectuarea operatiilor de inserare, stergere si
modificare sistemul are instructiuni speciale. Pentru ca
inregistrarea inserata sa fie introdusa si in ocurenta curenta a unui
set la descrierea setului trebuie sa se adauge declararea
INSERTION IS AUTOMATIC
Pentru inserarea unei inregistrari mai intai se formeaza acea
inregistrare intr-o formatare corespunzatoare T si apoi se aplica
comanda
STORE <tip inregistrare>
care face acesta inregistrare inregistrarea curenta pentru tipul
respectiv de inregistrare si pentru toate seturile in care acest tip
de inregisrare este un element si pentru care insertia a fost
declarata automatic. Alegerea ocurentei in care se insereaza o
inregistrare intr-un set se face printr-un criteriu dat la descrierea
setului cu o instructiune de forma
SET SELECTION IS THRU CURRENT OF <nume set> SET
daca ocurenta este stabilita prin program inainte de inserare sau
SET SELECTION IS THRU OWNER USING <lista campuri>
daca ocurenta este stabilita prin determinarea proprietarului cu
cheie CALC sau alte variante asemanatoare.
Exemplul 4.10. Daca vrem sa inseram o inregistrare in COMENZI
si sa se faca inserarea automat si in seturile MARCOM si CUMCOM.
Presupunand ca pentru CUMPARATORI cheia CALC este NUME, putem sa
folosim numele persoanei pentru a selecta ocurenta in setul CUMCOM
introducand in declararea setului CUMCOM
SET SELECTION IS THRU OWNER USING NUME
in declaratia setului MARCOM se poate pune ceva asemanator sau
declaratia
SET SELECTION IS THRU CURRENT OF MARCOM SET
si apoi se plaseaza in ambele seturi declaratia
INSERTION IS AUTOMATIC
Cu modificarile de mai sus inserarea unei comenzi cu reactualizarea
seturilor se poate face cu secventa de instructiuni urmatoare:
read N,M,C /* citeste nume, marfa, cantitate */
URMCOM := URMCOM + 1
CUPARATORI.NUME := N
MARFA.NUMEMAR := M
FIND MARFA RECORD USING CALC-KEY
COMENZI.NR_COM := URMCOM
COMENZI.CANTITATE := C
STORE COMENZI
6. SGBD IMS
In sistemul de tip ierarhic IMS (Information Management
System/Virtual Storage), construit de IBM pentru sisteme de operare
MVS in 1968, descrierea datelor se face asemanator cu modul de
descriere a datelor in sistemul de tip retea DBTG. Se definesc doua
tipuri de elemente: descrieri ale bazei de date (DBD) si blocuri de
comunicare program (PCB).
Declararea arborilor se face prin instructiuni de forma
TREE <nume> <lista de tipuri de inregistrari>
Tipurile de inregistrari se declara prin instructiunea
RECORD <nume> <informatii>
Informatiile pot fii campuri date prin numar de nivel, nume, tip si
eventual lungime, pot indica pozitionarea tipului de inregistrare in
arborele in care apare fie sub forma de radacina indicata prin ROOT
fie sub forma de fiu al unui tata indicat prin
PARENT = <nume tata>
sau desemnarea virtuala a unui tip de inregistrare
VIRTUAL <nume inregistrare> IN <nume arbore>
indicand unde se afla de fapt informatia corespunzatoare sau
declararea unor pointeri de tipul
POINTER = <lista de tipuri de pointeri>
dintre care cel mai des utilizata este declaratia
POINTER = PARANT
ANGAJAT(NR_AN,NUMEAN,ADRAN,SALARIU)
CLIENTI(NUMEC,ADRC)
care se poate descrie prin urmatoarea succesiune de instructiuni
TREE AGENTIE
RECORD REGIUNI ROOT
1 NUMER CHAR(20)
RECORD OFICII PARENT=REGIUNI
1 ORAS CHAR(20)
1 ADROF CHAR(30)
RECORD AGENTI PARENT=OFICII
1 NUMEA CHAR(20)
1 VANZARI INTEGER
RECORD ANGAJAT PARENT=OFICII
1 NR_AN INTEGER
1 NUMEAN CHAR(20)
1 ADRAN CHAR(30)
1 SALARIU INTEGER
RECORD OFERTE PARENT=OFICII
1 ADROF CHAR(30)
1 PRET INTEGER
RECORD CLIENTI PARENT=AGENTI
1 NUMEC CHAR(20)
1 ADRC CHAR(30)
Pentru acesta baza de date instructiunea
GET LEFTMOST AGENTI WHERE VANZARI > 10000000
determina primul agent in ordinea de la stanga la dreapta care are
vanzari peste 10000000 lei. Obtinerea unui agent din oficiul Craiova
care sa indeplineasca aceeasi conditie se face cu instructiunea
GET LEFTMOST AGENTI WHERE ORAS="Craiova" AND VANZARI > 10000000
Se poate citi numele regiunii si al orasului pentru care se
doreste o informatie dupa cum urmeaza:
read REG,OF
GET LEFTMOST AGENTI WHERE NUMER=REG AND ORAS=OF AND VANZARI >
10000000
unde se presupune ca REG si OF au fost declarate ca variabile de
lucru.
Determinarea urmatorului element se face prin inlocuirea
cuvantului LEFTMOST cu cuvantul NEXT in instructiunea GET.
Exemplul 4.17. Pentru determinarea tuturor agentilor cu vanzari
de peste 10000000 din baza de date anterioara se poate folosi
succesiunea de instructiuni
GET LEFTMOST AGENTI WHERE VANZARI > 10000000
while !FAIL do
print AGENTI.NUMEA
GET NEXT AGENTI WHERE VANZARI > 10000000
Parcurgerea tuturor descendentilor unui nod dat se poate obtine
aplicand repetat instructiunea
GET NEXT WITHIN PARENT
7. Alte SGBD-uri
CURSUL 9
CAPITOLUL AL V-LEA
CONSTRUIREA UNEI BAZE DE DATE
tuturor atributelor A astfel incat X -> A se deduce din F aplicand axiomele lui
Armstrong.
Lema 5.4. X -> Y rezulta din axiomele lui Armstrong daca si numai daca
Y C X\+.
Demonstratia rezulta din definitii si aplicand lema 5.3.
Teorema 5.1. Axiomele lui Armstrong sunt corecte si complete.
Demonstratie. Corectitudinea este data de lema 5.1. Fie F o multime de
dependente pe multimea de atribute U si sa presupunem ca X -> Y este dedusa logic
din F dar nu poate fi obtinuta prin axiome. Consideram relatia r care are doua tupluri
ce au aceleasi valori pe campurile din X\+ si valori distincte pe celelalte campuri. Sa
aratam ca r satisface dependentele din F. Fie V -> W o astfel de dependenta. Daca V nu
este inclus in X\+ conditia este evident indeplinita deoarece nu exista in r doua tupluri
cu valori egale pentru atributele lui V. Daca V C X\+ rezulta conform lemei 5.4 ca X ->
V si cum V -> W rezulta prin tranzitivitate ca X -> W si cum pe X cele doua tupluri ale
lui r au aceleasi valori rezulta ca ele au aceleasi valori si pe campurile lui W ceea ce
demonstraza ca r verifica si in acest caz V -> W. Cum X -> Y este dedusa logic din F
rezulta ca este verificata de r si cum X C X\+ rezulta ca cele doua tupluri ale lui r au
valori comune pentru atributele lui X deci ele trebuie sa aiba valori comune si pentru
atributele lui Y ceea ce dovedeste ca Y C X\+ dar tinand seama de ipoteza si de lema
5.4 se ajunge la o contradictie.
Faptul ca orice dependenta obtinuta din F aplicand axiomele lui Armstrong este
dedusa logic din F se demonstraza prin inductie dupa lungimea "demonstratiei"
dependentei respective aplicand lema 5.1.
Pentru a decide daca o dependenta X -> Y poate fi dedusa logic din F este
suficient sa calculam X\+ si sa vedem conform lemei 5.4 daca Y C X\+ sau nu. Calculul
lui X\+ se poate face relativ simplu folosind algoritmul urmator.
Algoritmul 5.1. Fie X o multime de atribute si F o multime de dependente
functionale.
1. Se face X\(0) = X si i = 0.
2. Daca exista in F o dependenta V -> W cu V C X\(i) si W @C/ X\(i)
atunci se face X\(i+1) = X\(i) U W; i = i+1 si se reia punctul 2;
altfel STOP (X\+ = X\(i)).
Exemplul 5.3. Fie X = BD si F avand urmatoarele dependente functionale
1) AB -> C 2) C -> A 3) BC -> D 4) ACD -> B
5) D -> EG 6) BE -> C 7) CG -> BD 8) CE -> AG
Aplicand algoritmul 5.1 se obtine mai intai X\(0) = BD, apoi folosind
dependenta 5) X\(1) = BDEG, apoi folosind dependenta 6) X\(2) = BCDEG si
folosind dependenta 2) se obtine X\(3) = ABCDEG pentru care nu mai sunt indeplinite
conditiile din pasul doi si algoritmul se termina. Deci (BD)\+ = ABCDEG.
a1
b12 b13 a4
b15
a1
a2
b23
b24
b25
b31
a2
b33
b34
a5
b41
b42
a3
a4
a5
a1
b52
b53
b54
a5
Se poate folosi A -> C pentru a identifica pe b23 si b53 cu b13 si apoi B -> C pentru a
identifica b33 cu b13. Se foloseste C -> D pentru a identifica b24, b34 si b54 cu a4,
apoi se foloseste DE -> C pentru a identifica b13 cu a3 si, in sfarsit se foloseste CE ->
A pentru a identifica b31 si b41 cu a1 obtinandu-se tabelul urmator:
R1
R2
R3
R4
R5
a1
a1
a1
a1
a1
b12
a2
a2
b42
b52
a3
a3
a3
a3
a3
a4
a4
a4
a4
a4
b15
b25
a5
a5
a5
care avand al treilea rand numai cu simboluri a dovedeste ca descompunerea data este
fara pierderi la uniune.
Teorema 5.3. Algoritmul 5.2 determina corect daca o descompunere este fara
pierderi la uniune.
S1,...,Sm se poate reconstitui proiectia ri a unei relatii r dupa ri si apoi din r1,...,rk se
poate reconstitui r.
Lema 5.9. Fie R, F si @r ca in lema 5.8 si fie @t = {R1,...,Rk,Rk+1,..., Rn} o
descompunere a lui R in scheme relationale care le contine pe cele din @r. Atunci @t
este de asemenea fara pierderi la uniune in raport cu F.
Demonstratia acestei proprietati se face folosind asociativitatea operatiei de
uniune naturala, si deoarece proiectiile unei relatii r pe R1,..., Rk acopera pe r facand
uniunea naturala cu celelalte proiectii se obtine cel mult o submultime a lui r insa din
lema 5.7 rezulta si incluziunea pe dos de unde rezulta ca descompunerea este fara
pierderi la uniune.
Spunem ca descompunerea @r = {R1,R2,...,Rk} a schemei relationale R
pastreaza dependentele F daca si numai daca dependentele lui F se deduc logic din
reuniunea dependentelor @P/Ri(F) cu i = 1,2,...,k.
O descompunere poate sa pastreze dependentele dar sa nu fie fara pierderi la
uniune. Un exemplu este relatia R = ABCD cu dependentele F = {A -> B ,C -> D} si
descompunerea @r = {AB, CD}.
De asemenea o descompunere poate sa fie fara pierderi la uniune dar sa nu
pastreze dependentele dupa cum se vede din exemplul urmator.
Exemplul 5.7. Fie R = ABC cu dependentele F = {AB -> C, C -> A}.
Descompunerea lui R in AC si BC este fara pierderi la uniune deoarece
(AC @O BC) -> (AC - BC)
si se aplica teorema 5.4. Proiectia lui F pe BC da numai dependentele triviale si pe AC
da C -> A si cele triviale dar acestea nu determina logic pe AB -> C deci
descompunerea nu este cu pastrarea dependentelor.
Se poate testa daca o descompunere este sau nu cu pastrarea dependentelor
intr-un timp polinomial in raport cu dimensiunea lui F folosind algoritmul urmator.
Algoritmul 5.3. Fie R o schema relationala, F o multime de dependente
functionale si @r = {R1,R2,...,Rk} o descompunere a lui R.
Se defineste G = F1 U ... U Fk unde Fi = @P/Ri(F), i=1,2,...,k. Pentru fiecare
dependenta functionala X -> Y a lui F se testeaza daca este in G\+ in felul urmator: se
pleaca cu Z = X si atata timp cat mai apar modificari se calculeaza pentru fiecare
i=1,2,...,k Z = Z U ((Z @O Ri)\+ @O Ri) inchiderea fiind luata in raport cu F. Daca in
final Y C Z atunci dependenta poate fi dedusa logic din G, altfel nu. Daca proprietatea
este valabila pentru toate dependentele din F atunci descompunerea este cu pastrarea
dependentelor, altfel descompunerea este fara pastrarea dependentelor.
Exemplul 5.8. Fie R = ABCD, F = {A -> B, B -> C, C -> D, D -> A} si
descompunerea @r = {AB, BC, CD}. Se vede ca primele trei dependente ale lui F se
gasesc chiar in G deci mai ramane de vazut daca si D -> A poate fi dedusa logic din G.
Se pleaca cu Z = D si se obtine succesiv Z = D U ((D @O (AB))\+ @O AB) =D
GATA
Teorema 5.6. (Beeri-Fagin-Howard) Axiomele A1-A8 sunt corecte si complete
pentru dependentele functionale si multivaloare in sensul ca daca D este o multime de
dependente functionale si multivaloare pe multimea atributelor U si D\+ este multimea
dependentelor functionale si multivaloare ce se deduc logic din D (satisfacute de orice
relatie care satisface dependentele din D), atunci elementele lui D\+ sunt elementele
obtinute din D aplicand de un numar finit de ori axiomele A1-A8.
Demonstratia se face plecand de la definitii in mod asemanator cu demonstratia
teoremei 5.1.
Din axiomele A1-A8 se pot deduce si alte reguli dintre care cele mai des
utilizate sunt cele din lema urmatoare pe care le dam fara demonstratie.
Lema 5.10. Sunt adevarate urmatoarele reguli de inferenta:
B1. (reuniune dependente multivaloare) {X ->> Y, X ->> Z} |= X ->> YZ.
B2. (pseudotranzitivitate dependente multivaloare)
{X ->> Y, WY ->> Z} |= WX ->> (Z - WY).
B3. (pseudotranzitivitate mixta) {X ->> Y, XY -> Z} |= X -> (Z - Y).
B4. (descompunere dependente multivaloare)
{X ->> Y, X ->> Z} |= {X ->> (Y @O Z), X ->> (Y - Z), X ->> (Z - Y)}.
Teorema 5.7. Daca U este multimea tuturor atributelor atunci se poate
determina o partitie a multimii U - X in multimile de atribute Y1,Y2,...,Yk astfel incat
pentru orice Z inclus in U - X, X ->> Z daca si numai daca Z se poate scrie ca o
reuniune de multimi Yi1,Yi2,...,Yin.
Demonstratie. Se incepe cu multimea U - X. Sa presupunem ca la un moment
dat am determinat multimile W1,...Wm care formeaza o partitie a lui U - X si astfel
incat X ->> Wi, i=1,...,m. Daca exita o dependenta multivaloare X ->> Z si Z nu este
reuniunea unora din elementele W1,...,Wm, se inlocuieste in sirul dat fiecare Wi cu
multimile Wi @O Z si Wi - Z cand acestea sunt nevide. Din legea de descompunere
rezulta ca X ->> (Wi @O Z) si X ->> (Wi - Z) si este usor de vazut ca sirul obtinut
este tot o partitie a lui U - X. Numarul finit al atributelor asigura terminarea procesului
de diviziune intr-un numar finit de pasi si regula reuniunii asigura ca orice reuniune de
elemente din sir depinde multivaloare de X ceea ce demonstreaza teorema.
Multimea Y1,Y2,...,Yk construita prin procedeul din demonstratia teoremei
precedente se numeste baza de dependente a lui X in raport cu D.
a1a2...an este un tuplu de simboluri se defineste h(s) ca fiind cuvantul obtinut prin
concatenare h(a1)h(a2)...h(an). Daca s1s2..sk este o multime de tupluri cu simboluri
din S si t1t2...tm este o multime de tupluri cu simboluri din T vom spune ca exista o
aplicatie de simboluri de la prima multime de tupluri la a doua multime de tupluri daca
si numai daca exista o aplicatie de simboluri h de la S la T astfel incat pentru orice i sa
existe un j cu h(si)=tj.
Exemplul 5.12. Fie A = {abc, ade, fbe} si B = {xyz, wyz}. Exista mai multe
aplicatii de simboluri de la A la B. De exemplu aplicatia h cu h(a) = h(f) = x, h(b) =
h(d) = y si h(c) = h (e) = z are drept imagine pentru toate trei elementele lui A
elementul xyz din B. Aplicatia g(a) = x, g(b) = g(d) = y, g(c) = g(e) = z si g(f) = w
transforma abc si ade in xyz si pe fbe in wyz. Nu exista o aplicatie de simboluri care sa
duca abc in xyz si ade in wyz daca x si w sunt simboluri distincte deoarece in acea
aplicatie lui a i s-ar asocia atat x cat si w ceea ce nu este posibil.
O relatie r satisface o dependenta generalizata (t1,...,tn)/t daca pentru orice
aplicatie de simboluri h de la multimea tuplurilor din ipoteza dependentei generalizate
la r se poate extinde h la orice sibol unic din t astfel incat h(t) sa apartina lui r. Analog,
spunem ca r satisface dependenta generalizata (t1,...,tn)/a=b daca pentru orice aplicatie
de simboluri h de la ipoteza la r sa aiba loc egalitatea h(a) = h(b).
Exemplul 5.13. Fie d dependenta din fig. 5.1.a si relatia r din fig. 5.1.b.
Deoarece in prima coloana a tuplurilor din ipoteza figureaza acelesi simbol a1 rezulta
ca aplicatia de simboluri trebuie sa transforme tuplurile din ipoteza in tupluri care sa
aiba pe primul loc aceleasi valori. Daca se ia h(a1) = 5 rezulta ca ambele tupluri sunt
duse in tuplul 514 al lui r si deci h(b1) = h(b2) = 1 si h(c1) = h(c2) = 4 care se poate
extinde luand h(a2) = 5 obtinand h(a2b1c2) = 514 care este un tuplu din r. Daca h(a1)
= 0, o aplicatie de simboluri transforma cele doua tupluri din ipoteza in multimea
primelor trei tupluri ale lui r si deci h(b1) este 1 sau 3 si h(c2) este 2 sau 4 dar pentru
combinatiile 12, 32 si 34 se poate lua h(a2) = 0 si pentru combinatia 14 se poate lua
h(a2) = 5 obtinand de fiecare data pentru h(a2b1c2) un tuplu al lui r.
Deci r satisface d.
a)
a1
b1
c1
a1
b2
c2
__________________
a2
b1
c2
b)
0
0
5
1
3
0
1
2
4
3
4
Figura 5.1.
Fie dependenta d = (s1,...,sk)/a=b si o relatie r = {t1,...,tm}. Spunem ca se
poate aplica d la r daca exista o aplicatie de simboluri h de la multimea s1s2...sk la
multimea t1t2...tm. Efectul aplicarii lui d la r folosind aplicatia de simboluri h este
obtinut prin identificarea simbolurilor h(a) si h(b) ori de cate ori apar in r.
Pentru dependente d = (s1,...,sk)/s se aplica d la r folosind aplicatia de
simboluri h adaugand la r tuplul h(s). Pentru fiecare simbol unic c din s se creaza un
simbol care nu mai apare in r si se defineste h(c) noul simbol creat.
Exemplul 5.14. Aplicarea dependentei generalizate (abc,ade,fbe)/a=f la relatia r
= {xyz,wyz} folosind aplicatia de simboluri g din exemplul 5.12 cu g(a) = x si g(f) = w
a2
a3
b3
c3
d4
b3
c4
d5
__________________________
d4 = d5
b) B -> D
a4
b4
c5
d6
a4
b5
c6
d7
__________________________
a4
b6
c5
d7
c) A ->> C|D
Figura 5.2.
anumit tip se numeste normalizare. Primele trei forme normale au fost definite de Codd
iar a patra si a cincia forma normala au fost definite de Fagin.
Principalele scopuri urmarite in procesul de normalizare sunt: eliminarea unor
redondante, evitarea unor anomali de reactualizare, producerea unui proiect care sa
reprezinte cat mai fidel modelul real (usor de inteles si eventual de modificat), stabilirea
unor constrangeri de integritate simple si altele.
2.1. Prima forma normala (1NF)
Se spune ca o relatie este in prima forma normala (1NF) daca fiecarui atribut ii
corespunde o valoare indivizibila (atom), deci orice valoare nu poate fi o multime sau
un tuplu cu valori in anumite domenii, nu pot sa apara grupuri repetitive.
De exemplu, pentru o relatie in prima forma normala care contine atributul
DATA se considera valoarea asociata sub forma zz-ll-aa fara a se putea descompune
dupa ziua, luna sau anul corespunzator valorii respective.
Relatiile in prima forma normala pot fi vizualizate sub forma de tabele, permit o
referire simpla a datelor prin indicarea numelui tabelului, a coloanei sau atributului si a
chei tuplului din care face parte informatia respectiva (adresare de tip sistem de
coordonate), operatorii pentru aceste relatii sunt mai simpli si in numar mai mic si
permit definirea unor tehnici de proiectare si utilizare a bazelor de date.
2.2. A doua forma normala (2NF)
Fie R o schema relationala si A un atribut din R. Vom spune ca A este un atribut
prim al lui R daca A apare in cel putin o cheie a lui R, altfel vom spune ca A este un
atribut neprim.
Spunem ca schema relationala R este in a doua forma normala daca este in
prima forma normala si pentru orice dependenta X -> A cu A atribut neprim necontinut
in X care are loc in R nu exista nici-o cheie care sa contina strict pe X.
Cu alte cuvinte, o relatie R este in 2NF daca este in 1NF si orice atribut neprim
este complet dependent de orice cheie.
Exemplul 5.16. Schema relationala R = ABCD cu dependentele F = {AC -> D,
A -> B} nu este in a doua forma normala deoarece singura cheie este AC, B este un
atribut neprim, are loc A -> B si A este inclusa strict in cheia AC.
A doua forma normala inlatura redondantele si anomaliile la modificari. Relatia
MAGAZINE data la inceputul capitolului nu este in a doua forma normala deoarece
dependenta NUMEMAG -> ADRESAMAG are in partea stanga o submultime proprie
a singurei chei NUMEMAG MARFA si partea din dreapta este un atribut neprim. De
aici rezulta si problemele privind lucrul cu o astfel de relatie.
3. Integritate
Integritatea bazelor de date este in principiu data de corectitudinea
informatiilor continute si presupune detectarea, corectarea si prevenirea diferitelor
erori neintentionate privind datele introduse in bazele de date. Conditiile de integritate
numite si reguli de integritate nu permit introducerea in baza de date a unor date
aberante si sunt exprimate prin diferitele conditii puse asupra datelor. O serie de
conditii sunt de tip structural, legate de anumite egalitati intre valori, si exprimate prin
dependente functionale sau prin declararea unor campuri cu valori unice (de cele mai
multe ori aceste campuri sunt chei). O alta serie de conditii de integritate privesc
valorile actuale memorate in baza de date, permitand luarea unor valori numai dintr-un
anumit domeniu sau stabilind relatii aritmetice intre diferite campuri.
Pot fi considerate mai multe criterii de clasificare a regulilor de integritate. Un
prim criteriu priveste unitatea la care se aplica o constrangere si in acest caz exista
constrangeri pe domenii (ce privesc anumite valori pentru atribute) sau constrangeri pe
tabele sau relatii. Costrangerile pe tabele pot fi unituplu (se refera la fiecare tuplu in
parte) sau multituplu (se refera la combinatii de mai multe tupluri), aceasta ultima clasa
putand avea o subclasa de constrangeri ce folosesc functiile agregate. Un alt criteriu de
clasificare este acela prin care se deosebesc regulile de integritate ce se refera la
diferitele stari ale bazei de date de regulile ce se refera la tranzitia dintr-o stare in alta.
Constrangerile mai pot fi clasificate si din punct de vedere al momentului in care se
aplica ele puntand avea reguli imediate (ce se verifica in momentul in care se
efectueaza operatia indicata) sau reguli amanate (ce se verifica numai dupa ce au fost
executate si alte operatii asociate dar inainte de a modifica baza de date). Criteriile mai
pot fi impartite in criterii generale, aplicabile tuturor relatiilor din baza de date si criterii
particulare, care se pot aplica numai la anumite relatii.
Regulile de integritate se aplica relatiilor de baza in care sunt reprezentate
efectiv datele bazei de date. Dintre regulile generale ce se aplica in modelul relational
cel mai des folosite sunt regulile ce privesc cheile principale (unicitatea valorilor cheilor
principale in cadrul relatiei) si cheile straine (necesitatea existentei unei chei principale
din relatia asociata cu valoarea cheii straine nenule) numita constrangere referentiala.
Constrangerile de domeniu sunt intotdeauna constrangeri de stare si imediate.
Aceste constrangeri se pot referi la tipul de date pentru un atribut, la o lista de valori
posibile, la un ordin de marime, la un format sau o forma, la o condifie exprimata cu o
formula logica sau la o procedura care este apelata de cate ori are loc o modificare
pentru domeniul specificat.
______________________|_____________|_____________|____________|
____________|
|
|
| _portocale |
|
|
|
|
|
|
Identificatorii de conditii definite de utilizatori sunt utilizati pentru delimitarea
datelor pentru care sunt aplicate conditiile.
Exemplul 5. . Pentru a impune conditia ca tot timpul Popescu Dan sa aiba mai
putin de 100000 lei datorii se poate folosi un identificator PD astfel
_____________________________________________________________________
_______
CUMPARATORI
| NUME
| ADRESA
| CONT
|
_________________________|______________|__________________|
________________|
PD
| Popescu Dan |
|
|
I.CONSTR(PD).I.
|
|
| > -100000
|
|
|
|
|
Se pot impune si restrictii pentru noile valori in raport de valorile existente in
baza de date.
Exemplul 5. . Pentru a impune ca noile preturi ale fiecarui produs sa nu creasca
mai mult de 10% fata de preturile vechi se poate formula constrangerea:
_____________________________________________________________________
_______
MAGAZINE
| NUMEM
| ADRESAM | MARFA | PRET
|
______________________|_____________|_____________|____________|
____________|
I.CONSTR(U.).I.
| _magazin |
| _portocale | <=1.1*_p |
I.
| _magazin |
| _portocale | _p
|
|
|
|
|
|
Se pot tipari constrangerile unei relatii daca se pune in scheletul relatiei sub
nume comanda P.CONSTR.P. sau numai de un anumit tip cu comanda
P.CONSTR(T.).P. unde T este una din literele I, D sau U. Se poate elimina o
constrangere punand in schelet comanda D.CONSTR(<lista conditii>) urmata in
coloanele atributelor de descrierea constrangerii respective.
In limbajul QUEL se poate construi o conditie de integritate prin instructiunea
de forma urmatoare:
DEFINE INTEGRITY ON tabel IS conditie
Constrangerile de integritate sunt numerotate si tinute intr-un catalog INGRES.
Numarul unei constrangeri se poate afla cu instructiunea HELP INTEGRITY si este
utilizat de exemplu pentru anularea unei constrangeri printr-o instructiune de forma
DESTROY INTEGRITY tabel nr-constrangere
4. Securitate
Prin securitatea bazelor de date se intelege protejarea bazelor de date impotriva
folosirii neautorizate a lor si in special a modificarilor si distrugerilor nedorite de date
si citirilor nepermise de date. Tehnicile utilizate de obicei sunt urmatoarele:
1. Identificarea utilizatorilor. Fiecarui utilizator in parte i se acorda
anumite drepturi de operare cu diferite portiuni din baza de date la diferite
nivele cum ar fi relatia, inregistrarea, pagina, atributul, etc. Drepturile
se refera la posibilitatea citirii, inserarii, stergerii sau modificarii
datelor respective. Identificarea se face de obicei prin parole stabilite
fie de administratorul bazei de date fie de utilizator.
2. Protejarea fizica. Deoarece s-ar putea ajunge la date si prin alte mijloace
decat prin intermediul SGBD-ului (de exemplu prin citirea directa a mediului
magnetic) se poate face o protectie prin pastrarea codificata a datelor pe
mediul magnetic. Decodificarea datelor se poate face numai dupa identificarea
utilizatorului prin garzi asociate lui.
3. Administrarea si transmiterea drepturilor. Se tine evidenta stricta a
5. Optimizarea cererilor
Pentru cererile adresate unei baze de date de foarte multe ori se pot face
reformulari ale cererii in cereri echivalente cu ea a caror timp de executie si spatiu de
memorie ocupat sa fie mult mai mici in comparatie cu tratarea cererii initiale.
Transformarile respective sunt efectuate de utilizator sau de sistemul de calcul in
procesul de optimizare a cererilor. In acest capitol prezentam unele metode utilizate in
acest domeniu.
In sistemele de tip relational se consuma mult timp si memorie la efectuarea
produsului cartezian si a uniunii naturale care sunt operatii des utilizate. Pentru
efectuarea produsului cartezian a doua relatii ce sunt memorate ca doua fisiere se
parcurge unul din fisiere si pentru fiecare inregistrare din primul fisier se parcurg
inregistrarile celui de-al doilea fisier. Numarul de citiri de pe mediul extern este mai mic
daca citirea se poate face pe blocuri de inregistrari si se rezerva un bloc pentru
inregistrarile celui de-al doilea fisier si restul blocurilor pentru primul fisier. In acest caz
numrul de citiri este n1/b1(1 + n2/((m-1)b2)) unde ni da numarul inregistrarilor din
fisierul i, bi da numarul de inregistrari dintr-un bloc si m este numarul de blocuri din
memoria interna ce se pot utiliza. Se vede ca se obtine un numar mai mic daca raportul
n1/b1 este mai mic decat n2/b2 fata de cazul cand s-ar inversa rolul fisierelor.
Pentru n1 = n2 = 10000, b1 = b2 = 5 si m = 100 se obtine un numar de 42400
citiri si daca se fac 20 de citiri de blocuri pe secunda, efectuarea produsului cartezian ar
lua circa 35 de minute.
De multe ori produsul cartezian nu se ia ca atare ci combinat cu alte operatii.
De exemplul in cererea scrisa in limbajul QUEL
range of x is AB
range of y is CD
retrieve (x.A)
where x.B = y.C and y.D = 99
care se poate exprima in algebra relationala prin expresia
@p/A(@S/B=C@AD=99(AB X CD))
desi apare produsul cartezian putem evita calculul lui. Se transforma expresia data mai
intai in expresia echivalenta
@P/A(@S/B=C(AB X @S/D=99(CD)))
si de aici se deduce expresia echivalenta
@P/A(AB |X| @S/D=99(CD))
B=C
Calculele se desfasoara in felul urmator: se parcurge fisierul pentru CD si se
selecteaza tuplurile care au valoarea 99 pentru D retinandu-se numai valorile pentru C
(determinarea acestor tupluri este mai rapida daca exista un index pentru D); se
selecteaza apoi din fisierul corespunzator lui AB acele tupluri care au valori pentru B
din multimea gasita pentru C si se retin valorile pentru A din tuplurile gasite. Acest
procedeu necesita parcurgerea o singura data a fiecarui fisier cel mult si ia mult mai
p[utin timp si spatiu decat daca s-ar fi efectuat operatiile in ordinea indicata de cererea
initiala.
Pentru uniunea naturala exista mai multe metode de implementare. De exemplu
pentru a efectua operatia AB |X| CD si nici-unul dintre cele doua
B=C
fisiere nu incape in memoria principala se pot sorta cele doua fisiere, primul dupa B si
al doilea dupa C si apoi cu un procedeu de tip interclasare se poate obtine rezultatul
uniunii naturale printr-o singura parcurgere a celor doua fisiere. Daca exista un index al
primului fisier dupa B se parcurge al doilea fisier si se cauta prin intermediul indexului
tuplurile din primul fisier care au pentru B valoarea gasita pentru C in fiecare tuplu din
al doilea fisier. Numarul de accese devine mai mic in cazul cand inregistrarile sunt
grupate in aceleasi blocuri in functie de valorile lui B si respectiv C.
In optimizarea cererilor se aplica diferite principii dintre care fac parte si
urmatoarele:
1. Efectuarea selectiilor cat mai curand posibil. Acesta produce, in general,
rezultate intermediare cu mai putine elemente care se prelucreaza mai usor.
2. Combinarea eventuala a unor selectii cu produse carteziene pe care le preced
pentru a obtine uniuni naturale. Daca selectia contine atribute nunai dintr-o
relatie a produsului cartezian ea poate fi coborata in arborele asociat
expresiei (se aplica prioncipiul 1).
3. Combinarea unor operatii unare de tip proiectie si selectie eventual si cu o
operatie binara vecina. Se pot aplica in acelasi timp selectii si proiectii
@S/CARTI.NR_INV=FISE.NR_INV
|
|
X
/ \
/
\
/
\
@P/FISE.NR_INV @P/CARTI.NR_INV,TITLU
|
\
|
\
@S/CITITORI.NR_LEG= CARTI
| FISE.NR_LEG
|
X
/ \
/
\
/
\
@P/FISE.NR_INV, @P/CITITORI.NR_LEG
| FISE.NR_LEG |
|
|
@S/DATE<1/8/94 CITITORI
|
|
FISE
Figura 5.4.
Pentru fig. 5.4 corespunde un program cu doua instructiuni: prima instructiune
este o uniune naturala in care se cuprinde produsul cartezian din partea de jos a
arborelui impreuna cu proiectia si selectia ce il preced si cu proiectiile si selectia ce se
gasesc in subarborii lui avand ca rezultat numarul de inventar al cartilor imprumutate
inainte de 1 august 1994 iar cea de-a doua instructiune care este tot o uniune naturala
combina rezultatul primei instructiuni cu informatiile obtinute despre carti pentru a
obtine titlurile din lista asociata cererii.
5.2. Optimizari in System R
In System R cererile sunt mai intai optimizate si apoi sunt executate
considerandu-se ca timpul consumat cu optimizarea se recupereaza la executie, mai
ales in cazul cand cererea este evaluata in mod repetat. Cererile sunt considerate de
forma:
SELECT A1,A2,...,An
FROM R
WHERE P1 AND P2 AND ...
unde P1,P2,... sunt predicate in care nu mai apare AND. In optimizari se folosesc mult
indexarile si statisticile asupra diferitelor relatii existente.
Un caz special il constituie indexul grupat in care inregistrarile asociate unei valori din
index sunt grupate in acelasi bloc sau in blocuri alaturate facand posibil un acces mai
rapid la inregistrari. Un algoritm de optimizarea cererilor este cel urmator.
Algoritmul 5. . Sa presupunem ca relatia R contine T inregistrari si ocupa un
numar de B blocuri pe mediul extern. Sunt estimate pe rand costurile diferitelor tipuri
de metode expuse in continuare retinandu-se metoda care realizeaza costul cel mai
mic.
1. Se determina tuplurile lui R care satisfac un predicat de forma A=c si pentru
A exista un index grupat din care se pot gasi usor tuplurile ce au valoarea
c, apoi se verifica celelalte predicate pentru ele. Numarul estimat al
acceselor la blocuri este B/I unde I este numarul elementelor din index.
2. Se foloseste indexarea grupata dupa atributul A pentru a obtine submultimea
de tupluri ale lui R care satisfac un predicat de forma A@0c cu @0 din
multimea {<,@<=,>,@>=} si pentru acestea se verifica celelalte predicate.
Numarul estimat al acceselor la blocuri este B/2.
3. La fel ca la 1 doar ca A are un index obisnuit (fara grupari). Costul estimat
in acest caz este T/I.
4. Se citeste R si se verifica predicatele pentru fiecare tuplu in parte. Costul
este in acest caz B.
5. Daca fisierul nu este memorat in blocuri compacte dar are un index grupat, se
foloseste indexul pentru a ajunge la inregistrarile fisierului si apoi se
verifica predicatele. Costul in acesta metoda este B.
6. La fel ca la 2 doar ca A are un index oarecare. Costul acestei metode este
T/2.
7. Se foloseste un index negrupat sortat si se verifica predicatele pentru
tuplurile parcurse. Costul acestei metode este T.
8. Daca nu se poate aplica nici-una din metodele anterioare se parcurg toate
blocurile ce pot avea inregistrari din R si pentru cele gasite se testeaza
predicatele. Costul acestei metode este ceva mai mare de T.
Exemplul 5. . Sa aplicam algoritmul precedent la cererea
SELECT NR_COM
FROM COMENZI
WHERE CANTITATE @>= 5 AND MARFA = "portocale"
Daca pentru relatia COMENZI exista un index grupat dupa NUME si indexi negrupati
dupa MARFA si CANTITATE, T=1000 (sunt circa 1000 de comenzi), B=100
(memorate in circa 100 de blocuri), I=50 (apar circa 50 de marfuri in comenzi),
alegerile 1 si 2 nu se pot aplica. Alegerea 3 cu index negrupat dupa MARFA da costul
T/I = 1000/50 = 20. Alegerea 4 daca fisierul are blocuri consecutive sau 5 cu
parcurgerea indexului grupat dupa NUME in caz contrar are costul B = 100. Alegerea
6 se poate face prin parcurgerea indexului asociat pentru CANTITATE cu costul T/2 =
500 iar alegerile 7 si 8 dau costul T=1000. Deci se obtine costul cel mai mic daca se
face optiunea 3 prin care se cauta in indexul pentru MARFA tuplurile ce corespund
pentru "portocale" si pentru aceste tupluri se face testul CANTITATE @>= 5.
5.3. Algoritmul de descompunere QUEL
range of t is CARTI
range of s is EDITORI
range of u is CITITORI
range of v ia FISE
retrive (u.NUME)
where t.NR_INV=v.NR_INV and u.NR_LEG=v.NR_LEG
and t.EDITOR=s.NUMEE and u.ORAS=s.ORASE
si pentru care corespunde graful legaturilor din fig. 5. .
_____________
| CARTI |
|___________|
/
\
CARTI.NR_INV /
\ CARTI.EDITOR
=FISE.NR_INV /
\ =EDITORI.NUMEE
/
\
__________
_____________
| FISE |
| EDITORI |
|________|
|___________|
\
/
FISE.NR_LEG
\
/ CITITORI.ORAS
=CITITORI.NR_LEG \
/ =EDITORI.ORASE
\
/
______________
| CITITORI |
|____________|
Figura 5.5.
Executarea unei cereri poate fi vazuta ca o serie de operatii pe graful
legaturilor asociat cererii, fiecare operatie construind o noua relatie folosita intr-un pas
intermediar in evaluarea cererii si schimbarea corespunzatoare a grafului. In final graful
va avea un singur nod care reprezinta rezultatul cererii. Numim constante si le marcam
cu bare duble nodurile ce au putut sa fie evaluate, ele apartinand cel mult unei muchii,
si numim muchii simple hipermuchiile ce corespund la conditii de forma A=B.
Constructiile folosite pentru descompunerea grafului legaturilor sunt urmatoarele:
1. Instantiere. Daca exista o muchie simpla intre nodurile n si m, unde n
reprezinta o relatie r si m reprezinta o constanta care e o singura valoare
v, se elimina nodul m si muchia (m,n) etichetata cu A=v unde A este un
atribut al lui r si se inlocuieste nodul n cu @S/A=v(r).
2. Disectie. Daca nodul n reprezinta relatia r si apare in k muchii diferite,
pentru fiecare tuplu t din r se construieste un graf in care r se inlocuieste
cu {t} si fiecare muchie e in care apare n corespunzatoare formulei F se
inlocuieste cu muchia avand formula obtinuta din F prin inlocuirea
atributului A din r cu t[A] si pentru fiecare componenta a lui t mentionata
in F se creaza un nod reprezentand valoarea constanta a acestei componente.
Apoi se elimina n din muchia e dar se adauga in e toate nodurile astfel
contine toate tuplurile v1v2...vn unde fiecare vi este o valoare a variabilei distinse ai
pentru care exista valori ale variabilelor nedistinse bj care fac fiecare rand al tabloului
sa fie un tuplu al relatiei corespunzatoare si satisfac constrangerile tabloului.
Formal, rezultatul este multimea tuplurilor h(s) unde s este sumarul cu spatiile
libere eliminate, h este o aplicatie de simboluri care pentru orice rand t corespunzator
relatiei R are h(t) un tuplu din R si pentru orice constrangere c@0d face h(c)@0h(d)
adevarata.
Exemplul 5. . Pentru cererea din exemplul 5. se poate construi urmatorul
tablou in care am notat prescurtat atributele T (titlu), Au (autor), E (editor), I
(nr.inventar), Ad (adresa), O (oras), C (nume cititor), L (nr. legitimatie) si D (data).
T
Au
E
I
Ad
O
C
L
D
_____________________________________________________________________
___________
a1
_____________________________________________________________________
___________
b1
b2
b3
b4
(CARTI)
b5
b6
b7
(EDITORI)
b8
b9
a1
b10
(CITITORI)
b11
b12
b13
(FISE)
b4 = b11 b10 = b12 b3 = b5 b7 = b9
Se poate transforma tabelul precedent in urmatorul tabel in care nu mai apar
constrangeri cu egalitati
T
Au
E
I
Ad
O
C
L
D
_____________________________________________________________________
___________
a1
_____________________________________________________________________
___________
b1
b2
b3
b4
(CARTI)
b3
b6
b7
(EDITORI)
b8
b7
a1
b10
(CITITORI)
b4
b10
b13
(FISE)
Se pot construi tablouri pentru selectie, proiectie si uniune naturala. Intersectia,
echiuniunea si produsul cartezian pot fi privite ca niste cazuri speciale de uniune
naturala eventual cu redenumirea unor atribute.
Algoritmul 5. . Pentru construirea tabloului corespunzator unei expresii ce
contine selectii, proiectii si uniuni naturale aplicate unor variabile relatii se procedeaza
in modul urmator:
1. Pentru fiecare frunza ce contine variabila relatie R(A1,A2,...,An) se creaza
cate un tablou care are sumarul si un singur rand marcat cu R, ambele
continand aceiasi variabila distinsa pentru fiecare atribut ce apare in R si
spatii libere pentru atributele ce nu apar in R (dar pot sa apara in alte
a3
a4
____________________________
a3
a4
(BC)
Pentru construirea uniunii naturale a celor doua relatii se identifica variabilele din
coloana lui B care este atribut comun si se obtine tabloul
a1
a2
a4
____________________________
a1
a2
(AB)
a2
a4
(BC)
Aplicand apoi selectia cu conditia C=0 se inlocuieste a4 cu 0 obtinand
a1
a2
0
____________________________
a1
a2
(AB)
a2
0
(BC)
si prin aplicarea proiectiei dupa A se obtine tabloul final
a1
_____________________________
a1
a2
(AB)
a2
0
(BC)
Pentru un tablou cu n randuri se poate construi o expresie echivalenta cu n-1
uniuni si anume luand produsul cartezian al relatiilor ce corespund randurilor, se face
apoi selectia ce reflecta constrangerile si diferitele aparitii ale aceleiasi variabile si apoi
se face proiectia corespunzatoare variabilelor distincte. Deci pentru a minimiza
numarul de uniuni trebuie gasita o metoda prin care se poate gasi un tablou echivalent
cu un tablou dat care sa contina cat mai putine randuri. Pentru rezolvarea acestei
probleme vom introduce cateva notiuni suplimentare.
Vom spune ca aplicatia definita de tabloul T1 este continuta in cea definita de
tabloul T2, si vom nota T1 @C= T2, daca si numai daca cele doua tablouri au aceleasi
atribute , au variabile distincte in aceleasi pozitii din sumar si pentru orice atribuiri de
relatii pentru variabilele reletii ale randurilor tabelelor, relatia produsa de T1 este o
submultime a relatiei produsa de T2. Testarea acestei proprietati se poate face aplicand
urmatoarea teorema:
Teorema 5. . T1 @C= T2 daca si numai daca exista o aplicatie de simboluri h
de la simbolurile lui T2 la cele ale lui T1 astfel incat:
1. h aplicat sumarului lui T2 este sumarul lui T1,
2. h aplicat fiecarui rand din T2 este un rand in T1 cu aceiasi denumire,
3. Fiecare constrangere a lui T2 rezulta din presupunerea ca au loc constrangerile din T1 pentru simbolurile in care h transforma simbolurile lui T2.
Spunem ca doua tablouri T1 si T2 sunt echivalente, si notam T1 @=_ T2, daca
si numai daca T1 @C= T2 si T2 @C= T1.
Exemplul 5. . Fie tablourile T1 si T2 definite astfel:
a
b
___________________________
a
c
d
(R)
a
e
f
(R)
g
c
b
(R)
h
e
b
(R)
a
a
h
b
___________________________
e
f
(R)
e
b
(R)
vazute ca aplicatii intre randurile tablourilor. Fie T2 tabloul obtinut din T prin
eleminarea randurilor care nu sunt in imaginea lui g. Se vede imediat ca T si T2 sunt
echivalente si cum T2 nu are mai multe randuri ca T1 fiind imaginea prin g a lui T1 si
nici mai putine deoarece T1 a fost presupusa minimala rezulta ca T1 si T2 au acelasi
numar de randuri ceea ce demonstreaza teorema.
Corolar. Toate tablourile cu un numar minim de randuri echivalente cu un
tablou dat coincid cu exceptia eventuala a notatiilor simbolurilor.
Demonstratie. Aplicatia de simboluri f identifica tabloul T2 cu tabloul T1
minimal echivalent cu T si aceasta se intampla pentru orice tablou minimal. Faptul ca
imaginea lui T2 ar putea fi proiectat prin f pe o submultime proprie a lui T1 ar
contrazice minimalitatea lui T1.
Din proprietatile enuntate anterior rezulta un procedeu prectic de determinare a
tabloului minimal echivalent cu un tablou dat. Se incearca gasirea unor aplicatii de
simboluri care sa transforme tabloul dat intr-un tablou continut in el strict. Procesul
continua pana cand nu se mai gaseste o astfel de aplicatie. Problema este NP-completa,
dar tinand seama ca de obicei numarul de randuri in tablou este mic ea se poate rezolva
in timp util.
Evaluarea unei expresii se poate face eficient parcurgand urmatoarele etape: se
construieste tabloul asociat, se determina tabloul minimal echivalent cu el, se determina
expresia corespunzatoare tabelului minimal si apoi se aplica algoritmul de
descompunere pentru evaluarea expresiei.
6. Construirea unei baze de date de tip retea
contine cel putin un ciclu, atunci S nu este serializabil, altfel S este serializabil si o
serializare sa este data de o ordonare topologica.
Exista un protocol simplu care asigura serializabilitatea numit in doua faze care
impune tuturor tranzactiilor conditia de a face mai intai toate locarile si apoi toate
delocarile.
Teorema 5. . Daca programarea S contine numei tranzactii in doua faze atunci
S este serializabila.
Demonstratie. Sa presupunem ca S contine numai tranzactii in doua faze dar ca
nu este serializabila. Din algoritmul precedent rezulta ca graful G de precedenta
contine un ciclu Ti1-->Ti2-->...-->Tik-->Ti1. Atunci o locare in Ti2 se face supa o
delocare din Ti1, o locare din Ti3 se face dupa o delocare din Ti2,..., o locare din Tik se
face dupa o delocare din Tik-1 si o locare din Ti1 se face dupa o delocare din Tik ceea
ce ar duce la concluzia ca o locare din Ti1 s-ar face dupa o delocare a lui Ti1 si deci
Ti1 nu ar fi in doua faze. Deci se verifica proprietatea din enuntul teoremei.
Teorema 5. . Daca T este o tranzactie care nu este in doi timpi, atunci exista o
tranzactie T1 si o programare S neserializabila a lor.
Ddemonstratie. Daca T nu este in doi timpi atunci in ea apar in aceasta ordine
pasi de forma:
... LOCK A ... UNLOCK A ... LOCK B ... UNLOCK B ...
Daca luam tranzactia T1 de forma:
T1: LOCK A; LOCK B; UNLOCK A; UNLOCK B;
si programarea S ce programeaza prima parte din T pana la UNLOCK A inclusiv, apoi
toti pasii din T1 si apoi ce a mai ramas din T, graful asociat lui S contine un arc de la T
la T1 si un arc de la T1 la T deci are un ciclu si deci S nu este serializabila.
O eficienta mai buna se obtine daca se face distinctie intre utilizarea neexclusiva
a resurselor numita locare la citire careia ii corespunde instructiunea RLOCK A prin
care nu se modifica valoarea lui A si deci A poate fi accesibila la citire si pentru alte
tranzactii si respectiv utilizarea exclusiva a resurselor numita locare la scriere careia ii
corespunde instructiunea WLOCK A prin care se modifica valoarea lui A si deci A nu
poate fi accesibila la citire sau la scriere de alte tranzactii. Ambele tipuri de locari sunt
suspendate de o instructiune UNLOCK A.
Doua planificari sunt echivalente daca produc aceleasi valori pentru fiecare
element in parte si orice locare la citire dintr-o tranzactie se face in cele doua
programari in momente cand elementul implicat are aceleasi valori.
Algoritmul 5. . Pentru a testa daca programarea S a unei multimi de tranzactii
T1,...,Tk avand locari de citire si scriere este sau nu serializabila se procedeaza astfel:
Se creaza graful directionat G cu nodurile corespunzatoare tranzactiilor si
avand urmatoarele arce: un arc de la Ti la Tj daca Ti are RLOCK A sau are WLOCK A
si Tj este urmatoarea tranzactie care are un WLOCK A sau daca Ti a avut o delocare la
o locare la scriere pentru A si Tj are urmatoarea locare la citire pentru A fara o alta
locare pentru A intre cele doua evenimente. Daca graful G are cel putin un ciclu atunci
S nu este serializabila, altfel o serializare a lui S este data de o ordonare topologica a
lui G.
Ca si in cazul anterior se poate demonstra ca protocolul in doua faze este
suficient pentru a asigura serializabilitatea unei programari si ca pentru orice tranzactie
in care un UNLOCK precede un RLOCK sau un WLOCK exista o alta tranzactie si o
programare a celor doua tranzactii care nu e serializabila.
Un caz mai general si mai des intalnit in realitate este considerarea tranzactiilor
ca avand o multime de resurse la intrare (de citit) si o multime de resurse la iesire (de
scris). Un astfel de model il numim cu locari numai pentru citire si numai pentru
scriere. Modelele precedente sunt cazuri particulare ale acestui model si anume in
primul model multimea la intrare coincide cu multimea la iesire iar in al doilea model
multimea la iesire este vida pentru locarea la citire si multimea la intrare este vida
pentru locarea la scriere.
In acest caz transformarea unei programari intr-o programare seriala
echivalenta cu ea trebuie sa indeplineasca si urmatoarele conditii:
- daca tranzactia T2 citeste valoarea unui element A scris de T1 atunci
T1 trebuie sa preceada T2 in programarea seriala;
- daca o alta tranzactie T3 scrie A ea trebuie sa apara in programarea
seriala fie inainte de T1 fie dupa T2 si nu intre T1 si T2.
Vom presupune o tranzactie initiala T0 care nu citeste nici-un element si scrie toate
elementele si o tranzactie finala Tf care citeste toate elementele si nu scrie nimic.
Tranzactiile care nu au nici-un efect asupra lui Tf se numesc tranzactii
nefolosite. Determinarea tranzactiilor nefolosite se face construind un graf cu noduri
corespunzatoare tranzactiilor si avand arc de la T1 la T2 daca T1 scrie o valoare citita
de T2; tranzactiile nefolosite corespund nodurilor pentru care nu exista drum de la ele
la Tf in acest graf.
Testarea daca o programare este serializabila sau nu se face cu ajutorul notiunii
de poligraf construit in felul urmator: nodurile sunt corespunzatoare tranzactiilor la
care se adauga tranzactiile fictive initiala si finala; pentru orice pereche de tranzactii Ti
si Tj astfel incat Ti scrie A care este citit de Tj se considera arc de la Ti la Tj si pentru Ti
si Tj ca mai sus si orice alt Tp care scrie A se considera perechea de arce de la Tp la Ti
si de la Tj la Tp. Un poligraf este aciclic daca exista o alegere a cate unui arc din
fiecare pereche a lui care impreuna cu celelalte arce sa dea un graf aciclic.
Algoritmul 5. . Testarea daca o programare S din modelul locari numai pentru
citire si numai pentru scriere pe multimea tranzactiilor T1,T2,...,Tk este sau nu
serializabila se poate face in felul urmator:
1. Se adauga la inceputul lui S o serie de pasi in care o tranzactie fictiva T0
scrie toate elementele ce apar in S si la sfarsit o serie de pasi in care o
tranzactie fictiva Tf citeste toate elementele ce apar in S.
2. Se construieste un poligraf cu nodurile T0,T1,T2,...,Tk,Tf si cu arc intre Ti
si Tj de fiecare data cand in S Ti scrie o valoare A citita de Tj.
3. Se determina tranzactiile nefolosite (fara drum de la ele la Tf).
4. Se elimina arcele adiacente tranzactiilor nefolosite.
diferite unitati de calcul ce constituie nodurile unei retele. Fragmentele contin relatii
intregi sau parti de relatii care prin operatii de uniune naturala si reuniune pot sa
reconstituie relatia initiala. Pentru utilizator distribuirea unei baze de date este
transparenta, el "vazand" baza de date ca si cum ar fi nedistribuita.
Deci o baza de date distribuita poate fi privita ca o multime de noduri (orase)
legate intre ele sub forma unei retele, fiecare nod avand posibilitati de memorare si
prelucrare date. Accesul la date se face prin intermediul unui procesor de fisiere (file
server) si prelucrarea cererilor se face cu un procesor de tranzactii (transzction server).
Baza de date se considera formata din mai multe elemente locabile, unele dintre ele
putand eventual prin duplicare sa apara de mai multe ori in noduri diferite. Legatura
intre noduri se face prin schimb de mesaje si de date. O buna distribuire a datelor poate
sa aduca urmatoarele avantaje:
- o viteza de acces mai mare prin operarea frecventa a unor cereri ce
folosesc local un volum mai mic de date, fara a fi necesar un transfer
de date intre noduri;
- posibilitati mai bune de recuperare a informatiilor in cazul unor
caderi prin afectarea unei parti mai mici din baza de date;
- posibilitati de lucru modular si a preluarii sarcinilor unui nod
defect la un moment dat de catre celelalte noduri.
Un dezavantaj in acest caz il constituie aparitia unui flux mare de informatii
intre noduri si de aici necesitatea rezolvarii unor probleme cum ar fi sincronizarea
mesajelor, detectarea si corectarea unor perturbatii, eliminarea unor inconsistente
datorate redondantelor.
Datele unei baze de date distribuite sunt privite atat din punct de vedere logic
prin semnificatia pe care o au ele cat si actual prin modul de organizare si valorile
reprezentate la un moment dat. Orice relatie R poate fi reconstituita din fragmentele
R1,R2,...,Rn aflate in diferitele noduri fie prin uniune naturala R = R1 |X| R2 |X| ... |X|
Rn si atunci spunem ca avem o fragmentare verticala, fie prin reuniune R = R1 U R2 U
... U Rn si atunci spunem ca avem o fragmentare orizontala.
Exemplul 5. . Consideram baza de date a conturilor curente din filialele CEC in
care intervin ca atribute F (filiala CEC), N (numarul contului), T (total lei in cont), O
(nuarul operatiei in cont), S (suma operata), P (posesor cont curent) si A (adresa
posesor cont curent) si relatiile logice urmatoare:
CONTURI(F,N,T)
OPERARI(F,O,S)
POSESORI(N,P)
OPERAT(O,P)
CLIENTI(P,A)
Aceasta baza de date ar putea fi reprezentata distribuit de exemplu prin fragmentarea
orizontala a primelor patru relatii si pastrarea informatiilor legate de conturile deschise
la o filiala in nodul asociat acelei filiale iar informatiile despre clienti pot fi memorate la
sediul central CEC fiind in general mai rar accesate. Relatiile anterioare pot fi
considerate fragmente verticale pentru diferite vederi.
Uniunea naturala a mai multor relatii R1 |X| R2 |X| ... |X| Rn se poate calcula
prin efectuarea consecutiva a mai multor semiuniuni in care fiecare relatie Ri intervine
prin submultimea sa @P/Ri(R1 |X| ... |X| Rn) numita reducerea lui Ri in raport cu
R1,...,Rn. Foarte multe cereri corespund la astfel de reduceri.
Un sir de pasi de forma R := R |X S se numeste program semiuniune. Se poate
asocia unei uniuni un hipergraf in care nodurile sunt atribute si muchiile sunt schemele
relationale ce apar in uniune.
Teorema 5. . Daca expresia uniunii naturale corespunde la un hiopergraf aciclic
atunci exista un program semiuniune care reduce orice relatie din uniune si daca este
ciclic exista cel putin o relatie pentru care nu se poate face reducerea prin nici-un
program semiuniune.
Demonstratie. Vom demonstra prima parte a teoremei aratand cum se
construieste efectiv un program semiuniune pentru reducerea in raport cu R a unei
uniuni cu hipergraf acilic asociat. Daca in uniune apare o singura relatie R se considera
programul vid rezultatul fiind chiar relatia R data. Daca hipergraful este aciclic si are
mai mult de o muchie, el are cel putin un spic, muchia S. Daca S nu este R si are
elemente comune cu muchia T atunci se efectueaza operatia T := T |X S si se elimina
din hipergraf muchia S si atributele din S - T. Daca S este R se construieste recursiv un
program semiuniune care reduce pe T in raport cu celelalte relatii decat R si se adauga
R := R |X T. In ambele cazuri problema determinarii unui program semiuniune se
reduce la problema corespunzatoare unei uniuni cu o relatie mai putin ceea ce asigura
determinarea unui program semiuniune dupa un numar finit de pasi. Echivalenta
expresiilor obtinute in fiecare din cele doua cazuri cu expresia initiala este usor de
vazut.
Dintre multiplele programari semiuniune posibile asociate unei uniuni cu
hipergraf aciclic este dificil de ales cea mai eficienta mai ales ca de multe ori eficienta
depinde de continutul actual al relatiilor. Exista o clasa de cereri pentru care se poate
determina programul optim numite cereri lant. O cerere lant corespunde reducerii lui
R1 in raport cu R1,R2,...,Rn si relatiile sunt astfel incat Ri @O Rj = @O/ pentru orice i
si j cu 1@<= i < i+1 < j @<= n.
O solutie posibila in acest caz este: Rn-1 := Rn-1 |X Rn, Rn-2 := Rn-2 |X Rn-1, ...,
R1 := R1 |X R2.
Sa notam cu ai dimensiunea proiectiei lui Ri pe Ri-1 @O Ri pentru i > 1 si cu bi
dimensiunea proiectiei lui Ri pe Ri @O Ri+1 pentru i < n si sa presupunem ca exista o
constanta d astfel incat la efectuarea semiuniunii lui Ri cu uniunea altor k relatii
dimensiunea proiectiei pe Ri are dimensiunea aid\k sau respectiv bid\k. Vom nota cu
R/i\lr expresia @P/Ri(Rl |X| Rl+1 |X| ... |X| Rr) cu 1 @<= l @<= i @<= r @<= n.
Cererea lant corespunde lui R/1\1n.
Lema 5. . Daca nici-un pas al unui program semiuniune nu face semiuniunea
unor scheme relationale disjuncte si programul calculeaza o cerere lant pe R1,...,Rn,
atunci fiecare pas al programului calculeaza o valoare R/i\lr pentru anumite valori i, l si
r.
Demonstratie. Prin inductie dupa numarul pasilor programului. Fiecare pas in
program este semiuniunea a doua relatii alaturate din lant Ri |X Ri+1 sau Ri+1 |X Ri.
Pentru zero pasi proprietatea este adevarata deoarece Ri este R/i\ii si daca un pas este
Ri := Ri |X Ri+1 si inainte de acest pas valoarea lui Ri corespunde la R/i\jk si valoarea
lui Ri+1 corespunde la R/i\lm se vede imediat ca dupa efectuarea pasului respectiv Ri
corespunde la R/i\pq unde p = min(j,l) si q = max(k,m). Cel de-al doilea caz se trateaza
similar demonsrand lema.
Lema 5. . Cu parametrii c0, d, a2, ..., an, b1, ..., bn-1 definiti anterior, costul
semiuniunii Ri-1 |X R/i\lr este c0 + aid\r-l si costul semiuniunii R/i\lr X| Ri+1 este c0 +
bid\r-l iar in fiecare program semiuniune optim al cererii lant R1,...,Rn fiecare R/i\lr
care se calculeaza se realizeaza in unul din urmatoarele moduri:
1. Se calculeaza R/i\ik cu pasul Ri := Ri |X Ri+1 unde Ri+1 are valoarea curenta
R/i+1\i+1,k.
2. Se calculeaza R/i\ji cu pasul Ri := Ri |X Ri-1 unde Ri-1 are valoarea curenta
R/i-1\j,i-1.
3. Se calculeaza R/i\jk prin pasi Ri := Ri |X Ri-1 si Ri := Ri |X Ri+1 intr-o
ordine data, in momentul executarii acestor pasi valoarea lui Ri-1 este
R/i-1\j,i-1 si a lui Ri+1 este R/i+1\i+1,k.
4. Se calculeaza R/i\jk cu pasul Ri := Ri |X Ri-1 unde Ri-1 are valoarea curenta
R/i-1\jk.
5. Se calculeaza R/i\jk cu pasul Ri := Ri |X Ri+1 unde Ri+1 are valoarea curenta
R/i+1\jk.
Algoritmul 5. . Pentru a determina un program semiuniune optim pentru o
cerere lant @P/R1(R1 |X| ... |X| Rn) se procedeaza in felul urmator:
Fie c/i\jk costul calculului lui R/i\jk intr-un program semiuniune optim si numim jkfamilie multimea {R/j\jk,R/j+1\jk,...,R/k\jk}. Se calculeaza recursiv costurile minime
ale elementelor fiecarei jk-familii in ordinea crescatoare a lui k-j dupe formulele
a. c/i\ii = 0 pentru orice i.
b. c/i\ik = c0 + ai+1d\k-i-1 min(c/i+1\i+1,k, dc/i+1\ik) pentru k > i.
c. c/i\ji = c0 + bi-1d\i-j-1 min(c/i-1\j,i-1, dc/i-1\ji) pentru j < i.
d. c/i\jk = c0 + min(bi-1d\k-jc/i-1\jk, ai+1d\k-jc/i+1\jk,
c0 + b/i-1d\i-j-1c/i-1\j,i-1 +ai+1d\k-i-1c/i+1\i+1,k) pentru j<i<k.
Pentru fiecare jk-familie se evalueaza costurile elementelor sale plecand de la elementul
cu costul cel mai mic de forma R/i\jk. Dupa ce s-a evaluat c/1\1n se determina
elementele care au contribuit la calculul sau de forma R/i\jk si se scrie programul
semiuniune corespunzator acestor elemente aplicand procedeul din lema 5. .
Exemplul 5. . Fie relatiile R1(A,B), R2(B,C) si R3(C,D) si sa presupunem ca
c0=10, d=0.8, b1=10, a2=50, b2=20 si a3=1000. Aplicand algoritmul precedent se
obtine mai intai c/1\11 = c/2\22 = c/3\33 = 0, apoi pentru a calcula costurile 12-familiei
se obtin formulele
c/1\12 = 10 + min(50, 40+c/2\12)
c/2\12 = 10 + min(10, 8+c/1\12)
si cum ambele elemente au valori mai mari ca 10 rezulta valorile 60 si respectiv 20
deoarece minimul este obtinut pentru prima componenta. Analog pentru 23-familia
obtinem formulele
c/2\23 = 10 + min(1000, 800+c/3\23)
c/3\23 = 10 + min(20, 16+c/2\23)
si deoarece c/2\23 este mai mare decat 810 rezulta ca 16+c/2\23 este mai mare ca 20 si
deci c/3\23 este 30 de unde rezulta c/2\23 = 840. In sfarsit pentru 13-familia obtinem
formulele
c/1\13 = 10 + min(40+c/2\23, 32+c/2\13)
c/2\13 = 10 + min(6.4+c/1\13,640+c/3\13,10+10+1000)
c/3\13 = 10 + min(16+c/2\12,12.8+c/2\13)
si inlocuid valorile cunoscute se poate evalua imediat c/3\13 = 46, apoi c/2\13 = 696 si
in final c/1\13 = 738. Pentru a construi programul semiuniune se procedeaza astfel:
pentru calculul lui c/1\13 s-a folosit c/2\13 deci ultimul pas in program este R1 := R1 |
X R2 si calculul lui c/2\13 s-a facut cu ajutorul lui c/3\13 deci penultimul pas este
R2 := R2 |X R3 iar c/3\13 a fost calculat cu c/2\12 care a fost calculat direct si deci
corespunde la R2 := R2 |X R1 de unde rezulta urmatorul program
R2 := R2 |X R1; R3 := R3 |X R2; R2 := R2 |X R3; R1 := R1 |X R2.
9.3. Optimizarea cererilor in sistemul R*
Sistemul R* este o extindere experimentala a sistemului R pentru baze de date
distribuite. Ca si in sistemul R fiecare cerere este mai intai optimizata si apoi este
evaluata. Optimizarea se face plecand de la o expresie algebrica in care apar ca
operanzi relatii fizice si constante si ca operatori selectia, proiectia, uniunea, reuniunea
si o noua operatie numita alegere (CHOICE) care permite considerarea uneia din
copiile identice ale unei relatii fizice la un moment dat in cazul cand exista mai multe
copii.
Se fac modificari in arborele asociat expresiei prin identificarea nodurilor dintrun subarbore numit cluster care contin acelas operator asociativ si comutativ
(reuniune, uniune sau alegere) inlocuind astfel de subarbori cu un nod etichetat cu
operatorul comun din care pleaca arce catre toti fii nodurile identificate si avand drept
tata nodul care este tatal nodului de intrare in cluster (nodul ce precede toate celelalte
noduri din cluster). Arborele obtinut se numeste arbore compactificat. De exemplu in
fig. 5. este arborele corespunzator unei expresii care contine doua clustere cu
operatori reuniune si respectiv uniune. Acestui arbore ii corespunde arborele
compactificat din fig. 5. .
U
/
/
U
/ \
\
\
|X|
/\
/ \
/ \
/
\
/ \
/
\
R
S |X|
|X|
/\
/\
/ \
/ \
U
// \
// \
/ /
\
R S
|X|
//\\
/ / \ \
/ / \ \
T U
V W
Figura 5.
/
T
/
U
\
V
Figura 5.
In algoritmul de optimizare a cererilor se considera ca fiecare relatie se afla
intr-un singur nod prin redenumirea eventuala a unor copii si aplicarea operatorului de
alegere in cazul cand intervin in expresii. Se tine sema de localizarea operanzilor si de
localizarea rezultatului explorandu-se diferitele ordini de evaluare, diferitele strategii de
plasare a rezultatelor intermediare si diferitele moduri de evaluare a uniunilor. Functia
cost are componente atat pentru timpul de transmitere a datelor cat si pentru timpul de
efectuare a operatiilor in diferite noduri, dominant fiind primul dintre acestea.
Pentru reuniunea a doua relatii costul este zero daca nodul rezultatului este
acelasi cu cel al operanzilor, este dimensiunea relatiei din afara nodului rezultatului
daca acesta coincide cu nodul unuia din operanzi si este suma dimensiunilor celor doua
relatii daca nodul rezultatului nu coincide cu al nici-unui operand. Pentru operatorul de
alegere costul este zero daca exista o copie a relatiei in nodul rezultatului si este
dimensiunea relatiei altfel.
Uniuinea relatiilor R si S se poate face in unul din urmatoarele moduri:
1. Se trece R in nodul lui S si rezultatul ramane aici; cost c0+|R|.
2. Se trece S in nodul lui S si rezultatul ramane aici; cost c0+|S|.
3. Se trec R si S in al treilea nod si rezultatul ramane in el;cost 2c0+|R|+|S|.
4. Pentru fiecare tuplu t din R se determina tuplurile u din S care au valorile
lui T pentru atributele comune si se transfera acestea in nodul lui R unde se
obtine rezultatul; cost |R|(c0+|S|/I) unde I este dimensiunea proiectiei lui
S pe multimea atributelor comune lui R si S.
5. La fel ca 4. cu schimbarea rolurilor celor doua relatii.
Se pot genera si alte strategii sau considera cazuri particulare cand cele doua
relatii se afla in acelasi nod care poate sa coincida sau nu cu al rezultatului.
Algoritmul 5. . Pentru evaluarea unei cereri pentru o baza de date distribuita
reprezentata sub forma arborelui compactificat si cu indicarea nodului care sa contina
rezultatul final se face prin urmatoarea metoda:
- Se coboara in arbore cat mai mult posibil selectiile si proiectiile. Daca un
operator precede operatorul de alegere se aplica acel operator la toti fii
operatorului de alegere. Se elimina ramurile cu conditii conflictuale si
conditiile redondante.
- Se generaza subarborii arborelui dat evaluandu-se pentru fiecare din ei
costurile. O frunza etichetata cu R da un singur subarbore caruia ii
corespunde expresia R. Fie n un nod intern astfel incat pentru fiecare din fii
sai c1,c2,...,ck au fost determinate multimile de expresii asociate S1,S2,...,
Sk. Daca n este selectie sau proiectie atunci k=1 si se formeaza expresiile
corespunzatoare lui n prin aplicarea pentru radacina fiecarei expresii din S1
a operatorului din n (selectie sau proiectie). Daca operatorul din n este o
alegere atunci multimea expresiilor asociate lui n este reuniunea multimilor
expresiilor asociate fiilor lui. Daca n este reuniune sau uniune se
construiesc mai intai toti arborii binari neordonati (nu conteaza ordinea
fiilor pe fiecare nivel) cu noduri etichetate cu operatorul asociat lui n si
Daca n este numarul de copii si k > n/2 atunci se poate defini o generalizare a
celor doua strategii precedente numita k-din-n in care are loc o locare la scriere daca
sunt locabile cel putin k dintre copii si poate fi o locare la citire daca sunt locabile cel
putin n-k+1 copii.
Strategia copiei primare considera pentru fiecare relatie un reprezentant ce
poate sa aiba un marcaj de scriere sau marcaj de citire. Pentru fiecare element A poate
exista numai un marcaj de scriere si in acest caz nu mai poate fi un alt tip de marcaj iar
nodul care a facut marcarea poate efectua locarea la citire si scriere pentru tranzactiile
din nodul respectiv pentru A sau poate exista un marcaj de citire si in acest caz pot sa
fie si alte marcaje de citire iar nodul care a facut marcarea poate efectua locarea numai
la citire pentru tranzactiile din nodul respectiv pentru A.
Metoda numita strategia nodului central este asemanatoare cu precedenta cu
deosebirea ca pentru toate elementele marcajele sunt tinute in acelasi nod care ar putea
sa nu contina nici-o copie a elementului respectiv. Aceasta metoda este vulnerabila din
cauza posibilitatii caderii nodului central care poate sa intrerupa complet lucrul cu baza
de date si din cauza timpilor de asteptare prin concentrarea mesajelor catre un singur
nod.
Interblocarile pot fi prevenite prin impunerea unor protocoale suplimentare ca
de exemplu exprimarea celerilor de locare in fiecare tranzactie in ordinea lexicografica
a numelor elementelor si cautarea intr-o ordine data a copiilor din diferitele noduri. Se
pot considera si strategii de detectare si eliminare a interblocarii dupa modelele deja
studiate.
Daca unele procesoare din noduri nu mai functioneaza din anumite motive
sistemul poate sa asigure continuarea lucrului pentru tranzactiile care au asigurate
toate resursele necesare. La reluarea lucrului sistemul trebuie sa faca toate modificarile
necesare pentru a actualiza informatiile din nodurile cazute. De obicei modificarile unui
nod cazut sunt pastrate intr-un jurnal al unui alt nod. Se fac si comparatii intre
diferitele copii ale relatiilor si se actualizeaza dupa copia cu data cea mai recenta.
CAPITOLUL AL VI-LEA
MEMORAREA DATELOR UNEI BAZE DE DATE
1. Fisiere
Nivelul la care se face gestionarea informatiilor de catre
sistemele de operare actuale este cel de fisier. Dupa continut,
fiisierele se impart in mai multe clase dintre care cele mai des
utilizate sunt cele ce urmeaza:
- directoarele sunt fisierele care dau informatii despre alte
fisiere; cu ajutorul directoarelor se pot contrui structuri
arborescente ce permit accesul la oricare fisier din sistem plecand
de la un director initial numit radacina; orice nod interior al
arborelui de structura corespunzator fisierelor este un director; de
obicei, directoarele nu sunt frunze in arbore (exceptie sunt doar
directoarele vide)
- fisierele de date contin informatii ce pot fi prelucrate de
programe
- fisierele text contin informatii alfanumerice de informare a
utilizatorilor sau diferite documente memorate in sistem
- fisierele cod sursa contin programe scrise intr-un limbaj de
programare
- fisierele cod obiect contin programe compilate
- fisierele executabile contin programe ce pot fi lansate in
executie; un caz particular il reprezinta fisierele de comenzi care
contin o succesiune de comenzi ale sistemului de operare sau lansari
de alte programe.
Principalele caracteristici ce definesc fiecare fisier sunt
numele fisierului, tipul fisierului, lungimea, locul de memorare,
modul de acces, data crearii sau a ultimei modificari si alte
informatii. Tipul acestor informatii si modul lor de reprezentare
difera de la sistem la sistem.
Elementele componente ale unui fisier sunt inregistrarile.
Fiecare inregistrare contine informatiile corespunzatoare unui obiect
de tipul celor pentru care s-a construit fisierul. Fiecarei
informatii ii corespunde un tip, un domeniu de valori posibile, o
lungime de reprezentare si o pozitie in inregistrare. Toate acestea
definesc un camp al inregistrarii. Structura inregistrarilor este
descrisa de formatul inregistrarii asociat fiecarui fisier.
Operatiile curente cu un fisier se reduc de cele mai multe ori
la patru tipuri: inserare, stergere, modificare si cautare. Inserarea
presupune introducerea unei noi inregistrari, stergerea presupune
eliminarea unei inregistrari si modificarea presupune schimbarea unor
valori ale unor campuri intr-o inregistrare. Aceste operatii nu
schimba modul de organizare si modul de acces asociate fisierului.
Cautarea presupune determinarea unor valori sau localizarea unor
valori sau o combinatie a lor in functie de anumite calitati sau
proprietati pe care trebuie sa le indeplineasca.
Unitatea de transfer de informatii intre fisier, memorat pe un
mediu si memoria interna este blocul. Un bloc are de obicei lungimea
fisiere index, o buna ocupare a spatiului alocat (in medie circa 75%
spatiu ocupat).
Dezavantaje: dificil de programat operatiile cu B-arbori,
folosire spatiu suplimentar pentru nodurile interne.
CAPITOLUL AL VII-LEA
APLICATII
1. Directii de cercetare
Directii de cercetare legate de bazele de date asa cum au fost
sintetizate la conferinta de la Laguna Beach (1988) sunt in
principal:
- Viitoare aplicatii (CASE - computer-aided software
engineering, CIM computer-integrated manufacturing, imagini, baze de date
spatiale,
regasirea informatiei)
- Dezvoltarea unor medii hardware (revolutie, masini de baze de
date)
- Dezvoltarea unor medii software (sisteme de operare,
interfete pentru
limbaje de programare, Prolog)
- Extinderea administrarii datelor (arhitecturi extinse, baze
de date
orientate obiect)
- Baze de date active si sisteme de reguli
- Interfete pentru utilizatorul obisnuit
- Tehnologii SGBD uninod
- SGBD-uri distribuite
- Alte directii (proiectarea bazelor de date fizice,
instrumente de
proiectare, baze de date in timp real, modele de date,
translatarea
datelor, schimbul de informatii folosind bazele de date)
2. Calculatoare de baze de date
In ultimul timp se fac cercetari intense pentru construirea
unor calculatoare specializate in baze de date. Astfel de sisteme
sunt IBM System/38, ICL CAFS (Content Addressable File Store),
Britton-Lee IDM (Interactive Database Machine) si Amperif RDM-1100
(care utilizeaza IDM). Astfel de masini cu performante superioare in
memorarea si regasirea informatiilor pot fi cuplate cu alte tipuri de
masini ce permit o eficienta sporita in prelucrarea informatiilor.
!y <-- x1,x2,...,xn
prin care se creaza colectia y continand n obiecte noi indicate prin
functiile super ca fiind x1,x2,...,xn. Acelas lucru se poate face
utilizand extendTo, dar in acest caz obiectele noi primesc si nume
astfel:
!y <-- object specialized;
!z1 <-- x1 extendTo:y;
!z2 <-- x2 extendTo:y;
......................
!zn <-- xn extendTo:y;
In general functia x extendTo:y creaza un obiect de prototip y si
face ca super de noul obiect sa fie x. Functiile new si specialized
se pot aplica atat obiectelor cat si prototipurilor. De exemplu, daca
x este un obiect (prototip) atunci expresia x new creaza o copie a
lui x si a fiecarui obiect (prototip) din superdrumul lui x.
Functiile sunt tratate ca obiecte de prima clasa. Sunt doua
tipuri de mesaje: mesaje extensionale ce au ca rezultat evaluarea
functiilor selectate si mesaje intensionale care dau functia ca
atare. Mesajele intensionale se exprima punand doua puncte inaintea
numelui functiei. De exemplu, gm vanzari da valoarea obtinuta prin
aplicarea functiei vanzari obiectului gm si gm :vanzari da o functie
care face legatura intre obiectul gm si valorile pentru vanzari ale
lui. Functiile fiind privite ca obiecte, pot sa apartina unor
colectii, raspund la mesaje si se pot organiza in subtipuri.
Functiile fac parte din colectia function care contine doua
subcolectii numite computed (calculate) si enumerated (enumerate).
Functiile enumerate dau valoarea lor explicit raspunzand la mesajul
de atribuire <--. Cea mai des folosita functie enumerata este o
proprietate sau un atribut. De exemplu, daca vanzari este o functie
enumerata are sens expresia gm :vanzari <-- 1234567.80. Functiile
calculate sunt fie metode care sunt definite de utilizator fie
primitive care sunt prevazute de sistem.
Tipurile de functii pot fi utilizate in modelarea istoricului
datelor. Istoricul unui obiect este o functie a proprietatilor sale,
fiecare proprietate putand sa aiba propria istorie care poate sa
depinda de timp in mai multe moduri care, de obicei, sunt
transparente utilizatorului. Pentru aceasta o parte din configuratia
globala a sistemului este contextul temporal. Tipurile de functii
sunt folosite pentru a modela relatia intre obiecte si contextul
temporal intr-un mod extins. De exemplu, proprietatile fixe sunt
insensibile la contextul temporal pe cand proprietatile schimbatoare
mentin o serie de evenimente in istoria unui obiect. De exemplu,
expresia gm:vanzari cain:1989 reproduce dinamic mai intai contextul
temporal din 1989 si apoi evalueaza functia vanzari.
Mediul se incapsuleaza cu ajutorul blocurilor procedurale. Un
bloc este un sir parantezat de intructiuni. De exemplu, expresia !p
<-- [|:x|x+1] se defineste blocul p in care se aduna 1 la argumentul
sau. Daca f este o metoda, atunci valoarea ei este un bloc utilizat
in comun de toate elementele colectiei. Blocurile raspund la mesajele
valoare similar cu functiile. De exemplu, pentru blocul p precedent,
expresia p value:5 intoarce valoarea 6.
5. Baze de cunostinte
NOT A OR NOT B OR C
NOT D OR A
B
D
NOT C
NOT D OR NOT B OR C
NOT D OR C
6. Exemple