Anda di halaman 1dari 168

CUPRINS

CAPITOLUL I: INTRODUCERE IN BAZE DE DATE

1. Ce este o baza de date?


2. Arhitectura unei baze de date
3. Scheme externe
4. Scheme conceptuale
5. Scheme interne
6. Introducere in proiectarea bazelor de date

CAPITOLUL AL II-LEA: MODELUL LOGIC AL DATELOR

1. Modelarea logica a datelor


2. Vederile utilizatorilor
3. Construirea unei vederi utilizator
* 4. Integrarea vederilor utilizatorilor

CAPITOLUL AL III-LEA: MODELE DE BASE DE DATE

1. Modelul relational de baze de date


1.1. Limbaje de prelucrare a datelor pentru modelul relational
1.1.1. Algebra relationala
1.1.2. Calculul relational pe tupluri
1.1.3. Reducerea algebrei relationale la calculul relational
pe tupluri
1.1.4. Calculul relational pe domenii
1.1.5. Reducerea calculului relational pe tupluri la calculul
relational pe domenii
1.1.6. Reducerea calculului relational pe domenii la algebra
relationala
1.2. Limbaje relationale de cereri
1.2.1. ISBL - limbaj de tip algebra relationala
1.2.2. SQUARE - limbaj intermediar intre algebra relationala si
calculul relational pe tupluri
1.2.3. QUEL - un limbaj de tip calcul relational pe tupluri
1.2.4. Query-by-Example - limbaj de tip calcul relational pe
domenii
1.3. Descrierea bazelor de date de tip relational
2. SQL
2.1. SQL interpretabil
2.2. SQL programabil
3. Modelul retea
4. Modelul ierarhic (arborescent)
5. Compararea modelelor
CAPITOLUL AL IV-LEA: SISTEME DE GESTIUNE A BAZELOR DE DATE
(SGBD)

1. SGBD INGRES
2. SGBD SYSTEM R
3. SGBD ORACLE
* 4. SGBD dBASE
5. SGBD DBTG
6. SGBD IMS
7. Alte SGDB-uri
7.1. DATACOM/DB - tip liste inversate
* 7.2. TOTAL - tip retea
7.3. IDMS - tip retea
7.4. ADABAS - tip hibrid
* 7.5. System 2000 - tip ierarhic
7.6. DB2 - tip relational
* 7.7. DaTaSyS - tip relational
7.8. NOMAD - tip relational
* 7.9. RELGRAF - tip relational

CAPITOLUL AL V-LEA: CONSTRUIREA UNEI BAZE DE DATE

1. Dependente in baze de date


1.1. Dependente functionale
1.2. Descompunerea schemelor relationale
1.3. Dependente multivaloare
1.4. Dependente generalizate
2. Forme normale ale bazelor de date relationale
2.1. Prima forma normala (1NF)
2.2. A doua forma normala (2NF)
2.3. A treia forma normala (3NF)
2.4. Forma normala Boyce-Codd (BCNF)
2.5. A patra forma normala (4NF)
2.6. A cincia forma normala (5NF)
3. Integritate
4. Securitate
4.1. Securitatea in QBE
4.2. Securitatea in SQL
4.3. Securitatea in QUEL
4.4. Baze de date statistice
5. Optimizarea cererilor
5.1. Prelucrarea algebrica a cererilor
5.2. Optimizari in System R
5.3. Algoritmul de descompunere QUEL
5.4. Micsorarea numarului de uniuni
* 6. Construirea unei baze de date de tip retea
* 7. Construirea unei baze de date de tip arborescent
8. Concurenta in bazele de date
8.1. Accesul concurent la date
8.2. Detectarea erorilor si restabilirea informatiei
9. Baze de date distribuite
9.1. Reprezentarea bazelor de date distribuite
9.2. Optimizarea cererilor in baze de date distribuite
9.3. Optimizarea cererilor in sistemul R*
9.4. Problema concurentei

CAPITOLUL AL VI-LEA: MEMORAREA DATELOR UNEI BAZE DE DATE

1. Fisiere
2. Tipuri de organizare a fisierelor
2.1. Fisiere secventiale
2.2. Fisiere cu dispersie
2.3. Fisiere cu index rar
2.4. Fisiere cu index dens
2.5. Fisiere cu structura de B-arbore
* 2.6. Inplementarea modelului logic
3. Metode de cautare in fisiere
3.1. Fisiere cu indexi secundari
3.2. Indicarea partiala a chei de cautare
3.3. Cazuri speciale de cautare
* 3.4. Interpretarea vederilor
4. Inregistrari de lungime variabila
4.1. Metoda spatiului rezervat
4.2. Metoda inlantuirii
4.3. Metoda mixta
* 4.4. Transformarea modelului virtual in model real
* 4.5. Implementarea modelelor de baze de date in cazul unor entitati
si relatii de lungime variabila

CAPITOLUL AL VII-LEA: APLICATII

1. Directii de cercetare
2. Calculatoare de baze de date
3. Interfete
3.1. Interfete pentru acces la date
3.2. Interfete pentru prezentari de date
3.3. Generatoarele de aplicatii
3.4. Facilitati de administrare
3.5. Dictionare
4. Baze de date orientate obiect
4.1. Sistemul VISION
4.2. Limbajul OPAL
5. Baze de cunostinte
* 6. Exemple

CAPITOLUL I
INTRODUCERE IN BAZE DE DATE

CURSUL 1

1. Ce este o baza de date?

La inceput calculatoarele au fost utilizate numai pentru calcule aritmetice.


Prin cresterea vitezei de calcul, prin cresterea capacitatii de memorare a datelor, prin
adaugarea unor noi componente de intrare iesire, prin dezvoltarea unor limbaje de
programare s-a ajuns acum la prelucrarea intr-un timp scurt a unei mari cantitati de
informatii. Organizarea si gestionarea acestor informatii se face la nivelul bazelor de
date.

O baza de date contine toate informatiile necesare despre obiectele ce


intervin intr-o multime de aplicatii, relatiile logice intre aceste informatii si tehnicile
de prelucrare pentru aceste informatii. In bazele de date se face o integrare a datelor
in sensul ca mai multe fisiere sunt privite in ansamblu, eliminandu-se pe cat posibil
informatiile redondante. In acelasi timp se permite accesul simultan la aceleasi date a
mai multor persoane.

Exemplul 1.1. Pentru o facultate pot fi pastrate de exemplu pe perioade mari


de timp informatii privind studentii, personalul, salile, planul de invatamant,
aparatura si alte elemente despre care diferite persoane pot cere informatii la un
moment dat. Intre aceste elemente exista diferite relatii cum ar fi: unii studenti fac
anumite cursuri, unele cursuri se tin in anumite sali, unele aparate se afla in anumite
sali, unele persoane pot tine cursuri si alte relatii asemanatoare.

Sistemul de programe cu care se pot construi bazele de date, se pot introduce


date in bazele de date si se pot dezvolta aplicatii privind bazele de date se numeste
sistem de gestiune al bazelor de date (SGBD). Un SGBD da posibilitatea
utilizatorului sa aiba acces la date folosind un limbaj de tip inalt apropiat de modul
obisnuit de exprimare pentru a obtine informatii, utilizatorul facand abstractie de
algoritmii aplicati pentru selectionarea datelor implicate si a modului de memorare a
lor. SGBD-ul este o interfata intre utilizatori si sitemul de operare.

Orice SGBD contine printre alte componente un limbaj de descriere a


datelor (LDD) care permite descrierea structurii unei baze de date, a fiecarei
componente a ei, a relatiilor dintre ele, a drepturilor de acces ale utilizatorilor la baza
de date, a restrictiilor in reprezentarea informatiilor si alte elemente asemanatoare. O
alta componenta foarte inportanta a unui SGBD este limbajul de cereri (LC) sau
limbajul de prelucrare a datelor (LPD) ce permite operatii asupra datelor aflate in
baza de date cum sunt: incarcarea bazei de date, inserarea unui nou element, stergerea
unui element, modificarea unuui element, cautarea unor elemente, diferite statistici
asupra datelor si alte operatii asemanatoare.

Spre deosebire de limbajele de programare obisnuite in care declararea datelor


este facuta in acelas loc cu prelucrarea lor, bazele de date prevad limbaje separate
pentru declarare si pentru prelucrare. Aceasta deoarece intr-un program obisnuit
datele 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

mai putin (cerere C2 (cerere C2 gestionar gestionar baza


frecvent program compilata) baza date fisiere date
aplicativ) fizica

rar (schema compilator (descriere


baza date) LDD 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.
- Asigurarea sincronizarii in cazul utilizarii bazei de date simultan de mai
multi utilizatori sau a distribuirii informatiei pe mai multe sisteme.

Utilizatorii bazelor de date pot fi impartiti in urmatoarele clase:

- Utilizatorii obisnuiti care pot sa obtina informatiile fara sa aiba cunostinte


de programare. Ei obtin informatiile pe care le doresc prin comenzi stiute si eventual
raspunzand la diferitele optiuni pe care i le indica sistemul de calcul la un moment
dat.

- Programatorii de aplicatii care pot scrie programe in LC, acestea fiind apoi
compilate si memorate in fisiere putand fi lansate in executie de utilizatori prin
invocarea numelui asociat lor.

- Administratorul bazei de date care stabileste structura initiala a bazei de


date si modul de memorare a datelor la nivel fizic, acorda drepturi de acces al
utilizatorilor la baza de date sau parti ale ei, stabileste conditiile pentru asigurarea
securitatii si integritatii datelor, modifica structura bazei de date daca este nevoie,
asigura intretinerea bazei de date facand periodic copii si reconstituid eventual baza
de date in cazul cand au aparut erori datorate componentelor soft, hard sau de
utilizare si raspunde in general de modul de utilizare al bazei de date.

- Administratorul sistemului de baze de date care stabileste bazele de date


de pe un sistem de calcul, aloca spatii de memorare si asigura drepturi de acces.

Cele mai multe SGBD-uri contin si diferite utilitare folosite in diferitele


aplicatii cum sunt: procesoare pentru limbaje de cereri, editoare de rapoarte,
subsiteme de reprezentari grafice, posibilitati de lucru tabelat, procesoare de limbaje
naturale, programe statistice, posibilitati de copiere, generatoare de aplicatii
(procesore inteligente de tip "4GL") si alte posibilitati de dezvoltari aplicatii de tip
CASE (computer-aided software engineering).

Pentru a usura munca administratorului de sistem un SGBD contine o serie de


componente ce permit incarcarea (crearea unei versiuni initiale a bazei de date
plecand de la unul sau mai multe fisiere), salvarea si reincarcarea (efectuarea de copii
periodice si posibilitatea refacerii bazei de date plecand de la aceste copii),
reorganizarea (rearanjarea datelor pentru a obtine performante superioare), statistici,
analize si altele.

CURSUL 2

2. Arhitectura unei baze de date

O baza de date poate fi privita din mai multe puncte de vedere cum sunt:

- Punctul de vedere al utilizatorilor care privesc anumite parti componente ale


bazei de date numite vederi. Vederile sunt descrise prin subscheme in sublimbaje ale
limbajului de descriere a datelor. De asemenea utilizatorii pot sa primesca raspunsuri
la diferitele cereri formulate prin intermediul limbajului de prelucrare a datelor.
- Punctul de vedere al administratorului de baza de date care integreaza toate
vederile ce privesc baza de date intr-un singur model numit schema conceptuala.
Schema conceptuala constituie nivelul logic al bazei de date.

- Punctul de vedere al implementatorului bazei de date (care de cele mai multe


ori coincide cu administratorul bazei de date) care priveste baza de date ca o colectie
de fisiere memorate pe diferite medii externe cum sunt benzile si discurile magnetice.
Acesta constituie nivelul fizic al bazei de date fiind de fapt singurul nivel existent
efectiv.

Fiecare dintre cele trei nivele contine subnivele. De exemplu utilizatorii pot fi
utilizatori obisnuiti, fara cunostinte de programare sau programatori de aplicatii,
organizarea vederilor corespunzatoare lor fiind diferita. La fel nivelul fizic poate sa
contina un subnivel logic in care conteaza semnificatia diferitelor campuri din
inregistrarile fisierelor si structurile de date asociate si un subnivel fizic in care
esential este numai modul de organizare si gestionare a blocurilor pe memoria
externa.

Primele doua nivele sunt descrise prin planuri ce constau in enumerarea


tipurilor de entitati ce apar in baza de date, relatiile intre aceste tipuri de entitati si
modul de trecere de la notiunile acestui nivel la nivelul imediat urmator. In mod
curent aceste planuri se numesc scheme externe sau subscheme conceptuale sau
vederi pentru primul nivel si scheme conceptuale pentru al doilea nivel. Descrierile la
nivel fizic sunt facute prin scheme interne sau scheme fizice.

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.
In reprezentarea intuitiva a vederilor intervin notiunile de entitate, relatie,
atribut, cheie, functionalitate, diagrama si altele pe care le vom definii ulterior.

Notiunea de entitate nu se poate defini formal fiind o notiune primara. Mai


multe elemente de acelasi tip formeaza o entitate. Cateva exemple de entitati sunt:
persoana, student, sala, culoare, simt, padure, etc. O problema foarte importanta in
definirea vederilor este fixarea entitatilor asociate ei adica a claselor de obiecte cu
care se opereaza in vederea respectiva.

Fiecare entitate este descrisa de o multime de proprietati esentiale numite


atribute care pentru diferitele elemente ale entitatii pot sa primeasca valori din
anumite multimi numite domeniul atributului. De obicei domeniile sunt submultimi
ale multimii numerelor reale sau ale multimii numerelor intregi sau ale multimii
sirurilor de caractere. Alegerea atributelor asociate entitatilor este o alta problema
foarte importanta in definirea vederilor.

Un atribut sau o multime de atribute pentru care valorile asociate determina in


mod unic orice element al entitatii respective se numeste cheie. De obicei orice
entitate admite cel putin o cheie deci inplicit se considera ca toate elementele unei
entitati sunt distincte. In cazurile in care exista elemente care sa aiba aceleasi valori
pentru toate atributele se ia drept cheie un atribut suplimentar ce defineste numarul
asociat elementului in entitatea
respectiva care defineste in mod unic elementul.

Numim relatie intre entitatile E1,E2,...,Ek orice submultime a produsului


cartezian al multimilor elementelor celor k entitati, adica multimi de elemente de
forma (e1,e2,...,ek) unde e1 este un element din E1, e2 este un element din E2 si asa
mai departe. O astfel de relatie o notam REL(E1,E2,...,Ek) si spunem ca are aritatea
k. De cele mai multe ori k=2 deci se lucreaza cu relatii binare.

In cazul relatiilor binare se poate face o clasificare a lor in functie de cate


elemente corespund fiecarui element dintr-o entitate in cealalta entitate dupa cum
urmeaza:

- relatie unu-la-unu (notata 1:1) in cazul in care fiecarui element din prima
entitate ii corespunde cel mult un element din a doua entitate si reciproc.

- relatie unu-la-mai-multi (notata 1:N) in cazul in care fiecarui element al


primei entitati ii pot corespunde mai multe elemente din cea de-a doua entitate dar
fiecarui element din a doua entitate ii corespunde cel mult un element din prima
entitate.

- relatie mai-multi-la-mai-multi (notata M:N) in cazul in care fiecarui element


al primei entitati ii pot corespunde mai multe elemente din cea de-a doua entitate si
reciproc.

In practica cele mai des intalnite sunt ultimile doua tipuri de relatii dar la
implementarea bazelor de date de cele mai multe ori ultimul tip se reduce la relatii de
tipul 1:N dupa cum vom vedea in continuare.
Exemplul 1.2. ?????? - de construit ??????

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
Schemele interne descriu diferitele fisiere utilizate pentru memorarea
informatiilor bazei de date si modul de operare cu ele. Dintre multiplele moduri de
organizare a fisierelor vom descrie in capitolul al saselea al acestei lucrari organizarea
secventiala, organizarea cu index rar si index dens, organizarea cu dispersie si
organizarea folosind B-arbori. Vor fi discutate si alte probleme speciale legate de
organizarea fisierelor cum ar fi cautarea informatiilor dupa chei secundare sau chei
incomplete si memorarea inregistrarilor de dimensiuni variabile.

Traducerea schemelor conceptuale in scheme interne se face de obicei automat


de catre SGBD. Pe langa stabilirea diferitelor tipuri de inregistrari utilizate in
reprezentarea fizica a datelor se specifica si existenta indexilor asociati unor fisiere,
semnificatia campurilor inregistrarilor, ordinea de aparitie a inregistrarilor si modul
de acces.

6. Introducere in proiectarea bazelor de date

Proiectarea bazelor de date presupune fixarea structurii bazei de date si a


metodelor de prelucrare a datelor spre deosebire de utilizarea bazei de date care
priveste mai mult ceeace contine baza de date la un moment dat. Daca baza de date isi
schimba frecvent continutul, structura ei ramane nemodificata pe lungi perioade de
timp.

Prin proiectare se determina un model semantic in care sa se reflecte cat mai


fidel lumea reala construit astfel:

1. Se identifica o multime de concepte semantice (entitati, tipuri de entitati,


proprietati ale entitatilor, identificatorii entitatilor, relatii intre entitati si altele) ce dau
informatii despre lumea reala.

2. Se asociaza obiecte simbolice formale prin care sunt reprezentate conceptele


semantice.

3. Se definesc reguli de integritate formale ce se aplica obiectelor simbolice.

4. Se defineste o multime de operatori formali ce pot sa transforme obiectele formale.

Un model de etapizare a construirii unei baze de date ar putea fi urmatorul:

1. Studiul de fezabilitate consta in cercetarea sistemelor operative deja


existente, stabilirea unor alternative cu evaluarea costurilor, a avantajelor
si dezavantajelor fiecarei alternative in parte.

2. Cercetarea sistemului prin determinarea diferitelor detalii ale sistemului


prezent (tipuri de date, dimensiuni, conditii exceptie) folosind metode de
interogare, chestionare, exemplificari si observatii directe.

3. Analiza sistemului prin determinarea cauzelor diferitelor evenimente si a


adoptarii diferitelor metode, eventualele alternative posibile.
4. Proiectarea sistemului prin determinarea celui mai bun model de reprezentare
si prelucrare a datelor, de asigurare a securitatii si integritatii.

5. Dezvoltarea sistemului prin stabilirea detaliilor asociate datelor asociate,


a relatiilor dintre ele si a modului de reprezentare fizica.

6. Implementare prin proiectarea, scrierea si testarea programelor, antrenarea


utilizatorilor, alcatuirea documentatiei, crearea si incarcarea fisierelor.

7. Revizuire si intretinere prin probe de lucru ale noului sistem, efectuarea


unor eventuale modificari, adaugarea de noi componente si urmarirea
procesului de prelucrare a datelor.

In proiectarea bazelor de date se tine seama de independenta datelor pe


diferite nivele. De exemplu reprezentarea fizica a datelor se poate schimba in timp
pentru a obtine performante superioare din punct de vedere al timpului de raspuns si
al spatiului ocupar fara ca aceasta sa afecteze modul de reprezentare a datelor in
schema conceptuala. Acesta independenta se numeste independenta fizica a datelor.
De asemenea intre vederi si schema conceptuala apare o independenta numita
independenta logica a datelor. In timpul existentei unei baze de date pot apare
modificari in schema conceptuala prin adaugarea unor noi entitati sau prin adaugarea
de noi atribute unor entitati existente. Vederile care nu fac referiri la campurile
modificate raman neschimbate fiind rescrise numai aplicatiile pentru care s-au
modificat unele atribute sau pot fi construite vederi noi.

Proiectarea unei baze de date priveste in primul rand nivelul logic si mai putin
cel fizic. Proiectarea se poate face plecand de la modelul relational care permite o
tehnologie de proiectare si apoi se poate transforma rezultatul proiectarii in oricare
dintre modele prin adaptarile corespunzatoare.

Capitolele urmatoare descriu pe larg structura bazelor de date si in cea mai


mare parte vom urmarii acrivitatile specifice privind proiectarea bazelor de date
legate de toate notiunile prezentate.

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
intr-o 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


intr-o 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-la-mai-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.
Un pas important in proiectarea unei baze de date corespunzatoare unui sistem
este determinarea vederilor si claselor de utilizatori asociate lor. Acestea se stabilesc
de obicei prin colaborarea persoanelor cu responsabilitati in sistem.

Utilizarea vederilor permite independenta logica a datelor in sensul ca


informatiile si programele utilizatorilor nu sunt dependente de structura logica a bazei
de date ce se poate modifica in timp prin extindere sau restructurare.

Extinderea se poate face fie prin adaugarea de noi atribute la relatiile existente
in baza de date fie prin adaugarea unor relatii noi. Restructurarea presupune
rearanjarea diferitelor atribute in noi relatii.

Vederile permit ca aceleasi date sa fie privite in mod diferit de diferitii


utilizatori. Prin ele se simplifica modul de percepere al utilizatorilor prin ignorarea
informatiilor care nu sunt importante pentru aplicatia respectiva. Importanta este si
asigurarea automata a securitatii datelor la care utilizatorii nu au acces.

3. Construirea unei vederi utilizator

Se stabilesc persoanele de la care urmeaza sa fie obtinute informatiile privind


vederea respectiva, ordinea in care urmeaza sa fie intervievati, subiectele ce urmeaza
sa fie discutate si ce intrebari esentiale trebuiesc puse. Se urmareste obtinerea unor
informatii relevante pentru sistemul respectiv, concise, corecte si actuale. Vederile
trebuiesc sa fie concepute adaptabile in sensul de a putea fi schimbate in functie de
necesitatile utilizatorului.

Avand o structura generala a aplicatiei, cunoscand persoanele ce utilizeaza


acea parte de sistem si informatiile de care au ele nevoie se poate construi un model
de informatii pentru vederea respectiva. Plecand de la o schita grafica avand
principalele elemente, pe baza discutiilor avute si a observarii sistemului existent sunt
precizate detaliile si sunt facute corecturile necesare. Se stabilesc de asemenea
fluxurile de resurse, diferitele legaturi cu exteriorul (interfete) si limitari existente.

Pentru construirea vederilor se pot aplica diferite strategii cum sunt:

- metoda elementelor componente (Organisation Chart approach) prin care se


definesc pe rand fiecare din elementele componente ale vederii;
- integrarea ulterioara (Integration Later) prin punerea de acord a
informatiilor comune diferitelor componente;
- metoda de sus in jos (Top Down approach) in care detaliile sunt precizate
pe nivele succesive;
- metoda colectiei de date (The Data Collection approach) in care se face o
achizitie de date ce urmeaza sa fie analizate in momentul punerii in baza de
date retinandu-se numai datele utile;
- metoda bazei de date (The Data Base approach) in care datele sunt
achizitionate sub forma de reprezentare din baza de date.
Se construieste o diagrama de tip entitate-relatie in care entitatile sunt
reprezentate prin dreptunghiuri si relatiile prin linii intre entitati.

Exemplul 2.1. Un prim model pentru o vedere a unei facultati avand drept
utilizatori membrii Colectivului de Conducere este cel din fig. 2.1.

___________________
| |
| STUDENTI |
|_________________|
/ \
/ \
/ \
__________________ _________________ ________________
| | | CADRE | | PERSONAL |
| CURSURI |-------------| DIDACTICE |-------| AJUTATOR |
|________________| |_______________| |______________|

Figura 2.1.

4. Integrarea vederilor utilizatorilor

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.
1. Modelul relational de baze de date

Un model relational de baze de date cuprinde trei componente principale:

- Structura datelor prin definirea unor domenii (valori atomice) si a relatiilor


n-are (atribute tupluri, chei primare).

- Integritatea datelor prin impunerea unor restrictii.

- Prelucrarea datelor prin operatii din algebra relationala sau calculul


relational.

Modelul relational se bazeaza pe notiunea matematica de relatie asa cum este


definita in teoria multimilor si anume ca o submultime a produsului cartezian a unei
liste finite de multimi numite domenii. Elementele unei relatii se numesc tupluri si
numarul de domenii (nu toate distincte) din produsul cartezian se numeste aritatea
relatiei. De exemplu (a1,a2,...,ak) sau mai pe scurt a1a2...ak cu ai din Di pentru orice
i=1...k reprezinta un tuplu al unei relatii de aritate k in care ai reprezinta cel de-al i-
lea element al tuplului.

De obicei relatiile sunt reprezentate sub forma unor tabele in care fiecare rind
reprezinta un tuplu si fiecare coloana reprezinta valorile tuplurilor dintr-un domeniu
dat al produsului cartezian.

Coloanelor unei relatii in reprezentarea sub forma de tabel si respectiv


domeniilor corespunzatoare lor li se asociaza nume numite atribute. Multimea
numelor atributelor unei relatii se numesta schema relationala. Daca relatia numita R
are atributele A1,A2,...,Ak, atunci schema relationala se noteaza R(A1,A2,...,Ak).

Un alt mod de a defini relatiile este urmatorul: prin relatie intelegem o


multime de functii definite pe o multime de atribute cu valori in reuniunea unor
domenii cu restrictia ca valoarea corespunzatoare fiecarui atribut sa se afle in
domeniul asociat acelui atribut.

Trecerea de la un mod de definire al relatiei la celalalt se face relativ simplu.


O relatie in sensul de multime se transforma intr-o relatie in sensul de functii asociid
fiecarui domeniu D1,D2,...,Dk al produsului cartezian cate un nume de atribut
A1,A2,...,Ak si definind pentru fiecare tuplu tj=(aj1,aj2,...,ajk) functia fj cu
fj(Ai)=aji, i=1,...,k. Multimea acestor functii formeaza o relatie in sensul celei de-a
doua definitii. Trecerea inversa se face impunand o relatie de ordine totala pe
multimea atributelor si asociind fiecarei functii tuplul obtinut din valorile functiei
respective in ordinea corespunzatoare atributelor.

Din punct de vedere al bazelor de date cea de-a doua definitie este de preferat
deoarece permite prelucrarea informatiilor corespunzatoare unui atribut fara a
cunoaste pozitia acelui atribut in relatie, aceasta permitand o mai mare independenta
de reprezentare a datelor.
Pentru relatiile ce constituie o baza de date se fac diferite presupuneri initiale
cum ar fi: neexistenta unor tupluri duplicate, neaparitia intr-o ordine data a tuplurilor,
neaparitia intr-o ordine data a atributelor, toate atributele pot sa aiba numai valori
atomice (nedecompozabile) si altele.

Se numeste candidat de cheie a unei relatii coloana sau multimea de coloane


din R pentru care valorile corespunzatoare lor din oricare doua tupluri nu coincid,
deci identifica tuplurile din relatia respectiva, si nu contin strict o submultime de
coloane cu aceasta proprietate. Pentru fiecare relatie se alege un candidat de cheie
care se numeste cheie prinmara a relatiei. Tuplurile unei relatii nu pot sa contina
valoarea nula in coloane ce apartin cheii primare. Evantualii candidati de cheie
diferiti de cheia primara se numesc chei alternante. Se numeste cheie straina o
coloana sau o multime de coloane a unei relatii R1 ale caror valori, daca nu sunt nule,
coincid cu valori ale unei chei primare dintr-o relatie R nu neaparat distincta de R1.

Multimea tuturor schemelor relationale corespunzatoare unei aplicatii se


numeste schema bazei de date relationale iar continutul curent al relatiilor la un
moment dat se numeste baza de date relationala.

In modelul relational entitatile sunt reprezentate sub forma de relatii in care


schema relationala contine toate atributele entitatii si fiecare tuplu al relatiei
corespunde unui element al entitatii. La atributele entitatii se pot adauga in relatie si
eventuale atribute suplimentare utilizate pentru exprimarea relatiilor intre entitati. O
relatie intre entitatile E1,E2,...,Ek se reprezinta ca o relatie in care fiecare tuplu
(e1,e2,...,ek) reprezinta un element al relatiei initiale cu ei reprezentand o cheie pentru
relatia Ei asociata.

Cele mai multe cereriri privesc determinarea unor informatii cu anumite


proprietati iar raspunsul posibil este o relatie care descrie toate elementele cu aceste
proprietati. Modul de prezentare al raspunsului depinde de interfata dintre SGBD si
utilizator.

1.1. Limbaje de prelucrare a datelor pentru modelul relational

Limbajele de prelucrare a datelor sau mai pe scurt limbajele de cereri pentru


modelul relational se pot imparti in doua mari categorii:

- limbaje algebrice in care cererile sunt exprimate prin operatorii pe


care trebuie sa-i aplicam relastiilor existente in baza de date pentru
a obtine raspunsul

- limbaje cu calculul predicatelor in care cererile sunt exprimate sub


forma unor multimi de tupluri sau valori pentru care se specifica
proprietatile pe care trebuie sa le indeplineasca sub forma unor
predicate.

A doua clasa se divede in doua subclase in functie de obiectele cu care


opereaza predicatele si anume:
- limbaje cu calcul pe tupluri daca obiectele primare sunt tupluri

- limbaje cu calcul pe domenii daca obiectele primare sunt domeniile


diferitelor atribute ale relatiilor.

Sistemele de gestiune a bazelor de date existente contin majoritatea operatiilor


derscrise in continuare pentru unul sau o combinatie de limbaje de acest tip. Pot
exista implementate si alte operatii care permit o mai usoara utilizare a sistemelor
respective dupa cum vom vedea in cele ce urmeaza.

1.1.1. Algebra relationala

Algebra relationala consta dintr-o colectie de operatori ce au ca operanzi


relatii. Rezultatul aplicarii unui operator la una sau doua relatii (in functie de aritatea
acelui operator) este tot o relatie.

In cele ce urmeaza vom presupune ca toate relatiile sunt cu un numar finit de


tupluri distincte si sunt descrise print-o multime ordonata de atribute. Atributele se
deosebesc prin pozitia pe care o ocupa in relatie sau prin numele asociat, numarul
atributelor dand aritatea relatiei.

Operanzii algebrei relationale sunt fie relatii constante fie variabile ce


reprezinta relatii de o aritate data. Cererile din algebra relationala pot fi exprimate
prin cinci operatii asupra relatiilor pe care le vom numi operatii de baza si anume:

1. Reuniunea. Reuniunea relatiilor R si S, notata R U S, este multimea


tuplurilor care se gasesc in cel putin una din relatiile R sau S.
Aceasta operatie se poate aplica numai in cazul cand R si S au
aceeasi aritate si atributele corespunzatoare iau valori in acelesi
domenii, rezultatul avand si el aceeasi aritate ca cele doua
relatii si acelesi domenii asociate. Daca atributele au nume se cere
in plus ca cele doua liste de nume sa coincida si rezultatul are
aceiasi lista de nume pentru atribute.

2. Diferenta. Diferenta relatiilor R si S, notata R - S, este multimea


tuplurilor din R care nu sunt in S. Trebuiesc indeplinite aceleasi
conditii ca pentru reuniune.

3. Produsul cartezian. Fie relatiile R de aritate r si S de aritate s.


Produsul cartezian al relatiilor R si S, notat R X S, este multimea
tuplurilor cu r+s componente in care primele r componente formeaza
un tuplu in R si ultimile s componente formeaza un tuplu in S. Daca
atributele au nume, lista numelor atributelor din rezultat este
reuniunea disjuncta a celor doua liste (folosind calificari sau
redenumiri pentru atribulele cu acelasi nume in cele doua relatii).

4. Proiectia. Fie relatia R de aritate r. Proiectia relatiei R dupa


campurile i1,i2,...,ik, notata /Pi1,i2,...,ik(R) este multimea
tuplurilor de aritate k a1a2...ak pentru care exista un tuplu
b1b2...br in R astfel incat a1=bi1, a2=bi2, ... , ak=bik. Daca
relatia R are asociate nume pentru atribute, se pot inlocui indicii
cu numele atributelor respective, aceste nume pastrandu-se si in
relatia rezultata.

5. Selectia sau restrictia. Fie F o formula logica formata din operanzi


care sunt constante sau numere de componente in tupluri, operatori de
comparare aritmetica <,=,>,<=,!=,>= si operatori logici A (si), V
(sau) si ! (non). Selectia relatiei R in raport cu formula F, notata
/SF(R) este multimea tuplurilor t din R pentru care formula F devine
adevarata prin inlocuirea fiecarui numar de componenta i din ea cu
valoarea celei de-a i-a componente a tuplului t. Daca relatia R are
asociate nume pentru atribute, se pot inlocui indicii cu numele
atributelor respective, relatia rezutat avand pentru atribute
aceleasi nume ca si relatia R. Pentru a se deosebi de indicii sau
numele atributelor, toate constantele care apar in F sunt incluse
intre apostroafe.

Exemplul 3.1. Daca pentru relatia R(A,B,C) consideram continutul actual


R = {(a,b,c), (d,a,f), (c,b,d)} si pentru relatia S(D,E,F) consideram continutul actual S
= {(b,g,a), (d,a,f)}, atunci R U S = {(a,b,c), (d,a,f), (c,b,d), (b,g,a)}, R - S = {(a,b,c),
(c,b,d)}, R X S = {(a,b,c,b,g,a), (a,b,c,d,a,f), (d,a,f,b,g,a), (d,a,f,d,a,f), (c,b,d,b,g,a),
(c,b,d,d,a,f)}, /PA,C(R) = {(a,c), (d,f), (c,d)} si /SB='b'(R) = {(a,b,c), (c,b,d)}.

Pe langa cele cinci operatii de baza mai pot fi utilizate si alte operatii numite
operatii derivate ce se pot exprima in functie de operatiile de baza. Utilizarea acestor
operatii permit o mai simpla exprimare a cererilor si uneori, daca sunt bine
implementate se poate obtine si un raspuns mai rapid. Cele mai des utilizate operatii
derivate sunt urmatoarele:

6. Intersectia. Intersectia relatiilor R si S, notata R /O S, este


multimea tuplurilor care se gasesc in ambele relatii. Aceasta
operatie se poate aplica numai in cazul cand R si S indeplinesc
conditiile specificate la reuniune. Intersectia se poate exprima prin
operatiile de baza cu formula:
R /O S = R - (R - S)

7. Catul. Fie relatiile R de aritate r si S de aritate s cu r>s si S !=


/O. Catul lui R prin S, notat R /- S este multimea tuplurilor t de
aritate r-s astfel incat pentru orice tuplu u al lui s tuplul tu este
in R. Daca atributele celor doua relatii au nume atunci lista
atributelor lui S trebuie sa fie o submultime a listei atributelor
lui R si rezultatul are ca lista de atribute diferenta celor doua
liste. Catul se poate exprima prin operatiile de baza cu formula:
R /- S = /P1,2,...,r-s(R) - /P1,2,...,r-s((/P1,2,...,r-s(R) X S) - R)

8. Uniunea. O /0-uniune a relatiilor R si S dupa coloanele i si j,


notata R |X| S, unde /0 este un operator de comparatie, este multimea
i/0 j
tuplurilor produsului cartezian dintre R si S pentru care a i-a
componenta a lui R se afla in relatia /0 cu a j-a componenta a
relatiei S. Daca /0 este = operatia se numeste echiuniune. Uniunea se
poate exprima prin operatiile de baza cu formula:
R |X| S = /S i/0(r+j) (R X S)
i/0 j
Daca R si S au nume pentru atribute, atunci in loc de i si j se pot
folosi numele atributelor corespunzatoare.

9. Uniunea naturala. Uniunea naturala a relatiilor R si S, notata R|X|S,


se aplica daca cele doua relatii au nume asociate atributelor si in
acest caz se selecteaza din produsul cartezian al relatiilor R si S
acele tupluri ce contin valori comune pentru campurile numite la fel
in cele doua relatii si apoi se elimina valorile din campurile lui S
comune cu cele ale lui R. Daca relatiile R si S au in comun
atributele A1,A2,...,Ak atunci se obtine formula:
R |X| S = /Pi1,i2,...,im(/SR.A1=S.A1A...AR.Ak=S.Ak(R X S))
unde i1,i2,...,im este lista atributelor lui R X S luate in ordine cu
exceptia atributelor S.A1,S.A2,...,S.Ak.

Exemplul 3.2. Pentru relatiile R si S din exemplul 3.1 intersectia este R /O S =


{(c,b,d)}. Daca R = {(a,b,c,d), (a,b,e,f), (b,c,e,f), (e,d,c,d), (e,d,e,f), (a,b,d,e)} si S =
{(c,d), (e,f)} atunci R /- S = {(a,b), (e,d)}. Daca relatia R(A,B,C) are continutul
actual R = {(1,2,3), (4,5,6), (7,8,9)} si relatia S(D,E) are continutul actual S = {(3,1),
(6,2)}, notand cu T relatia
R |X| S se obtine T(A,B,C,D,E) care are continutul actual T = {(1,2,3,3,1),
B<D
(1,2,3,6,2), (4,5,6,6,2)}. Daca relatia R(A,B,C) are continutul actual R = {(a,b,c),
(d,b,c), (b,b,f), (c,a,d)} si S(B,C,D) are continutul actual S = {(b,c,d), (b,c,e),
(a,d,b)}, atunci R |X| S = {(a,b,c,d), (a,b,c,e), (d,b,c,d), (d,b,c,e), (c,a,d,b)}.

Cu operatorii din algebra relationala se pot defini noi relatii ce pot fi utilizate
pentru: regasirea unor informatii din baza de date, definirea unor reactualizari
(inserare, stergere sau modificare) in baza de date, definirea unor date virtuale
(vederi), definirea unor rezultate intermediare, definirea unor drepturi de acces la
date, definirea unor cerinte de stabilitate in cazul accesului concurent la date,
definirea constrangerilor de integritate si altele.

Nu se poate obtine cea mai eficienta interpretare a cererilor din algebra


relationala efectuand calculele in ordinea indicata in expresia asociata. De exemplu
pentru expresia /P C(/S A=a(R |X| S)) aplicata relatiilor binare R(A,B) si S(B,C) care
se poate evalua prin succesiunea uniune, apoi selectie si in final proiectie se poate
gasi o transformare intr-o expresie echivalenta /P C(/P B(/S A=a(R)) |X| S) in care se
efectueaza pe rand selectie, proiectie, uniune si din nou proiectie care in general este
mult mai eficienta din punct de vedere al spatiului ocupat si al timpului de calcul,
lucrandu-se tot timpul cu relatii mai mici atat ca lungimea inregistrarilor cat si ca
numar.

Se poate obtine o eficienta mai buna daca uneori se combina mai multi
operatori ce pot sa apara intr-o succesiune data in diferitele cereri. Un exemplu ar fi
expresia selectie-uniune-proiectie care poate sa apara relativ frecvent in cereri prin
selectarea unor tupluri ale unei relatii, combinarea acestora cu tuplurile altei relatii
prin 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
calitate (libere sau legate si in formula rezultata.

5. Pot fi adaugate sau eliminate paranteze daca nu mai sunt necesare


tinand seama de urmatoarea ordine de precedenta: operatori de
comparatie apoi cuantificatorii /E si /V apoi ! apoi A apoi V,
operatorii aplicandu-se de la stanga la dreapta in cazul a doi
operatori consecutivi cu aceeasi prioritate.

6. Orice formula se obtine aplicand de un numar finit de ori regulile


1 - 5.

O expresie a calculului relational pe tupluri este o expresie de forma {t | /v(t)}


unde t este singura variabila tuplu care are ocurente libere in /v.

Exemplul 3.3. Daca relatia R are aritatea doi atunci expresia


{t | (/Eu)(R(t) A R(u) A (t[1]!=u[1] V t[2]!=u[2]))}
este relatia vida daca R are cel mult un element si R in caz contrar.

Deoarece expresii de forma {t | !R(t)} care ar insemna multimea tuturor


tuplurilor de aceeasi aritate cu R care nu se afla in R nu are in general sens putand da
relatii infinite in bazele de date ce utilizeaza calculul relational pe tupluri se folosesc
numai o submultime de expresii numite expresii sigure.

Daca /v este o formula vom numi domeniul lui /v si vom nota DOM(/v)
multimea simbolurilor care apar in /v explicit sau sunt componentele unor tupluri din
continutul actual al relatiilor ce apar in /v. Deoarece toate relatiile folosite au
continutul actual finit, DOM(/v) este o multime finita.

Spunem ca o expresie a calculului relational pe tupluri {t | /v(t)} este sigura


daca pentru orice tuplu t care satisface /v, toate componentele lui t sunt elemente ale
lui DOM(/v).

Pentru a stabili valoarea de adevar a formulelor de forma (/Et)(/v(t)) si (/Vt)


(/v(t)) numai prin valori pentru componentele lui t din DOM(/v) facem urmatoarele
conventii:

- /v(t) este falsa pentru toate tuplurile t ce contin cel putin o


componenta in afara lui DOM(/v) pentru formula (/Et)(/v(t)).

- /v(t) este adevarata pentru toate tuplurile t ce contin cel putin o


componenta in afara lui DOM(/v) pentru formula (/Vt)(/v(t)).

Un exemplu de gramatica pentru definirea calculului relational pe tupluri este


urmatoarea:

definire-domeniu ::= RANGE OF variabila IS lista-domenii


lista-domenii ::= domeniu | domeniu , lista-domenii
domeniu ::= relatie | (expresie)
expresie ::= lista-rezultat [ WHERE formula ]
lista-rezultat ::= rezultat | rezultat , lista-rezultat
rezultat ::= [ atribut = ] variabila . atribut | variabila
formula ::= comparatie | NOT formula | comparatie AND formula |
comparatie OR formula | IF comparatie THEN formula |
EXISTS variabila ( formula ) | FORALL variabila ( formula )
variabila ::= ...
relatie ::= ...
atribut ::= ...
comparatie ::= ...

Pentru variabila, relatie si atribut se definesc identificatori ce definesc elementele


respective si comparatie defineste o expresie in care apare un operator de comparare
intre doua expresii scalare.

1.1.3. Reducerea algebrei relationale la calculul relational pe tupluri

Vom arata in continuare cum se poate trece de la o cerere in algebra


relationala la o cerere in calculul relational pe tupluri. Demonstratia teoremei da si
algoritmul prin care se poate face aceasta trecere.

Teorema 3.1. Daca E este o expresie din algebra relationala, atunci exista o
expresie sigura in calculul relational pe tupluri echivalenta cu E.

Demonstratie. Vom aplica metoda inductiei complete dupa numarul


ocurentelor operatorilor din expresia E.

Daca E nu contine nici-un operator atunci E poate fi sau o variabila relatie R


sau o relatie constanta {t1,t2,...,tn}. In primul caz E este echivalenta cu expresia {t |
R(t)} care este sigura deoarece orice tuplu t care verifica R(t) are evident
componentele in DOM(R(t)) care contine toate valorile corespunzatoare
componentelor relatiei R. In cazul al doilea E este echivalenta cu expresia {t | t=t1 V
t=t2 V ... V t=tn} unde prin t=ti am notat formula t[1]=ti[1] A ... A t[k]=ti[k]
presupunand aritatea k pentru t. Cum si aceasta expresie este o expresie sigura luand
ca domeniu asociat reuniunea valorilor ce apar in componentele tuplurilor t1,...,tn,
proprietatea din enuntul teoremei este verificata pentru o expresie cu 0 ocurente de
operatori.

Sa presupunem acum ca E are cel putin un operator si ca proprietatea din


enuntul teoremei este adevarata pentru expresii cu mai putine ocurente de operatori
decat are E. Vom avea urmatoarele cazuri posibile:

1) E = E1 U E2. Cum E1 si E2 au mai putine ocurente de operatori decat E


aplicam ipoteza inductiei si admitem existenta expresiilor sigure {t | /v1(t)} si {t |
/v2(t)} echivalente respectiv cu E1 si E2. Atunci E este echivalenta cu exprtesia {t |
/v1(t) V /v2(t)} care este o expresie sigura avand domeniul DOM(/v1(t) V /v2(t)) =
DOM(/v1(t)) U DOM(/v2(t)).

2) E = E1 - E2. E1 si E2 admit expresii sigure ca in cazul 1) iar E este


echivalenta cu expresia {t | /v1(t) A !/v2(t)} care este o expresie sigura avand
domeniul DOM(/v1(t) A !/v2(t)) = DOM(/v1(t)) U DOM(/v2(t)).
3) E = E1 X E2. Daca E1 si E2 au artitatile m si respectiv n si le corespund
expresii sigure ca la 1), atunci E este echivalenta cu expresia
{t | (/Eu)(/Ev)(/v1(u) A /v2(v) A t[1]=u[1] A ... A t[m]=u[m]
A t[m+1]=v[1] A ... A t[m+n]=v[n])}
care este o expresie sigura avand ca domeniu DOM(/v1(u)) U DOM(/v2(v)).

4) E = /Pi1,i2,...,ik(E1). Daca E1 este echivalenta cu expresia sigura {t |


/v1(t)}, atunci E este echivalenta cu
{t | (/Eu)(/v1(u) A t[1]=u[i1] A ... A t[k]=u[ik]}
care este o expresie sigura avand ca domeniu o submultime a lui DOM(/v1(u)) si
anume multimea valorilor posibile pentru componentele i1,...ik ale lui u.

5) E = /SF(E1). Daca E1 este echivalenta cu expresia sigura {t | /v1(t)} atunci


E este echivalenta cu {t | /v1(t) A F'}, unde F' se obtine din F inlocuind fiecare
operand i cu t[i]. Aceasta expresie este sigura pe un domeniu inclus in DOM(/v1(t)).

Deoarece orice expresie din algebra relationala se poate obtine inductiv prin
aplicarea de un numar finit de ori a celor cinci operatii de baza rezulta ca proprietatea
din enuntul teoremei este adevarata.

Aplicand algoritmul de transformare a unei expresii din algebra relationala


intr-o expresie sigura din calculul relational pe tupluri rezultat din demonstratia
teoremei precedente nu se ajunge mereu la cea mai simpla expresie.

Exemplul 3.4. Compunerea a doua relatii binare R si S in sensul obisnuit din


teoria multimilor se poate exprima in algebra relationala prin expresia
/P 1,4 (/S 2=3 (R X S))
careia ii corespunde aplicand algoritmul expresia sigura
{w | (/Et)(/Eu)(/Ev)(R(u) A S(v) A t[1]=u[1] A t[2]=u[2] A t[3]=v[1]
A t[4]=v[2] A t[2]=t[3] A w[1]=t[1] A w[2]=t[4])}
dar exista si urmatoarea expresie sigura mai simpla echivalenta cu ea:
{w | (/Eu)(/Ev)(R(u) A S(v) A u[2]=v[1] A w[1]=u[1] A w[2]=v[2])}.

1.1.4. Calculul relational pe domenii

Calculul relational pe domenii permite exprimarea cererilor tot sub forma


unor expresii care se construiesc analog expresiilor calculului relational pe tupluri cu
urmatoarele deosebiri:

- in loc de variabile tuplu se folosesc variabile pe domeniu ce pot sa


ia drept valori elemente componente ale tuplurilor;

- un atom este de forma R(x1,x2,...,xk) unde R este o relatie de aritate


k si x1,x2,...,xk sunt constante sau variabile de domeniu sau de forma
x /0 y unde x si y sunt constante sau variabile de domeniu si /0 este
un operator relational aritmetic; semnificatia atomilor este analoaga
cu cea din calculul relational pe tupluri;

- in calculul relational pe domenii se folosesc operatorii A, V si ! ca


in calculul relational pe tupluri iar cuatificatorii (/Ex) si (/Vx) au
variabila x o variabila de domeniu; calitatea ocurentelor de liber sau
legat se defineste in acelasi mod.

O expresie a calculului relational pe domenii este de forma {x1x2...xk |


/v(x1,x2,...,xk}, unde /v este o formula pentru care singurele variabile pe domeniu
libere sunt x1,x2,...,xk.

Ca si in cazul calculului relational pe tupluri se defineste o expresie sigura a


calculului relational pe domenii o expresie pentru care se poate stabili daca formula
continuta in ea este adevarata sau nu numai pentru valori ale variabilelor domeniu
intr-o multime finita asociata.

1.1.5. Reducerea calculului relational pe tupluri la calculul


relational pe domenii

Pentru a transforma o expresie {t | /v(t)} a calculului relational pe tupluri intr-


o expresie echivalenta din calculul relational pe domenii, se introduc variabilele de
domeniu t1,t2,...,tk unde k este aritatea lui t si se defineste formula {t1t2...tk |
/v'(t1,t2,...,tk)} cu /v' obtinut din /v inlocuind orice atom R(t) cu R(t1t2...tk),
ocurentele lui t[i] prin ti, iar pentru cuantificatorii (/Eu) si (/Vu) cu u de aritate m se
introduc m noi variabile de domeniu u1,u2,...,um, se inlocuiesc cuantificatorii cu
(/Eu1) ... (/Eum) respectiv (/Vu1) ... (/Vum) iar in domeniul asociat acestor operatori
se inlocuieste fiecare ocurenta libera u[i] cu ui si R(u) cu R(u1u2...um).

Prin procedeul anterior se construieste o expresie a calculului relational pe


domenii care este echivalenta cu o expresie a calculului relational pe tupluri data. Se
poate demonstra urmatoarea proprietate:

Teorema 3.2. Pentru orice expresie sigura a calculului relational pe tupluri


exista o expresie sigura a calculului relational pe domenii echivalenta cu ea.

Demonstratia se face aratand ca metoda expusa anterior da expresii


echivalente si ca daca expresia initiala este sigura atunci si expresia rezultata este
sigura.

Exemplul 3.5. Expresia finala din exemplul 3.4 pentru compunerea a doua
relatii binare poate fi transformata prin procedeul descris obtinand:

{w1w2 | (/Eu1)(/Eu2)(/Ev1)(/Ev2)(R(u1u2) A S(v1v2) A


A u2=v1 A w1=u1 A w2=v2)}

1.1.6. Reducerea calculului relational pe domenii la algebra


relationala
Pentru a arata modul cum se poate trece de la o expresie sigura a calculului
relational pe domenii la o expresie din algebra relationala vom stabili cateva rezultate
preliminare.

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:

Cazul 1. /w(y1,y2,...,ym) = /w1(u1,u2,...,un) V /w2(v1,v2,...,vp) unde


u1,u2,...,un si reppectiv v1,v2,...,vp sunt variabile domeniu distincte din multimea
{y1,y2,...,ym} si fie, conform ipotezei de inductie E1 si E2 expresiile din algebra
relationala echivalente respectiv cu E**n /O {u1u2...un | /w1(u1,u2,...,un)} si
E**p /O {v1v2...vp | /w2(v1,v2,...,vp)}. Definim relatia
E'1 = /P i1,...,im(E1 X E**m-n)
unde ij este acel indice k astfel incat vk=yj daca acesta exista sau un indice unic intre
n+1 si m daca yj nu apare in multimea {v1,...,vn}. Similar se defineste
E'2 = /P i1,...,im(E2 X E**m-p)
atunci E'1 U E'2 este expresia din algebra relationala echivalenta cu E**m /O
{y1y2...ym | /w(y1,y2,...,ym)}.

Cazul 2. /w(y1,y2,...,ym) = !/w1(y1,y2,...,ym). Fie E1 expresia echivalenta


din algebra relationala corespunzatoare expresiei E**m /O {y1y2...ym |
/w1(y1,y2,...,ym)} care exista conform ipotezei de inductie. Atunci E**m - E1 este
expresia algebrei relationale echivalenta cu E**m /O {y1y2...ym | /w(y1,y2,...,ym)}.

Cazul 3. /w(y1,y2,...,ym) = (/Eym+1)(/w1(y1,y2,...,ym)). Fie E1 expresia


echivalenta din algebra relationala pentru E**m+1 /O (y1y2...ym+1 | /w1(y1,y2,
...,ym+1)}. Deoarece /v este sigura si deci si /w este sigura, /w1(y1,...,ym+1) poate sa
fie adevarata numai daca ym+1 este in multimea DOM(/w) care este o submultime a
lui DOM(/v). Deci /P 1,2,...,m (E1) este expresia echivalenta din algebra relationala
pentru expresia E**m /O {y1y2...ym | (/Eym+1)(/w1(y1,y2, ... ,ym,ym+1)} ceea ce
completeaza demonstratia teoremei.

Exemplul 3.6. Fie R si S doua expresii binare si expresia

{wx | R(wx) A (/Vy)(!S(wy) A !S(xy))}

Pentru a gasi expresia echivalenta din algebra relationala procedam in felul urmator.
Notam E = /P1(R) U /P2(R) U /P1(S) U /P2(S). Eliminam operatorii A si /V prin
metoda din lema 3.2 si obtinem

{wx | !(!R(wx) V (/Ey)(S(wy) V S(xy)))}

apoi pentru E**3 /O {wxy |S(wy) V S(xy)} obtinem expresia

E1 = /P 1,3,2(S X E) U /P 3,1,2(S X E)

iar pentru expresia E**2 /O {wx | (/Ey)(S(wy) V S(xy))} se obtine expresia

E2 = /P 1,2(E1) = /P 1,3(S X E) U /P 3,1(S X E)

si in final se obtine formula E**2 - ((E**2 - R) U E2) care este echivalenta cu R - E2


si deci expresia din algebra relationala cautata este

R - (/P 1,3(S X E) U /P 3,1(S X E))


Din proprietatile demonstrate anterior rezulta de fapt ca cele trei tipuri de
sisteme relationale sunt echivalente in sensul ca orice cerere ce se poate exprima in
unul din ele se poate exprima si in celelalte doua.
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

se calculeaza compunerea relatiilor curente R si S si se obtine o noua relatie numita


RCS. Pentru a obtine o formula pentru compunerea relatiilor R si S care poate fi
aplicata din cand in cand se poate scrie expresia

RCS = (N!R * N!S) : B=C % A,D

si o expresie ulterioara de tipul LIST RCS sau T = RCS + U permite evaluarea


expresiei numita RCS prin inlocuirea valorilor curente ale relatiilor R si S si apoi
listarea relatiei obtinute sau respectiv calculul reuniunii relatiei respective cu
continutul actual al lui U si numirea noii relatii cu T.

Operatorul N! este util atat pentru simplificarea scrierii unor cereri prin
numirea unor subexpresii din expresiile mai complicate cat si prin posibilitatea
construirii unor vederi.

Operatiile din ISBL au anumite particularitati. Reuniunea a doua relatii se


poate face daca cele doua relatii au aceleasi atribute, rezultatul avand si el aceleasi
atribute. Diferenta R - S este diferenta obisnuita numai daca cele doua relatii au
aceleasi atribute dar in general daca unele atribute ale lui R difera de cele din S atunci
R - S reprezinta multimea acelor tupluri t din R pentru care nu exista tupluri in S care
sa aiba aceleasi valori cu t pentru atributele comune celor doua relatii. De exemplu,
pentru relatiile R(A,B) si S(A,C) reprezinta expresia din algebra relationala R -
(@P/A(S) X @P/B(R)).

ISBL da posibilitatea redenumirii atributelor rezultate in proiectii prin


includerea in lista ce urmeaza dupa % a unor expresii de forma A->B care inseamna
"atributul A se include in proiectie dar in relatia rezultata se redenumeste cu B".
Redenumirea atributelor poate fi utilizata pentru definirea unor operatii prevazute in
algebra relationala. De exemplu, reuniunea relatiilor R(A,B) si S(A,C) cu rezultatul
avand atributele A si B se poate face cu

R + (S % A,C->B)

iar diferenta celor doua relatii cu rezultatul avand atributele A si C cu

(R % A,B->C) - S

si, in sfarsit, produsul cartezian al celor doua relatii cu rezultatul avand atributele
A,B,D,C se poate face cu expresia

R * (S % A->D,C)

Din cele prezentate anterior se vede ca oricare din cele cinci operatii de baza
din algebra relationala se pot reprezenta in ISBL de unde rezulta ca acesta este un
limbaj complet.
Exemplul 3.7(->8). Sa consideram o baza de date constutuita din relatiile:

CUMPARATORI(NUME,ADRESA,CONT)
COMENZI(NR_COM,NUME,MARFA,CANTITATE)
MAGAZINE(NUMEMAG,ADRESAMAG,MARFA,PRET)

Unei cereri de tipul "Listeaza cumparatorii care au contul negativ" se poate


exprima in ISBL sub forma:

LIST CUMPARATORI : CONT < 0 % NUME

Raspunsul la cererea "Listeaza numele magazinelor, marfurile si preturile


tuturor magazinelor care vand cel putin o marfa comandata de Popescu Dan" se poate
obtine prin succesiunea de expresii urmatoare:

CM = N!COMENZI * N!MAGAZINE
LIST CM : NUME = "Popescu Dan" % NUMEMAG,MARFA,PRET

Pentru o cerere de tipul "Listeaza toate magazinele care vand toate marfurile
comandate de Popescu Dan" se poate obtine raspunsul prin urmatoarea succesiune de
expresii:

M = N!MAGAZINE % NUMEMAG
B = N!MAGAZINE % MARFA
C = N!COMENZI : NUME = "Popescu Dan" % MARFA
NB = (N!M * N!B) - (N!MAGAZINE % NUMEMAG,MARFA)
NBC = N!NB.(N!M *N!C)
LIST M - (NBC % NUMEMAG)

Limbajul ISBL nu are inplementate operatii agregate sau de reactualizari ale


relatiilor dar in sistemul PRTV exista posibilitatea stabilirii fluxului de informatii in
ambele sensuri intre ISBL si limbajul gazda (in general PL/I). Comunicarea se face
prin diferitele valori ale unor atribute sau prin fisiere relationale de citire sau scriere
definite in limbajul gazda.

1.2.2. SQUARE - limbaj intermediar intre algebra relationala si


calculul relational pe tupluri

Limbajul SQUARE a fost o prima versiune a unui limbaj de cereri pentru


SGBD System R proiectat de IBM in San Jose. In acest limbaj sunt prevazute si alte
operatii decat cele din algebra relationala cum ar fi numirea unor tupluri in relatii sau
operatori din teoria multimilor de tipul incluziune sau aparteneta.

In limbajul SQUARE operatorii reuniune si diferenta se exprima ca in algebra


relationala iar intersectia se trateaza asemanator. Produsul cartezian al relatiilor R si S
se exprima prin

r @c R, s @c S
Proiectia relatiei R dupa atributele A1,A2,...,An se exprima prin

/A1,A2,...,An R

iar pentru selectia @S/F(R) se foloseste

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

@|v CUMPARATORI/NUME,ADRESA,CONT("Ionescu Dumitru","Pacii


14",0)

putem sa eliminam comenzile celor care nu dispun de bani sa le plateasca cu

@|^ COMENZI/NUME(/NUME CUMPARATORI/CONT( < 0)

putem adauga 20000 lei in contul lui Popescu Dan cu

-> CUMPARATORI/NUME;+CONT("Popescu Dan",20000)

sau sa crestem preturile marfurilor vandute la magazinul Unirea cu 10% cu

-> MAGAZINE/NUMEMAG;XPRET ("Unirea",1.1)

In limbajul SQUARE se pot aplica unor relatii unare functiile agregat


COUNT pentru numarare, AVG pentru media aritmetica, SUM pentru suma
elementelor, MIN pentru aflarea celei mai mici valori si MAX pentru aflarea celei
mai mari valori din relatia respectiva. La aplicarea functiilor COUNT, AVG si SUM
trebuie tinut seama ca in acest limbaj sunt eliminate dublurile si deci in relatia unara
fiecare valoare este luata in consideratie o singura data. Cum de cele mai multe ori
relatia la care se aplica o functie agregat se obtine ca o proiectie dupa un atribut a
unei relatii R, pentru a nu se elimina din proiectie dublurile se scrie R' in loc de R. De
exemplu este incorect de aflat suma conturilor cumparatorilor cu expresia
SUM(/CONT CUMPARATORI) deoarece s-ar putea ca mai multi cumparatori sa
aiba aceeasi suma in cont si ea va conta numai o data; corect este SUM(/CONT
CUMPARATORI').

Exemplul 3.11. Pentru baza de date din exemplul 3.7 aflarea magazinelor care
vand cel mai ieftin portocalele se face prin

s/NUMEMAG @c MAGAZINE : s/MARFA = "portocale"


@A s/PRET = MIN(/PRET MAGAZINE/MARFA("portocale"))
CURSUL 8

1.2.3. QUEL - un limbaj de tip calcul relational pe tupluri

QUEL este un limbaj de cereri pentru INGRES care este un sistem de gestiune
a bazelor de date dezvoltat la Universitatea din California, Berkeley si merge sub
sistem de operare UNIX. Acest limbaj poate fi utilizat independent sau inclus in
limbajul de programare C si in acest caz instructiunile lui sunt precedate de ## si sunt
prelucrate prin preprocesare.

O expresie din calculul relational pe tupluri de forma

{u\(r) | (@Et1)...(@Etk)(R1(t1)@A...@ARk(tk)
@Au[1]=ti1[j1]@A...@Au[r]=tir[jr]@A @v)}

unde @v este o formula a calculului relational pe tupluri ce nu contine cuantificatori


poate fi scrisa in QUEL sub forma:

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.

Pentru a demonstra completitudinea lui QUEL vom presupune ca relatiile


R(A1,A2,...,An) si S(B1,B2,...,Bm) sunt date si se obtine prin aplicarea unei operatii
o noua relatie T. Calculul lui T = R U S (presupunand n=m) se face cu

range of r is R
append to T(C1=r.A1,...,Cn=r.An)
range of s is S
append to T(C1=s.B1,...,Cn=s.Bn)

Calculul diferentei T = R - S se scrie

range of r is R
append to T(C1=r.A1,...,Cn=r.An)
range of s is S
range of t is T
delete t
where s.B1=t.C1 and ... and s.Bn=t.Cn

Calculul produsului cartezian T = R X S se scrie

range of r is R
range of s is S
append to T(C1=r.A1,...,Cn=r.An,Cn+1=s.B1,...,Cn+m=s.Bm)

Calculul proiectiei T = @P/A1,A2,...,Ak(R) se scrie

range of r is R
append to T(C1=r.A1,...,Ck=r.Ak)
sort T

Calculul selectiei T = @S/F(R) se scrie

range of r is R
append to T(C1=r.A1,...,Cn=r.An)
where F'

unde F' se obtine din F prin tranformarile discutate anterior.

Exemplul 3.16. A treia cerere din exemplul 3.8 se poate scrie in QUEL

range of m is MAGAZINE
range of n is MAGAZINE
retrieve into MAG(MG=m.NUMEMAG,MR=n.MARFA)
range of t is MAG
delete t
where t.MG=m.NUMEMAG and t.MR=m.MARFA
range of r is comenzi
retrive into COM(MG=t.MG,MR=t.MR)
where r.NUME="Popescu Dan" and r.MARFA=t.MR
retrieve into MAGA(MG=m.NUMEMAG)
range of u is MAGA
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 R corespunzatoare campurilor selectate si incluzand in T un tuplu cu
comanda I. ce contine variabilele definite.

Pentru reprezentarea selectiei @S/F(R) se transforma mai intai formula F


pentru a nu mai contine negatia folosind legile lui DeMorgan pana cand negatiile
ajung la atomi si apoi operatorul de comparatie ce apare in atom se inlocuieste prin
operatorul opus (= cu @=/, > cu @<=, etc.). De exemplu pentru formula

@!(A < B V (C = D @A E @=/ F))

se obtine formula echivalenta

A @>= B AND (C @=/ D OR E = F)

Daca prin transfeormarile indicate din formula F se obtine formula F', atunci selectia
se poate exprima ca in fig.3.12.

_____________________________________________________________________
________
R | A1 | A2 | ... | An |
_______________|______________|_____________|______________|
_________________|
| _a1 | _a2 | ... | _an |
| | | | |
_______________________
| CONDITIONS |
|_______________________|
| F' |
| |
_____________________________________________________________________
________
T | | | | |
_______________|______________|_____________|______________|
_________________|
I. | _a1 | _a2 | ... | _an |
| | | | |

Figura 3.12.

In QBE se pot crea vederi care se definesc dupa regulile obisnuite de definire
a relatiilor doar ca numele relatiei ce defineste vederea este precedat la definire de
cuvantul VIEW. O vedere V se evalueaza de fiecare data cand este folosita intr-o alta
cerere cu continutul actual al relatiilor ce apar in vedere.
Exemplul 3.26. Se poate alcatui o vedere pentru a calcula nota de plata a unei
persoane cu preturile minime percepute de vanzatori pentru marfurile comandate cum
se arata in fig.3.13. Evaluarea se face in momentul unei cereri de tipul celei din
fig.3.14 cand se indica persoana pentru care se aplica nota de plata.

_____________________________________________________________________
______
I.VIEW NOTA-DE-PLATA I. | NUME | MARFA | SUMA |
________________________|____________________|______________|
______________|
I. | _Ionescu | _portocale |_q*MIN.ALL._P |
| | | |
_____________________________________________________________________
______
COMENZI | NR_COM | NUME | MARFA | CANTITATE |
_______________|______________|______________|______________|
______________|
| | _Ionescu | _portocale | _q |
| | | | |
_____________________________________________________________________
______
MAGAZINE | NUMEMAG | ADRESAMAG | MARFA | PRET |
_______________|______________|______________|______________|
______________|
| | | _portocale | _p |
| | | | |

Figura 3.13.

_____________________________________________________________________
______
NOTA-DE-PLATA | NUME | MARFA | SUMA |
_________________________|___________________|______________|
______________|
P. | Popescu Dan | _portocale | _999 |
| | | |

Figura 3.14.

GATA

1.3. Descrierea bazelor de date de tip relational


Pentru transformarea unei diagrame de tip entitate/relatie prin care se descrie
modelul logic al bazei de date in model relational de baze de date se aplica
urmatoarele reguli:

- Fiecarei entitati i se asociaza o relatie de baza avand drept cheie principala


cheia entitatii. Pentru entitatile speciale se asociaza si chei straine pentru a arata
dependenta de alte entitati.

- Fiecare relatie de tip mai-multi-la-mai-multi ii corespunde o relatie de baza


avand cate o cheie straina pentru fiecare din entitatile legate prin aceasta relatie.
Cheia primara este constituita din reuniunea tuturor cheilor straine.

- Fiecarei relatii de tipul mai-multi-la-unu i se asociaza o cheie straina in


prima entitate cu referinta la cea de-a doua entitate. Relatiile unu-la-unu se trateaza
asemanator.

- Proprietatilor li se asociaza atribute in relatiile de baza corespunzatoare.


Pentru proprietatile multivaloare se creaza noi relatii ce sunt legate prin chei straine
de relatia in care apare proprietatea multivaloare.

- Pentru subtipuri se reprezinta in relatiile asociate numai proprietatile ce nu se


pot aplica supertipului de car apartine.

Modelele de tip RM/T se transforma in modelul relational astfel:

- Fiecarei entitati nucleu i se asociaza o relatie de baza avand cate o cheie


primara.

- Fiecarei entitati asociative i se asociaza o relatie de baza avand cate o cheie


straina pentru fiecare din entitatile ce intervin in asociere.

- Desemnarile sunt reprezentate prin chei straine.

- Fiecarei entitati caracteristice i se asociaza o relatie de baza cu cheie straina


pentru entitatea caracterizata.

- Proprietatile sunt reprezentate ca atribute ale relatiilor respective.

- Subtipurile si supratipurile sunt indicate prin chei straine.

2. SQL

Limbajul SQL (Structured Query Language) este unul din limbajele


relationale de cereri care formeaza nucleul multor sisteme de gestiune a bazelor de
date si de aceea il prezentam mai pe larg decat celelalte limbaje. Se poate spune ca
SQL este o perfectionare a limbajului SQUARE (vezi 3.1.2.2), eliminand utilizarea
indicilor ce preced sau succed numele unei relatii prin utilizarea unor cuvinte cheie.
In mai 1986 a fost recunoscuta de ANSI standardizarea limbajului SQL.
Intr-o prima varianta SQL s-a numit SEQUEL. El a fost definit prima oara de
Chamberlin si altii de la IBM Research Laboratory din San Jose, California in 1974 si
folosit in prototipul System R si apoi in DB2 pentru mediu MVS, SQL/DS pentru
medii VM si VSE, OS/2 Extended Edition Database Manager pentru mediu OS/2
extins, SQL/400 pentru mediu OS/400 si altele.

Majoritatea instructiunilor din SQL sunt executabile ele putand fi interpretate


si executate imediat in mod interactiv sau pot fi incluse in diferite aplicatii
programate in limbaje de programare cum sunt APL, BASIC, C, COBOL,
FORTRAN, PL/I, Assembler si altele (embedded SQL), executandu-se in momentul
executiei programului respectiv. Intre cele doua moduri de utilizare sunt mici
deosebiri cum ar fi prefixarea instructiunilor executabile SQL din programe cu EXEC
SQL si definirea unor variabile de transfer de informatii prin INTO :variabila.

2.1. SQL interpretabil

Aplicatia din SQUARE

/A1,A2,...,An R/B1,B2,...,Bm(@01b1,@02b2,...,@0bm)

se exprima in SQL prin

SELECT A1,A2,...,An
FROM R
WHERE B1@01b1 AND B2@02b2 AND ... AND Bm@0mbm

Exemplul 3.12. Prima cerere din exemplul 3.7 se scrie in SQL

SELECT NUME
FROM CUMPARATORI
WHERE CONT < 0

Dupa WHERE poate sa apara o formula ca cuprinde atribute ale relatiilor ce


urmeaza dupa FROM si constante legate intre ele prin operatii si comparatii
aritmetice, operatori Booleeni (NOT, AND sau OR) operatii cu multimi (UNION,
INTERSECT si MINUS) de apartenanta in multimi (X IN S sau echivalent S
CONTAINS X, X NOT IN S sau S DOES NOT CONTAIN X cu X element sau
multime si S multime). Unele relatii ce apar in conditia de dupa WHERE pot fi
obtinute la randul lor printr-o constructie SELECT-FROM-WHERE. Forma generala
a instructiunii de cautare SELECT este:

SELECT [ DISTINCT ] elemente


FROM tabele
[ WHERE conditie ]
[ GROUP BY campuri
[ HAVING conditie ] ]
[ ORDER BY campuri ] ;
In acest limbaj, la proiectie nu sunt eliminate duplicatele. pentru a elimina
duplicatele se pune dupa SELECT optiunea DISTINCT. Drept elemente pot sa apara
valori selectate sau expresii construite cu aceste valori iar daca sunt considerate toate
campurile tabloului atunci se pune "*". Conditia de dupa WHERE poate sa contina
operatori de comparatie =, <>, >, >=, < si <=, operatori booleeni AND, OR si NOT
eventual cu paranteze pentru schimbarea ordinii de evaluare. Pentru campurile
indicate pentru ordonare se poate specifica daca trebuie sa apara crescator prin ASC
(se ia prin 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:

Definirea unei relatii se face cu instructiunea CREATE TABLE in care se


specifica numele tabelului care se creaza, numele si tipurile de date ale atributelor
sale, campurile care sunt componente ale cheii primare si ale unor chei straine
impreuna cu corespondentele lor avand forma generala

CREATE TABLE tabel


(definire_camp [,definire_camp]...
[,PRIMARY KEY (campuri) ]
[,FOREIGN KEY (camp) REFERENCES tabel
[,FOREIGN KEY (camp) REFERENCES tabel ]...] ) ;

unde definire_camp este de forma

camp tip_date [NOT NULL]

si tip_date poate fi INTEGER pentru intreg pe un cuvant, SMALLINT pentru un


intreg pe un semicuvant, DECIMAL(p,q) pentru numar zecimal cu p cifre si semn si
avand punctul zecimal la q cifre din dreapta, FLOAT(p) pentru numar real cu p cifre
binare precizie, CHARACTER(n) pentru cuvinte de n octeti, VARCHAR(n) pentru
cuvinte de cel mult n octeti, GRAPHIC(n) pentru cuvinte cu n caractere de cate 16
biti, VARGRAPHIC(n) pentru cuvinte de cel mult n caractere de cate 16 biti, DATE
pentru exprimarea datei sub forma aaaallzz, TIME pentru exprimarea orei sub forma
oommss, TIMESTAMP pentru exprimarea in microsecunde a unei combinatii de data
si ora. Pot fi utilizate si prescurtari de tip INT, DEC sau CHAR pentru INTEGER,
DECIMAL si respectiv CHARACTER. Campurile specificate NOT NULL trebuie sa
contina o valoare definita din domeniul indicat iar celelalte campuri pot fie sa nu fie
definite sau sa nu se aplice pentru tuplul respectiv.

Exemplul 3. . Pentru baza de date a unei retele de magazine se pot definii


urmatoarele tabele:

CREATE TABLE MAGAZINE


( NR_MAG CHAR(5) NOT NULL,
NUME_MAG CHAR(20) NOT NULL,
STARE SMALLINT NOT NULL,
ORAS CHAR(15) NOT NULL,
PRIMARY KEY ( NR_MAG ) ) ;
CREATE TABLE MARFA
( COD CHAR(6) NOT NULL,
DENUMIRE CHAR(20) NOT NULL,
CULOARE CHAR(6) NOT NULL,
GREUTATE SMALLINT NOT NULL,
ORAS CHAR(15) NOT NULL,
PRIMARY KEY ( COD ) ) ;
CREATE TABLE VANDUT
( NR_MAG CHAR(5) NOT NULL,
COD CHAR(6) NOT NULL,
CANTITATE INTEGER NOT NULL,
PRIMARY KEY ( NR_MAG, COD ),
FOREIGN KEY ( NR_MAG ) REFERENCES MAGAZINE,
FOREIGN KEY ( COD ) REFERENCES MARFA ) ;

Instructiunea CREATE TABLE produce la nivel fizic fisiere ce corespund


tabelelor definite si care initial sunt vide. Definirea unor tabele virtuale utilizate ca
vederi se face printr-o instructiune analoaga CREATE VIEW si crearea unui index
pentru un tabel dat se face prin CREATE INDEX. Instructiunile DROP TABLE,
DROP VIEW si DROP INDEX sunt folosite pentru eliminarea unor elemenmte din
baza de date de tip tabel, vedere si respectiv index. Indexii sunt creati si eliminari de
administratorul de sistem si sunt utilizati automat in cererile utilizatorilor.

Forma generala a instructiunilor precedente este:

CREATE VIEW vedere [ ( coloana [, coloana ] ... ) ]


AS subcerere
[ WITH CHECK OPTION ] ;

CREATE [ UNIQUE ] INDEX index


ON tabel ( camp [ ordine ] [, camp [ ordine ] ] ... )
[ CLUSTER ] ;

DROP TABLE tabel ;

DROP VIEW vedere ;

DROP INDEX index ;

in care WITH CHECK OPTION indica verificarea conditiilor din definirea vederii in
momentul executarii operatiilor UPDATE si INSERT, UNIQUE specifica necesitatea
de a avea un singur tuplu in tabel pentru valorile campurilor specificate in index,
ordine poate fi ASC pentru crescator (luata prin lipsa) sau DESC pentru descrescator
ea fiind lexicografica si CLUSTER presupune gruparea tuplurilor dupa adresele date
de index putand sa apara in cel mult un index pentru fiecare tabel in parte. Eliminarea
unui tabel produce eliminarea automata a tuturor vederilor in care este el implicat.

La un tabel se poate adauga un nou camp la dreapta prin utilizarea


instructiunii ALTER TABLE avand forma generala:

ALTER TABLE tabel ADD camp tip_date ;

Sistemul adauga automat valoarea null pentru tuplurile deja existente in tabel si
permite folosirea unor valori corespunzatoare pentru tuplurile adaugate sau
modificate.
Instructiunile de prelucrare date din SQL sunt SELECT (descrisa mai sus),
UPDATE (pentru reactualizari), DELETE (pentru eliminari de tupluri) si INSERT
(pentru adaugari de tupluri). Ele se aplica unei multimi de inregistrari. Ultimele trei
instructiuni au urmatoarele forme generale:

UPDATE tabel
SET camp = expresie [, camp = expresie ] ...
[ WHERE conditie ] ;

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.

Pentru efectuarea operatiilor din SQL programabil se foloseste de cele mai


multe ori un cursor. Pot sa se efectueze fara cursor instructiunile SELECT singular
(cu selectarea unui singur tuplu), UPDATE (fara forma CURRENT), DELETE (fara
forma CURRENT) si INSERT.

Pentru selectarea mai multor tupluri se declara mai intai un cursor printr-o
constructie de forma

EXEC SQL DECLARE cursor CURSOR


FOR instructiune-selectare
[ FOR UPDATE OF coloana [, coloana ] ... ]
[ ORDER BY coloana [, coloana ] ... ] ;

care este o instructiune declarativa (neexecutabila). Se poate folosi ORDER BY


numai in absenta lui FOR UPDATE pentru a indica ordinea in care sunt considerate
tuplurile. Intr-un program pot sa apara mai multe instructiuni de acest tip. Pentru a
utiliza un cursor mai intai el trebuie activat prin instructiunea

EXEC SQL OPEN cursor ;

se selecteaza pe rand cate un tuplu prin instructiunea

EXEC SQL FETCH cursor INTO tinta [, tinta ] ... ;

unde tinta este de forma :variabila [:variabila ] si da numele variabilei ce primeste


valoarea corespunzatoare campului din tuplul selectat. Daca nu mai sunt tupluri de
selectat se face SQLCODE = +100 si nu se mai returneaza alte date. Dezactivarea
cursorului se face printr-o constructie de forma

EXEC SQL CLOSE cursor ;

Valorile variabilelor ce apar in definirea cursorului sunt luate in considerare


numai la activarea cursorului fiind neoperante schmbarile lor ulterioare pana la o
noua reactivare a cursorului.

Cursorul mai poate fi utilizat si in formele CURRENT ale instructiunilor


UPDATE si DELETE avand respectiv formele

EXEC SQL UPDATE tabel


SET camp = expresie [, camp = expresie ] ...
WHERE CURRENT OF cursor ;

EXEC SQL DELETE


FROM tabel
WHERE CURRENT OF cursor ;

care se aplica tuplului indicat de cursor. Aceste operatii nu se pot aplica daca in
definirea cursorului in SELECT apar UNION sau ORDER BY sau defineste o vedere
ce nu se poate modifica. Daca se fac modificari, la definirea cursorului implicat se
trec in FOR UPDATE toate campurile ce sunt modificate cu UPDATE.

Testarea conditiilor de operare a instructiunilor cu cursor se poate face si prin


instructiunea

EXEC SQL WHENEVER conditie actiune ;

unde conditie poate fi NOT FOUND (adevarat pentru SQLCODE = 100),


SQLWARNING (adevarat pentru SQLCODE > 0 si SQLCODE <> 100) sau
SQLERROR (adevarat pentru SQLCODE < 0) si actiunea poate sa fie CONTINUE
sau o instructiune GO TO.

Modificarile devin efective numai dupa executarea unei comenzi COMMIT ce


este facuta automat (la executie corecta) sau prin program si pot fi anulate prin
comanda ROLLBACK automat (la aparitia unor erori) sau prin program.

Se pot executa dinamic (interactiv) programe SQL folosind comenzile


PREPARE pentru precompilare si EXECUTE pentru executie.

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-la-
mai-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)

Modelul ierarhic poate fi privit ca un caz particular al modelului retea in care


diagrama asociata este o padure (multime de arbori) si in care toate legaturile sunt pe
directia drumului de la radacina la nodul fiu din relatie, toate relatiile fiind de tipul
unu-la-mai-multi.

Ca si in cazul celorlalte doua modele exista posibilitatea interpretarii


diagramelor entitate-relatie sub forma modelului ierarhic. Pentru evitarea
redondantelor in modelul ierarhic se foloseste notiunea de element virtual care
inlocuieste dublura unui element prin adresa elementului respectiv fiecare element
aparand in baza de date reala o singura data. In felul acesta se evita unele redondante.

Operatiile din bazele de date de tip ierarhic se traduc in procese de parcurgere


a arborilor. Elemntele virtuale permit in acest caz legarea informatiilor din aceiasi
entitate sau din entitati diferite.

Pentru prelucrarea eficienta a unei relatii de tip mai-multi-la-mai-multi intre


entitatile A si B se pot introduce doi arbori: unul cu tatal A si fiu virtual B si unul cu
tatal B si fiu virtual A

Transformarea diagramelor entitate-relatie in paduri se face in mai multe


etape. Mai intai se transforma o astfel de diagrama intr-o retea prin metodele
prezentate anterior. Apoi se construiesc pe rand arbori selectand ca radacina a lor un
nod din retea neselectat inca si cu cat mai putine arce care sa intre in el din noduri
neselectate. Se adauga apoi cat mai exista arcele ce pleaca din noduri selectate in
acest arbore fie catre noduri deja selectate in alti arbori si in acest caz aceste noduri se
declara virtuale, fie catre noduri inca neselectate care se adauga arborelui si se
considera astfel selectate. Procedeul continua pana nu mai sunt noduri neselectate.

Implementarea la nivel logic pentru modelul ierarhic poate fi cea utilizata


pentru modelul retea sau prin inregistrari de lungime variabila. Formatele acestor
inregistrari se construiesc prin procedeul urmator: formatul asociat unei frunze avand
campurile a este a* iar pentru un nod interior cu campurile b si pentru care fii sai au
formatele asociate a1,a2,...,ak asociem formatul (b a1 a2 ... ak)*. Deci pentru baza de
date se obtin un numar de fisiere cu lungimi variabile egal cu numarul de arbori din
schema asociata bazei de date respective.

Datele sunt puse pe mediul extern in ordinea data de parcurgerea in preordine


a arborilor ceea ce usureaza determinarea informatiilor pentru cererile care se refera
la descendentii unor noduri printr-un numar mic de accese la mediul extern.
5. Compararea modelelor

Dintre cele trei modele de baze de date, modelul relational se impune prin
simplitate ceea ce are ca efecte folosirea cu succes a lui si de catre nespecialisti si o
productivitate marita. Avantajele modelului relational fata de celelalte modele sunt
urmatoarele [Date]: structuri de date simple, operatori simpli, fara mari diferente intre
diferitele sisteme, un nucleu comun prin utilizarea in majoritatea cazurilor a
limbajului SQL, mecanismul vederilor, o baza teoretica solida, numarul mic de
concepte, aplicarea principiului dualitatii accesului (prin program si interactiv)
, independenta fizica a datelor, independenta logica a datelor, usurinta dezvoltarii
aplicatiilor, definirea dinamica a datelor, usurinta instalarii si usurinta operarii,
simplificarea proiectarii bazelor de date, integrarea dictionarelor, posibilitatea
dezvoltarii bazelor de date distribuite, performante si posibilitati de extindere.

Singura structura de date utilizata la nivel logic in modelul relational este cea
de tabel des utilizata in viata obisnuita spre deosebire de celelalte modele care
utilizeaza mai multe tipuri de structuri de date cu diferite tipuri de definiri si
prelucrari. Operatiile se refera in general la multimi si nu la elemente particulare,
facand o descriere a obiectelor din rezultatul dorit si lasand sistemul sa gaseasca
modul de calcul optim al solutiei (navigare automata) spre deosebire de celelalte
metode in care trebuie indicat modul de prelucrare a datelor pentru a se ajunge la
rezultat (navigare manuala). De aici rezulta si independenta fata de implementare si
deci portabilitatea aplicatiilor
si posibilitatea stabilirii unor legaturi dinamice intre date. Se definesc simplu prin
intermediul operatiilor actiuni cum sunt: regasire date, reactualizare date, folosirea
datelor virtuale, definirea drepturilor de acces, controlul accesului concurent,
constrangerile de integritate si altele.

Utilizarea vederilor permite o mai buna percepere a datelor de catre fiecare


utilizator, definirea unor aplicatii diverse pentru aceiasi baza de date, poate sa faca
invizibile anumite informatii (securitatea datelor) si permite o independenta logica a
datelor.

Toate sistemele de baze de date distribuite au fost construite de tipul model


relational. Aceasta deoarece prin cererile relationale se obtine o buna semantica,
raspunsurile relationale sunt multimi de tupluri ce sunt usor de transformat in mesaje
standard, cererile sunt usor de optimizat, se poate face usor fragmentarea si
independenta fragmentelor se obtine usor.

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
modelul relational de baze de date. Sistemul de operare utilizat este
UNIX pe DEC PDP pentru varianta universitara si diverse alte sisteme
pentru varianta comerciala. In acest sistem relatiile sunt memorate
sub forma de fisiere UNIX cu blocuri de 512 octeti. Tuplurile sunt
reprezentate sub forma de inregistrari.

Initial INGRES a fost construit pentru limbajul de cereri QUEL


(Query Language) dar ulterior el a inclus si limbajul SQL. QUEL poate
fi utilizat atat interactiv (prin INGRES Terminal Monitor) cat si
programabil prin intermediul unor limbaje de programare (prin
Embedded QUEL sau EQUEL). Sistemul mai contine o multime de utilitare
pentru construirea unor interfete prin intermediul formelor, pentru
scrierea rapoartelor, pentru construirea unor grafice si alte
utilitati. Sistemul poate fi folosit de mai multi utilizatori in
acelasi timp, contine un modul de optimizarea cererilor, permite
definirea dinamica a datelor si are un mecanism de lucru cu vederi.

In limbajul QUEL se pot utiliza instructiunile CREATE pentru


crearea unui tabel de baza, INDEX pentru crearea unui index, DEFINE
VIEW pentru crearea unei vederi, DESTROY pentru eliminarea unui tabel
de baza, index sau vedere si MODIFY pentru a schimba structura unui
tabel de baza sau index.

Crearea unui tabel de baza se face prin instructiunea

CREATE tabel (definitie-coloana [, definitie-coloana ] ... )

unde definitie-coloana este de forma

coloana = tip-date [ NOT NULL ]

cu tipul de date I1, I2 sau I4 pentru intregi binari de 1, 2 si


respectiv 4 bytes, F4 si F8 pentru valori in virgula mobila cu 4 si
respectiv 8 bytes, MONEY pentru dolari si centi pe 16 cifre cu punct
zecimal inainte de ultimele doua cifre, CHAR(n) pentru sir de n
caractere, VARCHAR(n) pentru sir de cel mult n caractere si DATE
pentru data si ora ce poate fi reprezentata sau absolut sau ca
interval. La creare tablourile sunt considerate de tip secvential
(heaps) structura lor de memorare putand fi modificata la cerere prin
MODIFY.

Vederile sunt definite prin instructiuni de forma

DEFINE VIEW vedere [ ( lista-rezultat ) ] [ WHERE conditie ]

Se poate crea un index secundar pentru un tabel de baza cu


comanda
INDEX ON tabel IS index ( coloana [, coloana ] ... )

Eliminarea unor tablouri de baza, indexi sau vederi se face cu

DESTROY lista

unde lista contine numele elementelor ce se elimina despartite prin


virgula. Daca se elimina un tabel de baza sau o vedere se elimina
automat si vederile si indexi in care acestea sunt implicate.

Instructiunea MODIFY se foloseste la schimbarea modului de


memorare a unui tabel de baza sau a unui index avand forma generala

MODIFY tabel TO structura [ UNIQUE ] [ ON coloana [,


coloana ] ... ]

unde structura poate fi (prefixul C indica o compresare a datelor pe


disc) BTREE sau CBTREE pentru B-arbore, HASH sau CHASH pentru
dispersie (se foloseste restul impartirii cu un numar drept functie
de dispersie), ISAM sau CISAM pentru indexare secventiala, HEAP sau
CHEAP pentru secvential si HEAPSORT sau CHEAPSORT pentru o sortare in
momentul modificari (ordinea nu se pastreaza prin modificarile
ulterioare).

Cu exceptia cazurilor HEAP si CHEAP operatia MODIFY elimina


inregistrarile duplicat. Inregistrari duplicate pot sa apara numai in
organizari de tip HEAP si HEAPSORT (cu sau fara comprimare). Dupa
executarea unei operatii MODIFY trebuiesc reconstruiti toti indexi
asociati tabelului respectiv.

Sistemul INGRES contine un catalog ce cuprinde informatii


privind tabelele, coloanele, indexii si celelalte informatii. Aceste
informatii pot fi obtinute de utilizatori cu instructiunea RETRIEVE
sau cu instructiunea HELP care prezinta rapoarte predefinite.

Activarea sistemului INGRES se face cu comanda

INGMENU baza-de-date

la care sistemul raspunde prin afisarea pe ecran a unui frame numit


"INGRES main menu" care permite utilizatorului sa continue lucrul cu
mai multe optiuni: sa activeze diferitele componente ale sistemului
(QBF, RBF, ABF, VIFRED sau VIGRAPH), sa efectueze operatii de
definire date cum ar fi crearea unor tabele, sa execute interactiv
operatii prin limbajele SQL sau QUEL, sa execute cereri memorate,
rapoarte sau grafice si altele.

S-au construit preprocesoare ale comenzilor din QUEL pentru


limbajele Ada, C, COBOL, FORTRAN, BASIC, Pascal si PL/I.
Instructiunile de declarare si executabile contin in primele doua
coloane "##". Se pot transmite informatii intre programul gazda si
sistemul INGRES prin intermediul variabilelor. Informatii despre
modul de efectuare a unei operatii se pot obtine prin instructiuni de
forma

## INQUIRE_INGRES ( variabila = variabila-legatura )

unde variabila-legatura poate fi ERRORNO - pentru numarul de eroare,


ROWCOUNT - pentru numarul de randuri gasit si alte variabile
predefinite.
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
reprezentati sub forma de B-arbori (vezi cap. 6). Nu se face
distinctie intre indicii principali si cei secundari.

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 intrebare-
raspuns 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 VIRTUAL
SOURCE IS MARFA.NUMEMAR OF OWNER OF MARPR
1 NUMEMAG VIRTUAL
SOURCE 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>

care permite localizarea unor inregistrari prin prelucrari date de


utilizator considerate mai adecvate pentru cautare in cazul
particular respectiv;

LOCATION MODE IS DIRECT

care declara modul de localizare prin adresa inregistrarii numita


aici cheia bazei de date;

LOCATION MODE IS VIA <nume set> SET

care permite accesul la toate elementele unui set in acelasi timp.

Programele sunt scrise in limbajul gazda care de cele mai multe


ori este limbajul COBOL la care se adauga unele comenzi din DML cum
ar fi FIND pentru localizarea unei inregistrari, GET pentru citirea
unei inregistrari din baza de date, STORE pentru introducerea unei
inregistrari in baza de date si altele.

Programele folosesc un spatiu de lucru numit arie de lucru


utilizator (user working area) in care se gasesc variabilele definite
in program, pointerii curenti ce dau chei ale bazei de date pentru
anumite inregistrari si formatari (templates) pentru diferite tipuri
de inregistrari. Formatarile sunt utilizate ca memorii tampon pentru
operatiile de intrare/iesire sau pentru transmiterea unor parametrii
pentru unele comenzi.

Cei mai utilizati pointeri curenti sunt: unitatea de executie


curenta (contine pointer la unitatea de date care se prelucreaza
indiferent de natura ei), inregistrarea curenta (pentru fiecare tip
de inregistrare exista un pointer catre ultima inregistrare accesata
de acel tip) si setarea curenta (pentru fiecare set exista un pointer
catre ultimul element accesat al setului sau proprietar).

Citirea unei inregistrari din baza de date se face prin doua


instructiuni si anume o instructiune FIND pentru pozitionare si una
GET pentru citirea efectiva care copiaza in formatarea curenta
inregistrarea curenta de acelasi tip sau o parte din ea. Forma
generala a instructiunii GET este:

GET <tip inregistrare>[;<lista de campuri>]

Daca nu apare lista de campuri se considera toate campurile


inregistrarii. Campurile virtuale sunt inlocuite cu valorile efective
asociate lor prin intermediul poiterilor si eventual al relatiilor.
Instructiunea FIND este cea mai complexa instructiune a acestui
sistem avand multe variante dintre care mai utilizate sunt
urmatoarele: gasirea unei inregistrari prin cheia bazei de date,
gasirea unei inregistrari folosind cheia CALC, parcurgerea
inregistrarilor de un anumit tip, parcurgerea ocurentelor elementelor
unui set sau a celor cu anumite proprietati, gasirea proprietarului
unui element al unui set, gasirea elementelor curente ale fiecarui
fisier sau relatie si altele asemanatoare.

Gasirea unei inregistrari dupa cheia se face cu o instructiune


de forma:

FIND <tip inregistrare> RECORD BY DATABASE KEY <variabila>

unde <variabila> este o variabila in spatiul de lucru care are o


valoare ce constituie cheia cautata.

Exemplul 4.2. Citirea inregistrarii curente pentru marfuri se


poate face prin urmatoarea succesiune de instructiuni:

X := CURRENT OF MARFA
FIND MARFA RECORD BY DATABASE KEY X
GET MARFA

unde X este o variabila definita in spatiul de lucru.

Gasirea inregistrarilor folosind cheie CALC se face plasand mai


intai in campurile folosite de CALC a valorilor corespunzatoare in
formatarea tipului de inregistrare si apoi folosirea instructiunii de
forma:

FIND <tip inregistrare> RECORD BY CALC-KEY

Exemplul 4.3. Daca la declararea inregistrarilor de tip


CUMPARATOR se adauga instructiunea de localizare

LOCATION MODE IS CALC P1 USING NUME

iar P1 este o procedura de calcul a adresei folosind valoarea


corespunzatoare numelui din inregistrare, atunci se poate afla contul
lui Popescu Dan cu succesiunea de instructiuni urmatoare:

CUMPARATORI.NUME := "Popescu Dan"


FIND CUMPARATORI RECORD BY CALC-KEY
GET CUMPARATORI;CONT

Daca sunt mai multe persoane cu acelasi nume se obtine


informatie numai pentru una dintre persoane. Calificarile sunt
necesare numai daca sunt ambiguitati generate de atribute numite la
fel dar apartinand la inregistrari diferite. In acest caz numele
atributului este precedat de numele tipului de inregistrare
despartite prin punct.

Pentru gasirea tuturor inregistrarilor de un anumit tip


folosind cheie CALC se gaseste prima inregistrare de tipul respectiv
prin procedeul anterior si apoi se pune intr-un ciclu o instructiune
de forma:

FIND DUPLICATE <tip inregistrare> RECORD BY CALC-KEY


Exemplul 4.4. Lista tuturor magazinelor care vand portocale si
pretul cu care le vand se poate obtine prin urmatoarea succesiune de
instructiuni:

print " MAGAZIN "," PRET " /* scriere capat tabel */


PRETURI.NUMEMAR := "portocale"
FIND PRETURI RECORD BY CALC-KEY
while !FAIL do
GET PRETURI;NUMEMAG,PRET
print PRETURI.NUMEMAG,PRET
FIND DUPLICATE PRETURI RECORD BY CALC-KEY
end

Variabila FAIL este utilizata pentru a sti daca o operatie s-a


desfasurat cu succes sau nu avand respectiv valorile fals sau
adevarat, ea putand fi utilizata pentru iesirea din ciclu in cazul
cand nu mai sunt alte elemente de acelasi tip.

Parcurgerea elementelor unui set se poate face pozitionand mai


intai proprietarul setului cu instructiunea

FIND OWNER OF CURRENT <nume set> SET

si apoi folosind instructiunea

FIND NEXT <tip inregistrare> RECORD IN CURENT <nume set> SET

se pot considera pe rand elementele setului. La incercarea de luare a


unui nou element dupa ultimul se face variabila FAIL adevarat.

O alta varianta este data de pozitionarea direct pe primul


element al unui set folosind instructiunea

FIND FIRST <tip inregistrare> RECORD IN CURRENT <nume set> SET

restul elementelor determinandu-se la fel ca in cazul precedent.

Exemplul 4.5. Listarea marfurilor comandate de Popescu Dan se


poate face cu urmatoarea succesiune de instructiuni:

NUME := "Popescu Dan"


FIND CUMPARATORI RECORD BY CALC-KEY
FIND FIRST COMENZI RECORD IN CURRENT CUMCOM SET
while !FAIL do
FIND OWNER OF CURRENT MARCOM SET
GET MARFA
print MARFA.NUMEMAR
FIND NEXT COMENZI RECORD IN CURRENT CUMCOM SET
end

Toate elementele unui tip de inregistrare pot fi parcurse


folosind un tip special de set numit set singular care are drept
proprietar un tip special de inregistrare numit SYSTEM si elementele
unei ocurente sunt elementele fisierului respectiv de parcurs. Acest
set special se declara impreuna cu celelalte declaratii ale bazei de
date.

Exemplul 4.6. Pentru listarea tuturor persoanelor cu cont


negativ se poate introduce in descrierea bazei de date setul TOTICUMP
cu instructiunile:
DBTG SET TOTICUMP
OWNER IS SYSTEM
MEMBER IS CUMPARATORI

si listarea se poate atunci face cu instructiunile

print " CUMPARATOR ", " CONT "


FIND FIRST CUMPARATORI RECORD IN CURRENT TOTICUMP SET
while !FAIL do
GET CUMPARATORI
if CONT < 0 then
print NUME,CONT
FIND NEXT CUMPARATORI RECORD IN CURRENT TOTICUMP SET
end

Se poate face o parcurgere numai a elementelor cu anumite


valori in unele campuri incarcand in formatarea de tipul dat valorile
corespunzatoare campurilor si apoi determinand prima inregistrare cu
instructiunea

FIND <tip inregistrare> RECORD IN CURRENT


<nume set> SET USING <lista campuri>

si apoi luand urmatoarele elemente cu instructiunea

FIND DUPLICATE <tip inregistrare> RECORD IN CURRENT


<nume set> SET USING <lista campuri>

Exemplul 4.7. Aflarea pretului cu care magazinul Victoria vinde


televizorul "Cromatic" se poate face cu instructiunile

MAGAZINE.NUMEMAG := "Victoria"
FIND MAGAZINE RECORD USING CALC-KEY
PRETURI.NUMEMAR := "TV-Cromatic"
FIND PRETURI RECORD IN CURRENT MAGPR SET USING NUMEMAR
GET PRETURI;PRET
print PRET

Exemplul 4.8. Listarea persoanelor care au cont zero se poate


face cu urmatoarele instructiuni:

CONT :=0
FIND CUMPARATORI RECORD IN CURRENT TOTICUMP SET USING CONT
while !FAIL do
GET CUMPARATORI;NUME
print NUME
FIND DUPLICATE CUMPARATORI RECORD IN CURRENT
TOTICUMP SET USING CONT
end

Pozitionarea pe elementul curent al unui set sau a unei


inregistrari se poate face respectiv prin instructiunile:

FIND CURRENT OF <nume set> SET


FIND CURRENT OF <tip inregistrare> RECORD

Exemplul 4.9. Pentru a gasi daca Popescu Dan a comandat sau nu


portocale si in ce cantitate se poate utiliza urmatoarea succesiune
de instructiuni:
NUME := "Popescu Dan"
FIND CUMPARATORI RECORD USING CALC-KEY
LOOP: repeat forever
FIND NEXT COMENZI RECORD IN CURRENT CUMCOM SET
if FAIL then break LOOP
FIND OWNER OF CURRENT MARCOM SET
GET MARFA;NUMEMAR
if MARFA.NUMEMAR = "portocale" then do
FIND CURRENT OF COMENZI RECORD
GET COMENZI;CANTITATE
print CANTITATE
break LOOP
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

Automat comanda respectiva este inclusa in ocurentele cu proprietar N


din CUMCOM si cu proprietar M din MARCOM.

Daca nu se doreste inserarea automata in unele seturi se


declara in acele seturi

INSERTION IS MANUAL

In acest caz inserarile ca elemente ale unui set se face mai intai
prin fixarea ocurentei setului, apoi fixand aria curenta de lucru pe
inregistrarea ce se insereaza si cu comanda

INSERT <tip inregistrare> INTO <nume seturi>

se obtine inserarea inregistrarii in seturile indicate.

Exemplul 4.11. Daca in exemplul precedent in loc de INSERTION


IS AUTOMATIC se pune INSERTION IS MANUAL se obtine aceleasi
modificari cu succesiunea urmatoare de instructiuni:

read N,M,C
URMCOM := URMCOM + 1
CUMPARATORI.NUME := N
FIND CUMPARATORI RECORD USING CALC-KEY
MARFA.NUMEMAR := M
FIND MARFA RECORD USING CALC-KEY
COMENZI.NR_COM := URMCOM
COMENZI.CANTITATE := C
STORE COMENZI
INSERT COMENZI INTO CUMCOM,MARCOM

Eliminarea unitatii de executie curenta care este o


inregistrare din ocurentele corespunzatoare ei dintr-o multime de
seturi se face prin comanda

REMOVE <tip inregistrare> FROM <lista seturi>

Modificare unei inregistrari sau a unor campuri ale unei


inregistrari se face cu instructiunea

MODIFY <tip inregistrare>[;<lista campuri>]

Exemplul 4.12. Pentru a schimba pretul portocalelor vandute la


magazinul Unirea la 1500 lei/kg se poate folosi urmatoarea succesiune
de instructiuni
PRETURI.NUMEMAR := "portocale"
PRETURI.NUMEMAG := "Unirea"
FIND PRETURI RECORD USING CALC-KEY
PRETURI.PRET := 1500
MODIFY PRETURI;PRET

Stergerea unei inregistrari si a aparitiilor ei ca element in


ocurentele unor seturi se face cu instructiunea

DELETE <tip inregistrare> [ALL]

Daca nu apare ALL si inregistrarea este proprietar al unei ocurente


intr-un set apare o eroare. Aparitia lui ALL face ca o data cu
inregistrarea sa fie eliminate si toate elementele pentru care acea
inregistrare este proprietar, aceasta proprietate aplicandu-se
recursiv.

Exemplul 4.13. Pentru eliminarea unei comenzi pentru care se


cunoaste numarul si a aparitiilor ei in seturile CUMCOM si MARCOM se
poate face cu urmatoarea succesiune de instructiuni:

read COMENZI.NR_COM
FIND COMENZI RECORD USING CALC-KEY
DELETE COMENZI

Exemplul 4.14. Daca informatiile despre Popescu Dan trebuiesc


scoase din baza de date se poate folosi succesiunea de instructiuni:

NUME := "Popescu Dan"


FIND CUMPARATORI RECORD USING CALC-KEY
DELETE CUMPARATORI ALL

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

Exemplul 4.15. O vedere a bazei de date din exemplul 4.1 ce


permite prelucrarea comenzilor avand drept entitati MARFA,
CUMPARATORI si COMENZI impreuna cu relatiile corespunzatoare lor
poate fi descrisa in sistemul IMS cu urmatoarea succesiune de
instructiuni:

TREE ARBMAR
RECORD MARFA ROOT
1 NUMEMAR CHAR(15)
RECORD COMENZI PARENT=MARFA POINTER=PARENT
1 NR_COM INTEGER
1 CANTITATE REAL
RECORD VIRT_CUMP PARENT=COMENZI
VIRTUAL CUMPARATORI IN ARBCUMP
TREE ARBCUMP
RECORD CUMPARATORI ROOT
1 NUME CHAR(20)
1 ADRESA CHAR(30)
1 CONT REAL
RECORD VIRT_COM PARENT=CUMPARATORI
VIRTUAL COMENZI IN ARBMAR

In sistemul IMS limbajul de prelucrare a datelor se numeste


DL/I (Data Language/I), comenzile prevazute in acest limbaj fiind de
fapt apeluri de proceduri scrise in limbajul gazda care poate fi
PL/I, COBOL sau Assembler. Ca si in DBTG se foloseste o arie de lucru
in care sunt pastrate valorile curente pentru tipurile de
inregistrari si alte informatii cum ar fi variabile de lucru, tatal
curent al fiecarui tip de inregistrari, o variabila FAIL de indicare
a conditiilor de terminare a unei cautari si altele.

Cel mai mult in cautari este utilizata o instructiune de forma

GET LEFTMOST <nume inregistrare> WHERE <lista conditii>

cu <lista conditii> continand constructii de forma

<nume inregistrare>.<nume camp> O <valoare>

legate eventual prin "and" si "or". Aceasta comanda incarca in


formatarile corespunzatoare din aria de lucru inregistrarea cautata
si toti predecesorii sau din arborele unde apare. Conditiile care
determina inregistrarea cautata pot sa contina valori din oricare
camp al acestor inregistrari.

Exemplul 4.16. Sa consideram urmatoarea structura arborescenta


ce descrie o baza de date a unei agentii de vanzari locuinte
REGIUNI(NUMER)

OFICII(ORAS,ADROF)

AGENTI(NUMEA,VANZARI) ANGAJAT(NR_AN,NUMEAN,ADRAN,SALARIU)
OFERTE(ADROF,PRET)

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

Exemplul 4.18. Pentru determinarea tuturor clientilor lui


Popescu Dan din oficiul Craiova se poate scrie urmatoarea succesiune
de instructiuni

GET LEFTMOST AGENTI WHERE ORAS="Craiova" AND NUMEA="Popescu


Dan"
GET NEXT WITHIN PARENT CLIENTI
while !FAIL do
print CLIENTI.NUMEC
GET NEXT WITHIN PARENT CLIENTI

Inserarea unei inregistrari se face prin definirea valorilor


campurilor inregistrarii in formatul asociat in aria de lucru si dand
comanda

INSERT <tip inregistrare>

care adauga inregistrarea drept fiu al ocurentei curente a tatalui


tipului de inregistrare respectiv.

Exemplul 4.19. Inserarea drept client pentru Popescu Dan din


oficiul Craiova a lui Ionescu Dumitru str. Luceafarului 14 se poate
face cu succesiunea de instructiuni:

CLIENTI.NUMEC := "Ionescu Dumitru"


CLIENTI.ADRC := "Luceafarului 14"
INSERT CLIENTI WHERE ORAS="Craiova" AND NUMEA="Popescu Dan"

Stergerea si modificarea unei inregistrari se face mai intai


prin localizarea acelei inregistrari cu instructiunea GET la care se
adauga optiunea HOLD si apoi pentru stergerea inregistrarii si a
tuturor descendentilor se da comanda

DELETE

iar pentru modificare se redefinesc valorile campurilor ce se schimba


si apoi se da comanda

REPLACE

Exemplul 4.20. Daca agentul Popescu Dan din Craiova a mai facut
o vanzare de 2500000 lei, modificarea respectiva se face cu
instructiunile:

GET HOLD LEFTMOST AGENTI WHERE ORAS="Craiova" AND


NUMEA="Popescu Dan"
AGENTI.VANZARI := AGENTI.VANZARI + 2500000
REPLACE
iar daca acelasi agent tregbuie eliminat din baza de date impreuna cu
toti clientii lui acesta se poate face cu instructiunile:

GET HOLD LEFTMOST AGENTI WHERE ORAS="Craiova" AND


NUMEA="Popescu Dan"
DELETE

7. Alte SGBD-uri

7.1. DATACOM/DB - tip liste inversate

Sistemul DATACOM/DB a fost produs de Computer Associates pentru


calculatoare IBM cu sisteme de operare MVS, VM si VSE. Sistemul
prevede o interfata de apeluri a unor aplicatii in limbajele COBOL,
PL/I, FORTRAN, RPG II si Assembler. Pentru COBOL are si o interfata
numita DATACOM/DL sau COBOL/DL ca o extensie a COBOL-ului ce se
trateaza prin preprocesare.

Un sistem poate sa cuprinda pana la 999 baze de date fiecare


dintre ele fiind definita prin adaugarea unor descriptori in
dictionarul sistemului (DATADICTIONARY) interactiv bazat pe forme.
Unitatea de acces se numeste element si poate sa fie orice submultime
a unei inregistrari. Se fac autorizari de acces la nivel de element.

Sistemul mai contine urmatoarele componente: DATACOM/DC


(administrator de comunicari de date), DATAQUERY (o interfata de
cereri atat interactiva cat si programabila), DATAREPORTER (sistem de
rapoarte programabil), DATAENTRY (aplicatie generala interactiva de
introducere date), DATADESIGNER (utilitar pentru proiectarea logica a
bazelor de date) si IDEAL (sistem dezvoltare aplicatii). A fost
elaborata si o varianta distribuita numita CA:DB-STAR.

In acest sistem se lucreaza cu fisiere in care inregistrarile


sunt ordonate fizic existand si o ordine de aparitie a fisierelor in
baza de date. Pentru fiecare fisier se pot defini oricate chei de
cautare prin care se poate face acces direct sau secvential la
inregistrari. Accesul se face prin intermediul unui unic index (B-
arbore) asociat intregii baze de date.

Operatiile de baza ce se executa asupra datelor sunt: LOCATE


FIRST (da adresa primei inregistrari fizice a unui tabel T), LOCATE
FIRST WITH SEARCH KEY EQUAL (analog cu precedenta doar ca se
considera ordinea data de o cheie K), LOCATE NEXT (da adresa
urmatoarei inregistrari din T dupa cea indicata in variabila P),
LOCATE NEXT WITH SEARCH KEY EQUAL (analog cu precedenta doar ca se
considera cheia K si valoarea acestei chei din inregistrarea data de
variabila P), LOCATE FIRST WITH SEARCH KEY GREATER (analog cu
precedenta decat ca valoarea cheii inregistrarii returnate este mai
mare decat cea indicata de variabila P), RETRIEVE (regasirea
inregistrarii identificata de variabila P), UPDATE (modificarea
inregistrarii identificata de P), DELETE (eliminarea inregistrarii
identificata de P), STORE (memorarea unei noi inregistrari si
indicarea adresei de memorare).

In sistemul DATACOM/DB operatiile anterioare sunt realizate


prin operatorii: GSETP (gasirea si citirea primei inregistrari
fizice), LOCKX (gasirea primei inregistrari cu valoare data pentru o
cheie), LOCKY (gasirea primei inregistrari cu cheia mai mare sau
egala cu o valoare data), REDKY (LOCKX+REDLE), RDUKY (LOCKX+RDULE),
GETPS (gasirea si citirea urmatoarei inregistrari fizice), LOCNX
(gasirea urmatoarei inregistrari), LOCBR (gasirea inregistrarii
precedente), LOCNE (gasirea urmatoarei inregistrari cu aceiasi
cheie), LOCNK (gasirea primei inregistrari cu cheia mai mare decat o
valoare), LOCKL (gasirea primei inregistrari cu valoarea cheii mai
mica sau egala cu o valoare data), REDNX (LOCNX+REDLE), RDUNX
(LOCNX+RDULE), REDNE (LOCNE+REDLE), RDUNE (LOCNE+RDULE), REDLE
(citeste inregistrarea gasita), RDULE (citeste inregistrarea gasita
pentru reactualizare - cu locare exclusiva), DELET (sterge
inregistrarea gasita), UPDAT (modifica inregistrarea gasita), RELES
(anuleaza locarea exclusiva) si ADDIT (memoreaza inregistrare noua).

Dintre operanzii operatorilor anteriori fac parte si zona


ceruta indicata ca o variabila de adresa in baza de date ce contine
drumul de acces la informatie, zona I/O ce contine valorile
transferate si o lista de elemente implicate in operatia respectiva.

In 1985 a fost adaugata sistemului componenta CBS (Compound


Boolean Selection) care permite o mai mare flexibilitate si
independenta de date in interfetele de programare. Aceasta cuprinde
operatorii SELFR (selecteaza primul), SELNR (selecteaza urmatorul),
SELSM (selecteaza acelasi inca o data), UPDAT (reactualizeaza), DELET
(elimina) si SELPR (anuleaza setarile).

7.2. TOTAL - tip retea

7.3. IDMS - tip retea

Sistemul IDMS (Integrated Database Management System) a fost


produs de Computer Associates pentru calculatoare IBM cu sisteme de
operare standard (VSE, MVS, etc.) fiind o varianta a DBTG. In 1983 a
fost construita o versiune extinsa numita IDMS/R ce contine
facilitati relationale redenumit apoi CA-IDMS/DB si urmand sa accepte
si constructii SQL. S-au construit preprocesoare pentru IDMS in
limbajele COBOL, PL/I, FORTRAN si Assembler. Sistemul cuprinde o
serie de componente cum sunt IDMS-DC (interfata de comunicare date),
IDD (dictionar de date integrat), OLQ (interfata de cereri on-line),
OLE (interfata cu limba engleza), ADS/OL (generator de aplicatii),
CULPRIT (generator de rapoarte) si altele.

7.4. ADABAS - tip hibrid

Sistemul ADABAS a fost utilizat de ICI si British Rail putand


sa opereze cu structuri din toate cele trei modele principale de baze
de date. El lucreaza cu tabele la care se poate aplica operatia de
uniune dar se pot defini si structuri de tip ierarhic sau de retea.
Are un limbaj de cereri numit ADASCRIPT.

Datele sunt memorate ca fisiere partial inversate putand fi


accesate direct. Fiecarei inregistrari inserate i se asociaza automat
un numar de secventa (ISN) utilizat in accesul la date si la
indicarea apartenentei la un fisier. Datele sunt comprimate. Se pot
defini campuri repetitive. Se pot defini chei neunice numite
descriptori care pot fi un camp, o combinatie de campuri sau o parte
a unui camp. Orice tip de inregistrare poate sa aiba unul sau mai
multi descriptori. Fisierele se pot cupla pe baza descriptorilor.
Daca descriptorii sunt astfel incat valoarea implicata apare o data
intr-un tablou si de mai multe ori in tabloul cu care este acesta
cuplat se obtine o arborescenta, altfel se obtine o retea.

Prelucrarea datelor se face prin intermediul limbajului gazda


folosind instructiunea CALL avand drept parametrii: comanda de
executat, numarul fisierului, formatul inregistrarilor sau campurilor
ce se regasesc, spatiul pentru informatia regasita, conditii de
cautare si valori de descriptori. Se poate specifica in comanda si o
sortare ce se efectueaza pentru raspuns. Inregistrarile pot fi
accesate secvential in ordinea fizica sau in ordinea data de
descriptori.

Informatiile sunt protejate la nivel de fisiere si campuri.


Parolele sunt codificate. Utilizatorii primesc un numar de nivel
intre 0 si 14 ce le da drepturi de acces la citire sau la scriere
pentru partile de baze de date marcate cu un numar de nivel mai mic
sau egal cu numarul asociat utilizatorului.

7.5. System 2000 - tip ierarhic

7.6. DB2 - tip relational

Sistemul de baze de date DB2 a fost conceput de IBM pentru


medii MVS. Limbajul utilizat in descrierea si prelucrarea datelor
este o versiune SQL, deci sistemul este relational. Utilizarea
interactiva a limbajului SQL se face prin intermediul componentei
DB2I.

Sistemul DB2 cuprinde trei mari componente care la randul lor


cuprind multe alte subcomponente:

- Componenta servicii sistem care efectueaza operatii de tip sistem,


comunicari
de operatori, identificari de utilizatori si alte functii similare.

- Componenta servicii de locare ce permit controlul accesului


concurent la date.

- Componenta servicii baza de date ce permit definirea, regasirea si


reactualizarea datelor si a informatiilor privind utilizatorii.

Ultima componenta este cea care este utilizata explicit de


utilizatori si ea cuprinde un precompilator care determina
instructiunile SQL din programe si le transfera intr-un modul de
cereri al bazei de date (DBRM) inlocuidu-le in programe prin apeluri
de proceduri, un constructor care alcatuieste proceduri pentru
cererile din DBRM, un supervizor la executie care apeleaza modulele
corespunzatoare din diferitele componente, un administrator al
datelor memorate si un administrator de memorii tampon pentru
transferul de date intre mediul de memorare si memoria interna.
Constructorul contine o componenta de optimizarea a cererii luand in
considerare diferitii parametrii ce apar cum sunt: tabelele
implicate, dimensiunea lor, existenta indexilor, metode de acces,
conditii de selectare a tuplurilor si altele.

Diferitele modificari aparute in baza de date sunt reflectate


in programe prin recompilari in momentul executiei a cererilor
afectate. Aceste procese sunt facute automat si sunt transperente
pentru utilizator. Sistemul permite redefinirea unor tabele,
definirea sau eliminarea unor tabele, indexi sau vederi fara a fi
necesara oprirea sistemului.

Sistemul DB2 contine un catalog care este un sistem de baze de


date ce cuprinde informatiile ce privesc diferitele obiecte care sunt
importante pentru sistem cum ar fi tabelele de baza, vederile,
indexii, utilizatorii, planurile de aplicatii (rezultate ca
interpretari ale comenzilor SQL din aplicatii), drepturile de acces
si altele. Cataslogul este organizat tot ca relatii in numar de circa
30 dintre care cele mai utilizate sunt:
- SYSTABLES care contine cate un rand pentru fiecare tabel (de baza
sau vedere) din sistem cu numele tabelului (NAME), numele
proprietarului (CREATOR), numarul coloanelor din tabel (COLCOUNT) si
multe alte informatii.
- SYSCOLUMNS care contine cate un rand pentru fiecare coloana a
fiecarui tabel mentionat in SYSTABLES in care se dau numele coloanei
(NAME), numele tabelului din care face parte (TBNAME), tipul de date
(COLTYPE) si altele.
- SYSINDEXES care contine cate un rand pentru fiecare index din
sistem in care se dau numele indexului (NAME), numele tabelului
indexat (TBNAME), numele proprietarului indexului (CREATOR) si
altele.

Tabelele din catalog pot fi utilizate in cereri ca orice alt


tabel. De exemplu se pot obtine numele tabelelor care au coloana NUME
prin

SELECT TBNAME
FROM SYSCOLUMNS
WHERE NAME = 'NUME' ;

aflarea coloanelor relatiei R se poate face cu instructiunile

SELECT NAME
FROM SYSCOLUMNS
WHERE TBNAME = 'R' ;

si numarul tabelelor care are proprietar pe Popescu se poate afla cu

SELECT COUNT(*)
FROM SYSTABLES
WHERE CREATOR = 'Popescu' ;

Modificarea catalogului se face prin intermediul


instructiunilor CREATE, DROP si ALTER care corespund respectiv la
INSERT, DELETE si UPDATE folosite pentru celelalte tabele. Tabelul
initial este construit automat de sistem si are proprietar SYSIBM.

Tabelele SYSTABLES si SYSCOLUMNS contin o coloana numita


REMARKS care poate sa contina un text ce descrie obiectul identificat
de randul respectiv. Acest text poate fi fixat prin instructiunea
COMMENT. De exemplu
COMMENT ON TABLE MAGAZIN IS 'La fiecare rand corespunde o marfa
vanduta'

introduce in SYSTABLES remarca data pentru randul ce defineste


tabelul MAGAZIN

COMMENT ON COLUMN MAGAZIN.PRET IS 'Pretul de vanzare'

si aceasta instructiune da remarca pentru campul PRET din tabelul


MAGAZIN.

Corespondenta dintre vederi si tabelele de baza este data de


tabelul SYSVIEWS din catalog care este reactualizat in momentul
crearii unei vederi.

7.7. DaTaSyS - tip relational

7.8. NOMAD - tip relational

Sistemul NOMAD cu varianta sa NOMAD2 este un SGBD de tip


relational din generatia a patra ce cuprinde printre altele generator
de rapoarte, grafice, statistici, limbaje procedurale si pachete de
analiza financiara. El permite o buna productivitate in dezvoltarea
de aplicatii si de prototipuri. Baza de date se descrie prin scheme.
Are si facilitati de tip ierarhic.

7.9. RELGRAF - tip relational

CURSUL 9

CAPITOLUL AL V-LEA

CONSTRUIREA UNEI BAZE DE DATE

In acest capitol vom prezenta principalele metode utilizate in construirea


bazelor de date, punand accent in special pe modelul relational care este mai des
utilizat. Se are in vedere in primul rand proprietatile bazei de date, usurinta
implementarii la nivel fizic, usurinta interogarii si timpul de raspuns, integritatea
datelor si modul de detectare si reparare a erorilor.

1. Dependente in bazele de date


Pentru modelul relational de o importanta deosebita este alegerea relatiilor ce
compun baza de date. Includerea in baza de date a unei relatii

MAGAZINE(NUMEMAG,ADRESAMAG,MARFA,PRET)

asa cum apare in exemplul 3.8 poate sa provoace anumite anomali cum sunt:

- redondanta - adresa magazinelor este repetata pentru fiecare marfa


vanduta de un magazin
- posibile inconsistente datorate reactualizarilor - pentru valori
redondante se pot schimba unele valori fara a afecta toate aparitiile
acelor valori; astfel un magazit poate sa apara cu mai multe adrese
desi in realitate se considera ca fiecare magazin are o singura adresa
- anomalii de insertie - nu se poate introduce un magazin cu adresa lui
in baza de date decat daca vinde cel putin o marfa
- anomalii la stergere - daca se sterg pe rand toate marfurile vandute
de un magazin nu se mai retin date despre acel magtazin.

Problemele enumerate mai sus nu se mai pun daca in loc de relatia data se
introduc in baza de date relatiile

MAGADR(NUMEMAG,ADRESAMAG)
MAGMAR(NUMEMAG,MARFA,PRET)

din care se poate reconstitui prin uniune naturala relatia initiala.

Calitatile diferitelor relatii sunt descrise cu ajutorul dependentelor functionale


si multivaloare putandu-se face clasificari ale relatiilor in diferite tipuri de forme
normale dupa cum vom vedea in cele ce urmeaza.

1.1. Dependente functionale

Datele continute in baza de date de cele mai multe ori nu pot fi luate la
intamplare din domeniile asociate atributelor corespunzatoare lor. De exemplu nu
putem avea inaltimea unei persoane mai mare decat 3m sau o persoana in viata
nascuta inainte de anul 1800 asa cum nu poate avea o persoana varsta de 20 de ani si
vechimea in munca de 30 de ani. Astfel de erori pot fi detectate impunand anumite
restrictii asupra datelor. Exista doua tipuri de restrictii: restrictii ce depind de
semantica domeniilor elementelor si restrictii rezultate din compararea unor valori.

Fie R(A1,A2,...,An) o schema relationala, X si Y submultimi de atribute ale


lui R; vom spune ca "X determina functional Y" sau "Y depinde functional de X" si
notam X->Y daca pentru orice relatie r valoarea curenta a lui R nu exista doua tupluri
care sa aiba aceleasi valori pentru atributele din X si sa aiba valori diferite pentru cel
putin un atribut din Y.

Daca R este corespondentul unei entitati avand cheia X, se vede imediat ca


pentru orice submultime de atribute Y avem X->Y. Analog, daca R corespunde unei
relatii unu-la-mai-multi de la entitatea E1 la entitatea E2 si X este o cheie a lui E2 iar
Y este o cheie a lui E1 atunci X->Y.

Se spune ca Y este complet dependenta functional de X daca Y este


dependenta functional de X si nu este dependenta functional de nici-o submultime
proprie a lui X.

Dependentele functionale nu pot fi determinate automat. Ele sunt desemnate


de cel care proiecteaza baza de date in functie de restrictiile pe care vrea sa le impuna
si de semnificatia atributelor. De exemplu impunerea unei dependente functionale de
tipul NUME -> ADRESA impune conditia ca fiecarei persoane sa i se atribuie cel
mult o adresa in relatia respectiva.

In cele ce urmeaza vom nota cu A1A2...An multimea atributelor {A1,A2, ...,


An} si cu XY vom nota X U Y unde X si Y sunt submultimi de atribute.

Exemplul 5.1. Pentru baza de date din exemplul 3.8 putem sa stabilim o serie
de dependente functionale dupa cum urmeaza. Presupunand ca nu exista cumparatori
cu acelasi nume si fiecare cumparator are o singura adresa si un singur cont rezulta
pentru relatia CUMPARATORI dependenta functionala

NUME -> ADRESA CONT

Daca pentru comenzi se dau numere diferite atunci pentru relatia COMENZI
se poate stabili dependenta functionala

NR_COM -> NUME MARFA CANTITATE

deoarece NR_COM devine in conditiile date cheie pentru aceasta relatie.

Pentru relatia MAGAZINE se pot impune dependente functionale de tipul

NUMEMAG -> ADRESAMAG


NUMEMAG MARFA -> PRET

care impun unicitatea adresei unui magazin si fatul ca un magazin vinde fiecare marfa
cu un singur pret.

Fie F o multime de dependente functionale pentru o schema relationala R si X


-> Y o dependenta functionala. Vom spune ca F implica logic X -> Y si vom nota F |
= X -> Y daca orice relatie r continut actual pentru R care satisface dependentele
functionale din F satisface si X -> Y. Multimea tuturor dependentelor functionale
implicate logic de F o numim inchiderea lui F si o notam F\+, deci F\+ = {X -> Y | F |
= X -> Y}.

Pentru o relatie R cu atributele A1A2...An si dependentele functionale F


spunem ca o submultime X de atribute este cheie a lui R daca X -> A1A2...An este in
F\+ dar pentru orice submultime proprie Y a lui X dependenta functionala
Y -> A1A2...An nu este in F\+.
O relatie are una sau mai multe chei. In cazul cand sunt mai multe chei se
alege una dintre ele numita cheie primara drept reprezentativa pentru relatia
respectiva, restul fiind numite candidat de cheie.

Exemplul 5.2. Pentru relatia CODURI(ORAS,STRADA,COD) cu


dependentele functionale

ORAS STRADA -> COD


COD -> ORAS

pot fi considerate drept cheie atat {ORAS,STRADA} cat si {STRADA,COD}.

Pentru deducerea dependentelor functionale implicate logic de o multime de


dependente functionale au fost introduse o serie de reguli cunoscute sub numele de
axiomele lui Armstrong. Sa consideram o schema relationala R cu multimea
atributelor U - multime universala de atribute - cu multimea dependentelor
functionale F in care apar numai atribute din U, atunci regulile de inferenta sunt
urmatoarele:

A1. (reflexivitate) {Y C X C U} |= X -> Y.


A2. (amplificare) {X -> Y, Z C U} |= XZ -> YZ.
A3. (tranzitivitate) {X -> Y, Y -> Z} |= X -> Z.

Regula A1 permite obtinerea dependentelor triviale in care partea din dreapta


este continuta in partea din stanga si nu depinde in mod esential de F.

Lema 5.1. Axiomele lui Armstrong sunt corecte in sensul ca daca X -> Y se
deduce din F folosind axiomele stunci X -> Y este verificata pentru orice relatie
pentru care dependentele din F sunt verificate.

Demonstratie. A1 este corecta deoarece nu putem avea o relatie r cu doua


tupluri care sa aiba aceleasi valori pentru atributele din X si in acelas timp sa difere
pentru cel putin un atribut al unei submultimi a lui X. Pentru A2 sa consideram ca ar
exista o relatie r care verifica X -> Y si care are doua tupluri u si v ce coincid pe
atributele XZ dar nu coincid pe YZ si cum pe Z au aceleasi valori ar rezulta ca ele nu
coincid pe Y dar coicid pe X ceea ce este in contradictie cu faptul ca r verifica X ->
Y. Pentru A3 sa consideram relatia r care verifica X -> Y si Y -> Z si fie doua tupluri
u si v care coincid pe X. Din faptul ca r verifica X -> Y rezulta ca u si v coincid si pe
Y iar din faptul ca r verifica Y -> Z rezuta ca u si v coincid si pe Z ceea ce dovedeste
ca r verifica si X -> Z.

Din axiomele lui Armstrong se pot deduce si alte reguli dintre care foarte utile
sunt cele din lema urmatoare.

Lema 5.2. Sunt adevarate urmatoarele formule:

B1. (reuniune) {X -> Y, X -> Z} |= X -> YZ


B2. (pseudotranzitivitate) {X -> Y, WY -> Z} |= XW -> Z
B3. (descompunere) F |= X -> Y si Z C Y atunci F |= X -> Z.
Demonstratie. Pentru B1 din X -> Y se obtine amplificand cu X dependenta X
-> XY iar din X -> Z se obtine amplificand cu Y dependenta XY -> YZ si prin
tranzitivitate din cele doua dependente se obtine X -> YZ. Pentru B2 din X -> Y se
obtine prin amplificare cu W dependenta XW -> YW care impreuna cu a doua
dependenta din enunt dau prin tranzitivitate XW -> Z. Pentru B3 din Z C Y rezulta
prin reflexivitate Y -> Z si aplicand tranzitivitatea pentru prima dependenta din enunt
si dependenta rezultata se obtine X -> Z.

Lema 5.3. X -> A1A2...Ak <=> X -> Ai pentru orice i @c {1,2,...,k}.

Demonstratia se face prin inductie dupa k aplicand B1 si B3.

Fie F o multime de dependente functionale cu multimea atributelor U si fie X


o submultime de atribute. Numim inchiterea lui X in raport cu F, notata X\+
multimea 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.

Exista posibilitatea de a implementa algoritmul precedent pentru a efectua un


numar de calcule de ordinul sumei lungimilor cuvintelor din dependentele functionale
din F.

Faptul ca algoritmul propus calculeaza pe X\+ se demonstreaza in mai multe


etape. Mai intai se observa ca sirul de multimi X\(0), X\(1), ... este un sir strict
crescator de multimi in raport cu incluziunea si marginit superior de multimea finita
U si deci algoritmul se termina dupa un numar finit de pasi. Apoi se demonstreaza
prin inductie dupa i ca X\(i) C X\+. In final se demonstreaza prin inductie dupa
numarul de pasi din "demonstratia" dependentei
X -> Y ca exista un i astfel incat Y C X\(i) ceea ce asigura si incluziunea lui X\+ in
multimea obtinuta de algoritm.

Fie F si G doua multimi de dependente. Spunem ca F si G sunt echivalente si


notam F ~ G daca si numai daca F\+ = G\+. Spunem ca F acopera pe G daca si numai
daca pentru orice dependenta X -> Y din G avem F |= X -> Y. Plecand de la aceste
definitii se demonstraza usor ca F si G sunt echivalente daca si numai daca F acopera
pe G si G acopera pe F. Testele corespunzatoare unei acoperiri se fac relativ simplu
utilizand algoritmul 5.1. Pentru fiecare dependenta X -> Y din G se calculeaza cu
algoritmul dat X\+ si daca Y nu este inclus in X\+ atunci F nu acopera pe G. In cazul
cand pentru fiecare dependenta X -> Y din G multimea Y este inclusa in X\+, F
acopera pe G.

Lema 5.5. Relatia ~ definita mai sus este o relatie de echivalenta pe multimea
multimilor de dependente functionale.

Demonstratia rezulta usor din definitie prin justificarea proprietatilor de


reflexivitate, simetrie si tranzitivitate ale acestei relatii.

Lema 5.6. Pentru orice multime de dependente functionale F existe o multime


de dependente functionale G echivalenta cu ea, in care orice dependenta functionala
contine in partea dreapta un singur atribut.

Demonstratie. G se obtine ca un sir de transformari ale lui F in multimi


intermediare echivalente cu F, o multime obtinandu-se din precedenta prin inlocuirea
unei dependente functionale X -> Y unde Y = A1A2...Ak (k>1) cu multimea de
dependente functionale X -> A1, X -> A2, ..., X -> Ak. Echivalenta se demonstreaza
usor aplicand regulile de descompunere si respectiv reuniune pentru dependentele
diferite din doua multimi consecutive, acestea fiind cele precedente. Faptul ca
procesul de transformare se termina dupa un numar finit de pasi este asigurat de
micsorarea cu o unitate a numarului dependentelor functionale avand partea din
dreapta cu mai mult de un atribut la fiecare transformare. Este usor de vazut, de
asemenea ca rezultatul final nu depinde de ordinea in care sunt alese dependentele
functionale ce se transforma.

Vom spune ca o multime de dependente este minimala daca sunt indeplinite


urmatoarele proprietati:
1. Partea din dreapta oricarei dependente din F are un singur atribut.
2. Oricare ar fi X -> A din F multimea F - {X -> A} nu este echivalenta
cu F.
3. Oricare ar fi X -> A din F si oricare ar fi Z o submultime proprie a
lui X, multimea (F - {X -> A}) U {Z -> A} nu este echivalenta cu F.

Teorema 5.2. Pentru orice multime de dependente functionale F exista o


multime de dependente functionale minimala F' echivalenta cu F.

Demonstratie. Aplicand procedeul din demonstratia lemei 5.6 din F se obtine


o unica multime de dependente functionale F1 echivalenta cu F care indeplineste
conditia 1. Eliminand pe rand din F1 dependentele care contrazic proprietatea 2 se
obtine dupa un numar finit de pasi o multime de dependente F2 care indeplineste
primele doua proprietati si este echivalenta cu F. Multimea F2 poate sa depinda de
ordinea in care se fac eliminarile. In final se incearca eliminarea cate unui atribut din
partea stanga a orcarei dependente care are mai mult de un atribut in partea stanga.
Astfel pentru a putea elimina atributul Ai din dependenta functionala A1...Ai...Ak ->
B este suficient a demonstra ca
F |= A1...Ai-1Ai+1...Ak -> B, adica B apartine lui (A1...Ai-1Ai+1...Ak)\+. Cand nu
se mai pot face eliminari se obtine F'. Ordinea in care sunt eliminate atributele poate
influenta rezultatul final.

Exemplul 5.4. Pentru multimea de dependente functionale F din exemplul 5.3


se pot obtine aplicand procedeul din demonstratia teoremei urmatoarele doua multimi
de dependente minimale echivalente cu F:
F1 = {AB -> C,C -> A,BC -> D,CD -> B,D -> E,D -> G,BE -> C,CG -> D,CE -> G}
F2 = {AB -> C,C -> A,BC -> D,D -> E,D -> G,BE -> C,CG -> B,CE -> G}.

Determinarea unei multimi minimale de dependente functionale echivalenta


cu o multime data de dependente functionale este utila in testele ce se fac in bazele de
date la reactualizare, conducand la un timp de calcul mai mic.

CURSUL 10
1.2. Descompunerea schemelor relationale

Numim descompunere a unei scheme relationale R = {A1,A2,...,An}


inlocuirea ei printr-o multime de scheme relationale @r = {R1,R2,...,Rk} astfel incat
R = R1 U R2 U ... U Rk.

Fie R o schema relationala, @r = {R1,R2,...,Rk} o descompunere a lui R si F


o multime de dependente functionale. Spunem ca @r este o descompunere fara
pierderi la uniune a lui R in raport cu F daca si numai daca pentru orice relatie r
continut actual al lui R care verifica F are loc egalitatea:

r = @P/R1(r) |X| @P/R2(r) |X| ... |X| @P/Rk(r)

Descompunerea fara pierderi la uniune asigura reconstituirea relatiei initiale


din proiectiile acesteia pe relatiile de descompunere in mod unic.

Lema 5.7. Fie R o schema relationala, @r = {R1,R2,...,Rk} o descompunere a


lui R si r continutul actual al lui R. Notand ri = @P/Ri(r) si m/@r(r) = r1 |X| r2 |X| ...
|X| rk au loc urmatoarele relatii:
1. r C m/@r(r).
2. @P/Ri(m/@r(r)) = ri.
3. m/@r(m/@r(r)) = m/@r(r).

Demonstratia rezulta usor din definitiile si notatiile date.

Pentru a testa daca @r = {R1,R2,...,Rk} este o descompunere fara pierderi la


uniune a schemei relationale R in raport cu dependentele functionale F se poate aplica
urmatorul algoritm:

Algoritmul 5.2. Daca R = A1A2...An si @r = {R1,R2,...,Rk} se construieste o


matrice avand k linii si n coloane ce contine in linia i si coloana j simbolul a/j daca Aj
se afla in Ri si respenctiv b/ij daca Aj nu se afla in Ri. Apoi se considera pe rand
dependentele X -> Y din F si pentru fiecare pereche de linii din tabel pentru care
valorile corespunzatoare atributelor lui X coincid se identifica simbolurile din
coloanele corespunzatoare lui Y prin urmatorul procedeu: daca ambele sunt a/j nu se
face nici-o modificare, daca unul este a/j iar celalalt este b/ij se inlocuieste peste tot
b/ij cu a/j iar daca unul este b/ij iar celalalt este b/sj se inlocuieste peste tot b/sj cu
b/ij. Daca la un moment dat se obtine un rand care contine numai simboluri a
descompunerea este fara pierderi la uniune, altfel, cand nu se mai pot face modificari
in tabel, descompunerea este cu pierderi la uniune.

Exemplul 5.5. Fie R = ABCDE, dependentele F = {A -> C, B -> C, C -> D,


DE -> C, CE -> A} si o descompunere a relatiei R in relatiile R1 = AD, R2 = AB, R3
= BE, R4 = CDE si R5 = AE. Aplicarea algoritmului se face plecand de la tabelul
initial:

A B C D E

R1 a1 b12 b13 a4 b15


R2 a1 a2 b23 b24 b25
R3 b31 a2 b33 b34 a5
R4 b41 b42 a3 a4 a5
R5 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:
A B C D E

R1 a1 b12 a3 a4 b15
R2 a1 a2 a3 a4 b25
R3 a1 a2 a3 a4 a5
R4 a1 b42 a3 a4 a5
R5 a1 b52 a3 a4 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.

Demonstratie. Daca algoritmul nu produce un rand numai cu simboluri a se


poate lua relatia r cu tupluri randurile tabloului obtinut care este de tipul R si
indeplineste conditiile din F dar pentru care r @=/ m/@r(r) deoarece tuplul a1a2...an
nu este in r dar este in m/@r(r) si deci descompunerea nu este fara pierderi la uniune.
Reciproc, daca tabelul contine o linie cu simboluri a se poate identifica tabelul cu
expresia calculului relational pe domenii

{a1a2...an | (@Eb11)...(@Ebkn)(R(w1)@A...@AR(wk))}

unde fiecare i este al i-lea rand din tabelul initial, acesta corespunzand functiei m/@r.
Modificarile din algoritm transforma formula precedenta intr-o formula echivalenta
(obtinuta prin identificarea variabilelor corespunzatoare)

{a1a2...an | R(a1a2..an)@A...}

care este o submultime a lui r si deci m/@r(r) C r. Cum incluziunea inversa este
asigurata de lema 5.7 rezulta egalitatea ceea ce dovedeste ca descompunerea este fara
pierderi la uniune.

Teorema 5.4. @r = {R1,R2} este o descompunere fara pierderi la uniune a


schemei relationale R in raport cu dependentele F daca si numai daca are loc una din
cele doua relatii urmatoare:
F |= (R1 @O R2) -> (R1 - R2) sau F |= (R1 @O R2) -> (R2 - R1).

Demonstratia se face aratand ca rezultatul aplicarii algoritmului 5.2 concorda


cu concluzia teoremei.

Exemplul 5.6. Daca R = ABC si F = {A -> B} atunci descompunerea lui R in


AB si AC este fara pierderi la uniune deoarece AB @O AC = A, AB - AC = B si are
loc A -> B. In schimb descompunerea lui R in AB si BC nu este fara pierderi la
uniune deoarece AB @O BC = B, AB - BC = A, BC - AB = C si nu are loc nici-una
din dependentele B -> A sau B -> C. Luand de exemplu r = {a1b1c1,a2b1c2} se
obtine @P/AB(r) = {a1b1,a2b1}, @p/BC(r) = {b1c1,b1c2} si de aici

@P/AB(r) |X| @P/BC(r) = {a1b1c1,a1b1c2,a2b1c1,a2b1c2}

care este o relatie diferita de r.


Numim proiectia unei multimi de dependente F pe o multime de atribute Z si
o notam cu @P/Z(F) multimea tuturor dependentelor X -> Y din F\+ pentru care XY
C Z.

Lema 5.8. Fie R o schema relationala cu dependentele functionale F si fie @r


= {R1,...,Rk} o descompunere a lui R fara pierderi la uniune in raport cu F. Pentru un
i dat, fie Fi = @P/Ri(F) si fie @s = {S1,...,Sm} o descompunere fara pierderi la
uniune in raport cu Fi. Atunci descompunerea lui R in {R1, ..., Ri-1, S1, ..., Sm,
Ri+1, ..., Rk} este fara pierderi la uniune in raport cu F.

Demonstrarea acestei proprietati se bazeaza pe asociativitatea operatiei uniune


naturala si pornind de la definitii se poate arata ca din elementele corespunzatoare la
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
, Z = D U ((D @O (BC))\+ @O BC) = D si Z = D U ((D @O (CD))\+ @O CD) = D
U (D\+ @O CD) = D U (ABCD @O CD) = D U CD = CD. Reluand calculele
obtinem Z = CD la combinarea cu AB si Z = BCD la combinarea cu BC iar la
reluarea calculelor se obtine la combinarea cu AB Z = ABCD dupa care nu se mai fac
alte schimbari in Z. Cum A este in Z se gaseste ca G |= D -> A si deci descompunerea
este cu pastrarea dependentelor.

Teorema 5.5. Algoritmul 5.3 determina corect daca X -> Y este in G\+.

Demonstratie. De fiecare data cand se adauga un atribut in Z se foloseste o


dependenta din G si deci in final Z reprezinta inchiderea lui X in raport cu G.
Reciproc, daca X -> Y este in G\+ se considera etapele de aplicare a algoritmului 5.1
pana cand sunt gasite toate atributele din Y la gasirea inchiderii lui X in raport cu G.
Fiecare pas al algoritmului presupune folosirea unei dependente U -> V din G care se
gaseste de fapt intr-un @P/Ri(F). Prin inducrie dupa numarul pasilor se poate vedea
ca U este inclus la un moment dat in Z de unde rezulta ca sigur la o noua folosire in
algoritmul 5.3 a lui Ri va fi inclus si V in Z ceea ce completeaza demonstratia
teoremei.

1.3. Dependente multivaloare

Fie R o schema relationala, X si Y submultimi ale lui R, vom spune ca exista


o dependenta multivaloare a lui Y de X sau ca X determina multivaloare pe Y si vom
nota X ->> Y daca pentru orice valoare a atributelor lui X sunt asociate valori pentru
atributele lui Y care nu sunt corelate in nici-un fel cu atributele din R - X - Y. Formal,
X ->> Y daca si numai daca pentru orice continut actual al relatiei R, oricare ar fi
tuplurile u si v din r pentru care u[X] = v[X], r contine si tuplurile t si s cu t[X] =
u[X], t[Y] = u[Y] si t[R-X-Y] = v[R-X-Y] respectiv s[X]= v[X], s[Y] = v[Y] si s[R-
X-Y] = u[R-X-Y].

Exemplul 5.9. Sa consideram schema relationala R = CPOLSA unde C este


pentru curs, P - profesor, O - ora, L - loc (sala), S - student si A - an de studiu si
avand urmatoarele dependente functionale: C -> P (fiecare curs are un singur
profesor), OL -> C (numai un curs se poate tine la o ora data intr-o sala data), OP ->
L (la o anumita ora un profesor se poate afla in cel mult o sala), CS -> A (fiecare
student urmeaza un curs intr-un anumit an de studiu), OS -> L (fiecare student se
poate afla in cel mult o sala la un moment dat). La multimea dependentelor se poate
adauga dependenta multivaloare C ->> OL care semnifica faptul ca fiecarui curs i se
asociaza o multime de perechi de ore si sali care nu depind in nici-un fel de celelalte
informatii. In schimb nu au loc in general dependentele multivaloare C ->> O sau C
->> L.

Si in cazul dependentelor multivaloare se pot descrie regulile de inferenta


pentru determinarea dependentelor ce se pot deduce logic dintr-o multime de
dependente date D cu atribute din multimea U si anume:

A1. (reflexivitate dependente functionale) {Y C X C U} |= X -> Y.


A2. (amplificare dependente functionale) {X -> Y, Z C U} |= XZ -> YZ.
A3. (tranzitivitate dependente functionale) {X -> Y, Y -> Z} |= X -> Z.
A4. (complementare dependente multivaloare) {X ->> Y} |= X ->> (U-X-Y).
A5. (amplificare dependente multivaloare) {X ->> Y, V C W} |= WX ->> VY.
A6. (tranzitivitate dependente multivaloare) {X ->>Y, Y ->> Z} |= X ->> (Z - Y).
A7. {X -> Y} |= X ->> Y.
A8. {X ->> Y, Z C Y, W @O Y = @O/, W -> Z} |= X -> Z.

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.

Exemplul 5.10. Pentru exemplul 5.9 din C ->> OL prin complementaritate se


deduce C ->> PSA iar din C -> P aplicand axioma A7 deducem C ->> P care
determina partitionarea lui PSA in P si SA. Cum nici-un alt atribut in afara de P si de
C nu este determinat multivaloare de C rezulta ca baza de dependente a lui C in raport
cu dependentele functionale si multivaloare date este {P,OL,SA}.

Pentru a testa daca o dependenta multivaloare X ->> Y se deduce logic din D


se calculeaza baza de dependente a lui X in raport cu D si daca Y - X se poate scrie ca
o reuniune de elemente din baza de dependente atunci dependenta data se deduce
logic din D, altfel nu.

Exemplul 5.11. Tinand seama de proprietatea anterioara si de exemplul 5.9 se


poate deduce imediat ca sunt valabile dependentele C ->> CPSA, C ->> OLSA dar nu
este satisfacuta C ->> PO sau altele asemanatoare.

Calculul efectiv al bazei de dependente se poate face eficient (polinomial)


aplicand urmatorul algoritm:

Algoritmul 5.4. Fie M o multime de dependente multivaloare peste atributele


U si X o submultime a lui U.
1. Fie T multimea multimilor Z C U pentru care exista W ->> Y in M cu W C X si
Z este oricare din multimile Y - X sau U - X - Y.
2. Se inlocuiesc in T oricare doua multimi Z1 si Z2 cu intersectie nevida cu
multimile Z1 - Z2, Z2 - Z1 si Z1 @O Z2, eliminand multimile vide. Fie S
rezultatul obtinut.
3. Pentru orice dependenta V ->>W din M pentru care exista Y in S care este
disjunct de V dar Y si W au intersectia nevida, se inlocuieste Y cu Y @O W si
Y - W in S. Baza de dependente este multimea S rezultata.

Ca si pentru dependentele functionale exista un criteriu simplu de a vedea


daca o descompunere in doua componente este fara pierderi la uniune si in cazul
dependentelor multivaloare dupa cum rezulta din teorema urmatoare.

Teorema 5.8. Fie R o schema relationala, D o multime de dependente


functionale si multivaloare pe multimea atributelor lui R si @r = (R1,R2) o
descompunere a lui R. Atunci @r este fara pierderi la uniune daca si numai daca (R1
@O R2) ->> (R1 - R2).

Demonstratie. Descompunerea @r este fara pierderi la uniune daca si numai


daca pentru orice relatie r ce satisface D si pentru orice doua tupluri t si s din r, exista
un tuplu in r astfel incat u[R1] = t[R1] si u[R2] = s[R2]. Dar tuplul u exista daca si
numai daca t[R1 @O R2] = s[R1 @O R2] ceea ce duce la dependenta multivaloare
din enuntul teoremei.

Se intalnesc situatii cand sunt valabile dependente multivaloare pe


componente ale unei descompuneri fara a fi valabile pe relatia initiala. Aceste
dependente se numesc dependente ascunse. O relatie r de tipul schemei relationale R
satisface o dependenta multivaloare ascunsa X ->> Y | Z daca dependenta
multivaloare X ->> Y este satisfacuta de relatia @P/XUYUZ(r). Exemple de
dependente ascunse sunt C ->> S | P sau C ->> P | S unde P inseamna cursuri
necesare de urmat anterior.

1.4. Dependente generalizate

Pana acum am definit dependentele functionale, dependentele multivaloare si


dependentele multivaloare ascunse. In afara de acestea se mai poate considera
dependenta si conditia de descompunere fara pierderi la uniune a unei scheme
relationale numita dependenta de uniune si notata |X| (R1,R2,...,Rk) care este
satisfacuta de relatia r continut actual al relatiei R1 U ... U Rk daca si numai daca
uniunea naturala a proiectiilor lui r pe fiecare Ri este egala cu r. Toate aceste tipuri de
dependente pot fi exprimate unitar prin dependentele generalizate pe care le definim
in continuare.

O dependenta generalizata peste schema relationala A1...An este o expresie de


forma (t1,...,tk)/t, unde fiecare ti este un n-tuplu de simboluri si t este fie un alt tuplu,
in care caz avem o dependenta generatoare de tupluri, fie o expresie x = y cu x si y
dintre simbolurile ce apar anterior, in acest caz avem o dependenta generatoare de
egalitati. Numim (t1,...,tk) ipoteza dependentei si t concluzia dependentei. Un simbol
din concluzie care nu mai apare in alta parte se numeste unic. O dependenta
generalizata se numeste ascunsa daca are cel putin un simbol unic si se numeste
completa daca nu contine nici-un simbol unic.

O dependenta functionala nebanala X -> Y se exprima printr-un numar de


dependente generalizate egal cu numarul elementelor multimii Y - X cu ipoteza
formata din doua tupluri ce contin simboluri comune pentru atributele din X si
simboluri distincte pentru celelalte atribute iar concluzia contine o egalitate intre
simboluri din cele doua tupluri pentru un atribut din Y - X.

O dependenta multivaloare de tipul X ->> Y se exprima ca o dependenta


generalizata cu ipoteza formata din doua tupluri care au aceleasi simboluri pentru
atributele din X si simboluri distincte in rest iar concluzia este un tuplu cu simboluri
din primul tuplu pentru atributele XY si cu simbolurile din al doilea tuplu in rest.
O dependenta multivaloare ascunsa X ->> Y | Z se poate reprezenta ca o
dependenta generalizata cu ipoteza formata din doua tupluri care au aceleasi valori
pentru atributele lui X si valori diferite pentru celelalte atribute iar concluzia coincide
cu ipotezele pe atributele lui X, are valorile din primul tuplu pentru atributele lui Y,
are valorile din al doilea tuplu pentru atributele din Z si are simboluri unice in rest.

O dependenta de uniune se poate reprezenta ca o dependenta generalizata cu


ipoteza continand un numar de tupluri egal cu numarul relatiilor din descompunere ce
contin simboluri comune pentru aparitiile unui atribut in mai multe relatii pentru
tuplurile corespunzatoare relatiilor in care apare acel atribut si simboluri diferite in
rest iar concluzia contine simbolul asociat fiecarui atribut in ipoteza. Evident,
concluzia nu are simboluri unice deoarece fiecare atribut apare cel putin intr-o
componenta.

Pentru simplificarea notatiei, in tabelele asociate dependentelor generalizate se


convine sa nu se mai noteze simbolurile care au o singura aparitie
(ipoteza+concluzie).

Fie S si T doua multimi de simboluri. Spunem ca h este o aplicatie de


simboluri daca pentru fiecare a din S se defineste h(a) ca fiind un element al lui t.
Daca s = 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 b) 0 1 2
a1 b2 c2 0 3 4
__________________ 0 3 2
a2 b1 c2 5 1 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 identifica in r pe w cu x obtinand r = {xyz}. Daca se aplica dependenta
(abc,ade,fbe)/abq lui r folosind g atunci se adauga lui r tuplul xyu deoarece g(a) = x,
g(b) = y si q fiind un simbol unic se introduce un nou simbol u si se defineste h(q) =
u.

Se poate defini un proces care stabileste daca D |= d unde D este o multime de


dependente generalizate si d este o dependenta generalizata. Procesul devine algoritm
in cazul cand D contine numai dependente complete (fara elemente unice). Se incepe
cu ipotezele dependentei d si se aplica pe rand inferentele rezultate din dependentele
date D. Daca la un moment dat se obtine consecinta lui d rezulta ca d se poate deduce
logic din D. Daca procesul se termina fara a gasi consecinta lui d rezulta ca d nu se
poate deduce logic din D, rezultatul obtinut la terminarea procesului este un
contraexemplu de relatie care satisface D dar nu satisface d. Procesul poate continua
infinit daca D are elemente unice.

Exemplul 5.15. Pentru a verifica expresia

{A ->> B|C, B -> D} |= A ->> C|D

se construiesc dependentele generalizate din fig.5.2. Se incepe cu relatia r =


{a4b4c5d6, a4b5c5d7} la care se poate aplica dependenta din fig. 5.2.a luand ca
aplicatie de simboluri h(a1)=a4, h(b1)=b5, h(c1)=c6, h(d1)=d7, h(b2)=b4, h(c2)=c5 si
h(d2)=d6 care se extinde punand h(d3)=d8 (simbol nou) si deci se adauga lui r tuplul
a4b5c5d8. Aplicand relatiei obtinute dependenta din fig. 5.2.b folosind o aplicatie de
simboluri care transfeorma ipoteza in ultimile doua tupluri ale relatiei se obtine
d7=d8 si deci relatia r devine r = {a4b4c5d6, a4b5c6d7, a4b5c5d7} si cum ultimul
tuplu coincide cu concluzia din fig. 5.2.c in afara de coloana B unde apare un element
unic b6 se poate trage concluzia ca expresia data este adevarata.

a1 b1 c1 d1 a2 b3 c3 d4
a1 b2 c2 d2 a3 b3 c4 d5
__________________________ __________________________
a1 b1 c2 d3 d4 = d5
a) A ->> B|C b) B -> D

a4 b4 c5 d6
a4 b5 c6 d7
__________________________
a4 b6 c5 d7
c) A ->> C|D

Figura 5.2.

2. Forme normale ale bazelor de date relationale

Pentru a deosebi anumite calitati specifice ale unor relatii s-au facut mai multe
clasificari. Dintre aceste clasificari cea mai frecvent utilizata este clasificarea in forme
normale. Se spune ca o relatie este intr-o forma normala particulara daca satisface o
multime de constrangeri data. Transformarea unei relatii intr-o multime de relatii de
un 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.

A doua forma normala poate sa contina asa-numitele dependente tranzitive ce


se deduc prin aplicarea axiomei tranzitivitatii din alte doua dependente functionale.
Dependentele tranzitive pot sa produca anomali la insertie, stergere si modificare
dupa cum am vazut mai sus.

Trecerea unei relatii din 1NF de forma

R ( A, B, C, D )
PRIMARY KEY ( A, B )
R.A --> R.D

in 2NF se face prin descompunerea lui R in relatiile

R1 ( A, D )
PRIMARY KEY ( A )
R2 ( A, B, C )
PRIMARY KEY ( A, B )
FOREIGN KEY ( A ) REFERENCES R1

2.3. A treia forma normala (3NF)

Spunem ca schema relationala R este in a treia forma normala daca este in a


doua forma normala si pentru orice dependenta X -> A cu A necontinut in X care are
loc in R fie X contine o cheie fie A este un atribut prim.
Cu alte cuvinte, relatia R este in 3NF daca si numai daca atributele care nu
apar in chei sunt independente intre ele si sunt complet dependente de cheia primara
(atributele prime nu sunt dependente tranzitiv de cheia primara).

Exemplul 5.17 Relatia R = ABC cu dependentele F = {AB -> C, C -> A} este


in a treia forma normala deoarece avand cheile AC si BC toate atributele sunt prime
si deci nu exista nici-un atribut neprim.

Orice relatie in a treia forma normala este in a doua forma normala. Reciproca
nu este adevarata dupa cum se vede din urmatorul exemplu.

Exemplul 5.18. Fie relatia R = ABCD cu dependentele functionale F = {AB


-> C, AC -> D} care are unica cheie AB. Aceasta relatie nu este in a treia forma
normala deoarece exista dependenta AC -> D cu D neprim si AC nu contine o cheie.
Cum nici-o submultime proprie a lui AB nu determina functional nici pe C nici pe D
rezulta ca R este in a doua forma normala.

A tria forma normala inlatura redondantele, anomaliile la modificari,


anomaliile la insertie si anomaliile la stergere.

Orice schema relationala R cu dependentele F se poate descompune cu


pastrarea dependentelor in relatii care sunt in a treia forma normala prin metoda data
de algoritmul urmator.

Algoritmul 5.5. Fie R o schema relationala si F o multime minimala de


dependente functionale.
1. Pentru fiecare atribut A din R care nu apare in nici-o dependenta
functionala se costruieste o schema relationala cu singurul atribut A (care este evident
in 3NF) se scoate la iesire schema relationala A si se elinima A din R.
2. Daca o dependenta din F contine toate atributele lui R se scoate R la iesire
si STOP.
3. Pentru fiecare multime de dependente din F de tipul X -> A1, X -> A2,
..., X -> Ak se scoate la iesire X -> A1A2...Ak si STOP.

Exemplul 5.19. Aplicand algoritmul 5.5. pentru schema relationala R =


CPOLSA unde C inseanma curs, P - profesor, O - ora, L - loc (sala), S - student si A -
an de studiu si avand urmatoarea multime minimala de dependente functionale: C ->
P (fiecare curs are un singur profesor), OL -> C (numai un curs se poate tine la o ora
data intr-o sala data), OP -> L (la o anumita ora un profesor se poate afla in cel mult o
sala), CS -> A (fiecare student urmeaza un curs intr-un anumit an de studiu), OS -> L
(fiecare student se poate afla in cel mult o sala la un moment dat) se obtine
descompunerea cu pastrarea dependentelor avand urmatoarele scheme relationale care
sunt evident in 3NF: CP, OLC, OPL, CSA si OSL.

Teorema 5.9. Algoritmul 5.5 calculeaza o descompunere cu pastrarea


dependentelor in scheme relationale de tip 3NF pentru orice schema relationala.

Demonstratie. Faptul ca sunt pastrate dependentele rezulta imediat din faptul


ca fiecare dependenta din F se regaseste in cel putin una din componentele obtinute.
Sa aratam ca aceste componente sunt in 3NF. Sa presupunem ca ar exista o
componenta de tipul C = YB1B2...Bk produsa de algoritm care nu este in 3NF si fie
dependenta functionala X -> A dedusa din F care nu indeplineste conditia din 3NF,
deci A este neprim si X nu contine o cheie. Y este o cheie pentru C deoarece din Y ->
Y (reflexivitate) si Y -> Bi (sunt in F) rezulta Y -> C si daca ar exista o submultime
proprie Z a lui Y care sa fie cheie pentru C s-ar obtine o multime de dependente
echivalenta cu F inlocuid fiecare dependenta de forma Y -> B cu Z -> B deci F nu ar
fi minimala. Deci putem considera ca exista j cu A = Bj, A nu se afla in X care este
continut in C. Y fiind cheie pentru C rezulta Y -> X este dedusa logic din F aplicand
legea reuniunii pentru dependentele Y -> Ai pentru fiecare atribut Ai din X, care sunt
diferite de Y -> Bj deoarece A nu este in X. Dar in acest caz Y -> Bj poate fi dedusa
logic prin tranzitivitate din Y -> X si X -> A = Bj ceea ce dovedeste ca F nu ar fi
minimala. Deci componentele obtinute prin algoritm sunt 3NF.

Teorema 5.10. Fie @r descompunerea cu pastrarea dependentelor a schemei


relationale R obtinuta prin algoritmul 5.5 si K o cheie a lui R. Atunci @s = @r U {K}
este o descompunere a lui R cu toate componentele in 3NF cu pastrarea dependentelor
si fara pierderi la uniune.

Demonstratie. Din definitia unei chei rezulta ca schema relationala ce contine


numai atributele unei chei este in 3NF, deci @s are toate componentele in 3NF. Cum
@s are cel putin dependentele lui @r care acopera pe F rezulta ca descompunerea @s
este cu pastrarea dependentelor. Faptul ca descompunerea este fara pierderi la uniune
se verifica aplicand algoritmul 5.2 prin care se obtine pe linia X numai simbolul a,
deoarece X este cheie si pentru fiecare nou atribut A ce se adauga in calculul lui X\+
se adauga in coloana corespunzatoare lui A si in linia lui X simbolul a.

Descompunerile obtinute din enuntul teoremei precedente nu sunt minimale si


se pot elimina acele componente care nu sunt necesare pentru pastrarea proprietatilor.

Trecerea unei relatii din 2NF de forma

R ( A, B, C )
PRIMARY KEY ( A )
R.B --> R.C

in 3NF se face prin descompunerea lui R in relatiile

R1 ( B, C )
PRIMARY KEY ( B )
R2 ( A, B )
PRIMARY KEY ( A )
FOREIGN KEY ( B ) REFERENCES R1

Pentru relatiile in 3NF singurele informatii care trebuie furnizate sistemului


sunt cele ce indica cheia principala deoarece toate dependentele sunt deduse fiind de
forma "orice atribut necheie este dependent functional de cheie".

2.4. Forma normala Boyce-Codd (BCNF)


Spunem ca o relatie R cu dependentele F este in forma normala Boyce-Codd
daca oricare ar fi dependenta X -> A cu A atribut necontinut in X exista o cheie a lui
R continuta in X.

Orice relatie in forma normala Boyce-Codd este in a treia forma normala dar
reciproca nu este adevarata dupa cum se vede din exemplul urmator.

Exemplul 5.20. Relatia R = ABC cu dependentele F = {AB -> C, C -> A} este


in a treia forma normala dar nu este in forma normala Boyce-Codd deoarece cheile
acestei relatii sunt AC si BC iar pentru dependenta C -> A partea stanga nu contine
nici-una din cele doua chei.

Daca orice relatie se poate descompune fara pierderi la uniune in forme


normale Boyce-Codd nu acelasi lucru se poate spune despre descompunerea cu
pastrarea dependentelor. Se vede imediat ca pentru relatia din exemplul 5.20 nu se
poate face nici-o descompunere a lui ABC care sa dea forme normale Boyce-Codd si
care sa permita deducerea dependentei functionale AB -> C. Descompunerea fara
pierderi la uniune in forme normale Boyce-Codd in raport de proiectiile
dependentelor functionale pe componentele respective se poate face aplicand
urmatorul algoritm:

Algoritmul 5.6. Fie R o schema relationala si F multimea dependentelor


functionale. Fie @r = {R}. Pentru fiecare schema relationala S din @r care nu este in
forma normala Boyce-Codd, deci pentru care exista X -> A cu A neprim si X
necontinand o cheie se inlocuieste S in @r cu S1 = AX si S2 = S - A. Procesul
continua pana cand toate componentele lui @r sunt in BCNF.

Corectitudinea algoritmului se verifica prin faptul ca la fiecare descompunere


numarul atributelor din componente este mai mic decat multimea descompusa, ca
fiecare descompunere este fara pierderi la uniune dupa cum rezulta din teorema 5.4 si
nu afecteaza descompunerea fara pierderi la uniune pentru relatia initiala dupa cum
rezulta din lema 5.8.

Exemplul 5.21. Sa consideram schema relationala R si dependentele


functionale F din exemplul 5.9. Singura cheie este OS. Aplicand algoritmul 5.6 sa
consideram dependenta CS -> A care nu indeplineste conditia din definitia BCFN
rezultand descompunerea CSA si CPOLS. Proiectia lui F pe CSA are acoperirea
minimala CS -> A si cheia CS de unde rezulta imediat ca CSA este in BCNF.
Proiectia lui F pe CPOLS are acoperirea minimala F1 = {C -> P, OL -> C, PO -> L,
OS -> L} cu singura cheie OS. Pentru acesta ultima relatie consideram dependenta C
-> P care nu indeplineste conditia din definitia BCNF ce descompune CPOLS in CP
si COLS avand acoperirile minimale pentru proiectia dependentelor C -> P pentru CP
si CO -> L, OS -> L si OL -> C pentru COLS. CP este BCNF dar COLS nu avand
cheia OS si dependenta CO -> L care nu respecta conditia pentru BCNF si care
produce descompunerea COL si COS ambele fiind in BCNF. Deci descompunerea lui
CPOLSA in BCNF poate fi CSA, CP, COL si COS. In descompunerea data nu se
pastreaza dependenta PO -> L.

Problema de a determina daca o relatie este in BCNF sau nu este o problema


NP-completa deci nu exista algoritmi eficienti pentru a o rezolva in general.
2.5. A patra forma normala (4NF)

Fie R o schema relatioanla si D o multime de dependente functionale si


multivaloare pe R. Spunem ca R este in a patra forma normala (4NF) daca pentru
orice dependenta multivaloare X ->> Y cu Y neinclusa in X si XY @=/ R exista o
cheie a lui R inclusa in X.

Cu alte cuvinte, o relatie R este in a patra forma normala daca este in BCNF si
orice dependenta multivaloare este de fapt o dependenta functionala.

Daca D contine numai dependente functionale si R este in 4NF atunci R este


in BCNF ceea ce se deduce usor din definitii.

Se poate gasi o descompunere @r = {R1,...,Rk} a lui R fara pierderi la uniune


in raport cu D si in care toate componentele sa fie in 4NF cu procedeul urmator. Se
incepe cu @r = {R}. Daca @r contine o componenta care nu este in 4NF in raport cu
proiectia lui D pe multimea atributelor S din componenta respectiva exista o
dependenta X ->> Y in S cu Y necontinut in X, XY diferit de S si X nu contine o
cheie a lui S. Se poate considera X si Y disjuncte deoarece din dependenta precedenta
rezulta aplicand axiomele A1, A7 si legea descompunerii ca X ->> (Y - X). Se
inlocuieste S cu S1 = XY si S2 = S - Y care sunt doua scheme relationale cu mai
putine atribute decat S. Din teorema 5. , deoarece (S1 @O S2) ->> (S1 - S2)
descompunerea lui S in S1 si S2 este fara pierderi la uniune in raport cu proiectia lui
D pe S. Aplicand procedeul anterior, dupa un numar finit de pasi se obtine
descompunerea fara pierderi la uniune a lui R in 4FN.

Proiectia dependentelor lui D pe multimea de atribute S se poate obtine cu


formula urmatoare

@P/S(D) = {X -> (Y @O S) | X -> Y @c D\+, X C S} U


{X ->> (Y @O S) | X ->> Y @c D\+, X C S}

Exemplul 5.22. Pentru relatia din exemplul 5.9 dependenta C ->> OL nu


respecta conditia din 4NF deoarece C nu contine o cheie (singura cheie a relatiei este
SO). Se descompune relatia CPOLSA in COL cu cheia OL care este in 4NF si CPSA
cu cheia CS. Relatia CPSA nu este in 4NF deoarece exista dependenta
C ->> P care rezulta din C -> P si C nu contine o cheie. Se descompune CPSA in CP
si CSA care sunt ambele in 4NF. Deci o descompunere a relatiei CPOLSA fara
pierderi la uniune in 4FN este {COL, CP, CSA}.

2.6. A cincia forma normala (5NF)

Se spune ca o relatie R satisface dependenta de uniune (join dependency sau


pe scurt JD) * ( X, Y, ..., Z ) daca si numai daca R este egal cu uniunea proiectiilor lui
R pe X, Y, ..., Z, acestea fiind submultimi ale lui R.
O relatie R este in cea de-a cincia forma normala numita si "forma normala
proiectie-uniune" (pe scurt PJ/NF sau 5NF) daca si numai daca orice dependenta de
uniune a lui R este o consecinta a unui candidat de chei a lui R.

Orice relatie care este in 5NF este si in 4NF deoarece fiecare dependenta
multivaloare poate fi privita ca un caz particular de dependenta de uniune. Orice
relatie poate fi descompusa fara pierderi la uniune intr-o multime de relatii care sunt
in 5NF. Se garanteaza faptul ca o relatie in 5NF nu contine anomalii ce pot fi
eliminate luand proiectiile.

Fagin a dat un algoritm prin care se poate testa daca o JD este o consecinta a
unei multimi de candidati de cheie. In consecinta pentru a spune daca o relatie R este
in 5NF este suficienta cunoasterea candidatilor de cheie si a tuturor dependentelor de
uniune din R.

Procesul de normalizare a relatiilor se poate descrie in felul urmator:

1. Se proiecteaza relatia initiala in 1NF pe alte relatii pentru a elimina


dependentele functionale care nu sunt complete. Se obtine o multime de
relatii in 2NF.
2. Se proiecteaza relatiile obtinute in pasul 1 pe alte relatii pentru a elimina
dependentele functionale tranzitive. Se obtine o multime de relatii in 3NF.
3. Se proiecteaza relatiile obtinute in pasul 2 pe alte relatii pentru a elimina
dependentele in care partea din stanga nu este o supracheie. Se obtine o
multime de relatii in BCNF.
4. Se proiecteaza relatiile obtinute in pasul 3 pe alte relatii pentru a elimina
toate dependentele multivaloare care nu sunt si dependente functionale. Se
obtine o multime de relatii in 4NF.
5. Se proiecteaza relatiile obtinute in pasul 4 pe alte relatii pentru a elimina
orice dependenta de uniune care nu este implicata de o cheie. Se obtine o
multime de relatii in 5NF.

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.

Exemplul 5. . Constrangerile de domeniu pentru a exprima o data


calendaristica pot fi exprimate intr-un pseudolimbaj in felul urmator:

CREATE DOMAIN ZI CHAR(2)


CHECK IS_INTEGER(ZI) AND NUM(ZI) >= 1 AND NUM(ZI) <=
31;
CREATE DOMAIN LUNA CHAR(2)
CHECK IS_INTEGER(LUNA) AND NUM(LUNA) >= 1 AND
NUM(LUNA) <= 12;
CREATE DOMAIN AN CHAR(2)
CHECK IS_INTEGER(AN) AND NUM(AN) >= 0 AND NUM(AN)
<= 99;
CREATE DOMAIN DATA(ZZ DOMAIN(ZI), LL DOMAIN(LUNA), AA
DOMAIN(AN))
CHECK IF NUM(LL) IN (4,6,9,11) THEN NUM(ZZ) < 31
AND IF NUM(LL) = 2 THEN NUM(ZZ) < 30
AND IF NUM(LL) = 2 AND MOD(NUM(AA),4) = 0 AND
MOD(NUM(AA),100) <> 0 THEN NUM(ZZ) < 29;

Verificarea ca in fiecare tuplu al unei relatii de baza in campurile


corespunzatoare cheii principale sa apara valori diferite de null, numita regula
integritatii entitatii, este un exemplu de constrangere de integritate de relatie unituplu.
Aceasta regula se mai poate enunta si sub forma: intr-o baza de date relationala nu se
inregistreaza nici-o informatie despre ceva ce nu poate fi identificat.
Un exemplu de constrangeri de integritate de relatii de tip multituplu sunt
numite constrangeri referentiale si se exprima prin necesitatea de a avea pentru chiele
straine, daca nu sunt nule, valori corespunzatoare uneia din cheile primare existente in
relatia referita. Aceasta verificare are loc de cate ori se insereaza un nou tuplu ce
contine o cheie straina sau se modifica valoarea unei chei straine a unui tuplu,
semnalandu-se eventualele neconcordante si anuland modificarile. Verificarea
unicitatii cheii primare si constrangerile rezultate din dependentele functionale si
multivaloare sunt alte exemple de acelasi tip.

Costrangerile de integritate pot fi exprimate prin intermediul limbajului de


prelucrare a datelor sub forma unei egalitati sau ca o relatie intre rezultatele a doua
cereri.

Exemplul 5. . In baza de date cu magazinele se poate impune conditia ca o


comanda sa fie luata in consideratie numai daca este facuta de un cumparator din lista
celor existenti in sistem, ceea ce se poate exprima prin

@P/NUME(COMENZI) @C= @P/NUME(CUMPARATORI)

iar conditia de a nu avea cumparatori cu cont negativ se poate exprima prin

@P/NUME(CUMPARATORI) =
@P/NUME(@S/CONT@>=0(CUMPARATORI))

Verificarea conditiilor se face prin intermediul comenzilor impuse la definirea


datelor. De exemplu in sistemul DBTG se pot include in declaratiile seturilor si ale
inregistrarilor instructiuni de forma

ON <lista comenzi> CALL <procedura>

unde lista de comenzi este o submultime a multimii {INSERT, REMOVE, FIND}


pentru seturi si respectiv {INSERT, REMOVE, FIND, STORE, DELETE, MODIFY,
GET} pentru inregistrari iar procedura este o procedura de testare a diferitelor valori
pentru operatiile indicate. Procedura poate fi scrisa in COBOL si poate sa foloseasca
si elemente din limbajele de descriere si prelucrare ale datelor. O astfel de comanda se
executa de cate ori se face o operatie din lista indicata asupra datelor definite,
putandu-se eventual impiedica efectuarea operatiei daca nu sunt indeplinite conditiile
impuse.

In sistemul QBE o prima verificare este facuta in legatura cu unicitatea


valorilor pentru atributele declarate cheie in operatiile de inserare si modificare
semnalandu-se cazurile exceptie fara a se mai efectua operatia.

Pentru fiecare relatie in parte sistemul QBE asociaza o tabela de constrangeri.


Se pot crea constrangeri pentru relatia R punand pentru fiecare cate un rand in
scheletul de tabel al lui R avand in prima coloana o expresie

I. CONSTR (<lista conditii>).I.

unde lista de conditii poate sa contina I.(inserare), D.(stergere), U.(modificare) sau


identificatori de conditii definite de utilizatori. Pe aceeasi linie se pun in dreptul
atributelor diferitele conditii ce trebuiesc indeplinite prin metodele date in limbajul de
prelucrare a datelor.

Exemplul 5. . Pentru a impune ca nici-un cumparator sa nu aiba mai mult de


100000 lei datorii se pune in scheletul CUMPARATORI conditia:
_____________________________________________________________________
_______
CUMPARATORI | NUME | ADRESA | CONT |
_________________________|______________|__________________|
________________|
I.CONSTR(I.U.).I. | | | >=-100000 |
| | | |

si conditia ca orice comanda acceptata sa contina marfa vanduta de cel putin un


magazin se poate exprima prin scheletele COMENZI si MAGAZINE urmatoare:
_____________________________________________________________________
_______
COMENZI | NR_COM | NUME | MARFA | CANTITATE |
______________________|_____________|_____________|____________|
____________|
I.CONSTR(I.).I. | | | _portocale | |
| | | | |
_____________________________________________________________________
_______
MAGAZINE | NUMEM | ADRESAM | MARFA | PRET |
______________________|_____________|_____________|____________|
____________|
| | | _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

In legatura cu integritatea datelor este si protectia datelor pentru diferite


evenimente de avarie cum ar fi: caderea sistemului cauzata de defectarea unor
componente hardware sau software, executarea incompleta a unor programe din cauza
aparitiei unor erori sau din necesitatea de intrerupere a lor din cauza unor interblocari
sau prin iterventia utilizatorilor, programarea eronata a unor activitati prin strategiile
folosite de sistem si alte cauze.

Pentru reconstituirea bazelor de date in cazul cand pot sa apara inconsistente


in general, majoritatea bazelor de date se copiaza periodic pe medii magnetice ce se
pastreaza in locuri sigure. De asemenea se tine o evidenta a tuturor transformarilor
efectuate in baza de date de cand s-a efectuat ultima copie. Fisierul care contine
aceste modificari se numeste jurnal. Fiecare inregistrare din jurnal contine un
identificator al programului care a facut modificarea, fosta valoare si noua valoare
introdusa pentru un element. Tot in jurnal se mai pastreaza diferitele monente
importante din desfasurarea programelor (inceput, sfarsit, terminarea unor operatii,
etc.).

Se spune despre o tranzactie ca este comisa daca au fost terminate toate


calculele produse de ea in aria de lucru si s-a facut o copie a rezultatelor ei in jurnal.
Aparitia unor caderi dupa ce o tranzactie a fost comisa nu afecteaza continutul bazei
de date deoarece se poate reconstitui baza de date cu ajutorul ultimei copii si a
jurnalului in care se gasesc toate rezultatele tranzactiilor comise. Modificarile
tranzactiilor abandonate sau necomise nu sunt luate in considerare la parcurgerea
jurnalului pentru restaurarea bazei de date.
Se defineste strategia de comitere in doua faze astfel: o tranzactie poate sa
scrie intr-o baza de date numai dupa ce a fost comisa si o tranzactie poate fi comisa
numai dupa ce a inregistrat in jurnal toate schimbarile de elemente produse de ea.

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


drepturilor de acces ale fiecarui utilizator la portiunile din baza de date
si se fixeaza reguli de transmitere de la un utilizator la altul a dreptului
de acces.

De multe ori utilizarea vederilor in diferitele aplicatii serveste si pentru


protejarea datelor. In unele sisteme nu sunt posibile modificari prin intermediul
vederilor. Astfel de vederi se numesc numai pentru citire (read-only) si sunt utilizate
mai ales in aplicatiile in care datele pot fi citite de toti utilizatorii (baze de date
publice) dar modificarile se fac numai cu aprobarea proprietarului bazei de date. De
exemplu, in ISBL si QBE se pot crea vederi cu continutul actual al unor relatii, cu
parti din relatii pe atribute sau pe tupluri care pot fi facute publice si citite de
utilizatori.
Alte sisteme cum sunt IMS, System R si DBTG permit definirea unor vederi in care
se poate face atat citire cat si scriere pentru anumite obiecte.

Modificarile din vederi pot duce la efecte laterale ce privesc partile din baza
de date ce nu apar in vederi. De exemplu stergerea unui element din vedere poate sa
duca la eliminarea unui alt element care are singura legatura cu elemntul sters si care
nu se afla in vedere.

Diferitele protectii pot fi indicate prin intermediul limbajului de prelucrare a


datelor. Portiunile din baza de date ce pot fi folosite de utilizator pot fi definite prin
operatii de selectie si proiectie care fac invizibile alte portiuni ale bazei de date.
Problema securitatii cuprinde aspecte legale, sociale si etice, aspecte privind
controlul fizic (paza si posibilitati de blocarea accesului la terminale), aspecte de
politie (fixarea conditiilor de acces), aspecte operationale (modul de stabilire a
parolelor), aspecte privind controlul hard (modul de acces hard la diferite
componente), securitatea sistemului de operare (protejarea informatiilor si anularea
rezultatelor intermediare pentru pastrarea secretului datelor) aspecte privind notiunea
de proprietate asupra datelor din baza de date si altele asemanatoare.

4.1. Securitatea in QBE

In sistemul QBE sunt prevazute patru tipuri de drepturi: insertie (I.), stergere
(D.), modificare (U.) si citire (P.). Conferirea drepturilor unei persoane sau unui grup
de persoane pentru o relatie R se face de catre proprietarul relatiei R care pune un
tuplu in scheletul relatiei R cu comanda

I.AUTR(<lista>). <nume> I.

unde lista cuprinde tipurile de drepturi alocate si numele reprezita un nume de


persoana sau o variabila. Daca sunt date toate cele patru drepturi nu mai este necesara
specificarea listei si daca lipseste numele se considera toti utilizatorii. In continuare
sunt indicate prin variabile sau constante campurile la care se aplica drepturile
respective. Constantele indica valori de selectie pentru tupluri si variabilele pot fi
restrictionale prin conditii sau tupluri suplimentare. Coloanele ce contin spatii libere
nu pot fi accesate.

Exemplul 5. . Pentru a da dreptul ca Ionescu sa vada comenzila facute fara a


vedea cantitatile cerute se poate construi cererea
_____________________________________________________________________
_________
COMENZI | NR_COM | NUME | MARFA | CANTITATE |
______________________|_____________|______________|_____________|
____________|
I.AUTR(P.).Ionescu I. | _n | _p | _m | |
| | | | |

si pentru acordarea tuturor drepturilor in aceleasi conditii se elimina (P.) din prima
coloana. Pentru a permite tuturor sa aiba drepturile indicate se elimina Ionescu din
prima coloana sau se inlocuieste cu o variabile (eventual adaugand "_" inaintea lui).
Daca se permite accesul numai la comenzile in care cantitatea este mai mare decat 5
se adauga in ultima coloana >5 si atunci toate coloanele sunt vizibile. Pentru a
permite tuturor sa citeasca toate comenzile ce contin marfuri vandute de magazinul
Unirea se face cererea
_____________________________________________________________________
_________
COMENZI | NR_COM | NUME | MARFA | CANTITATE |
______________________|_____________|______________|_____________|
____________|
I.AUTR(P.)._Ionescu I.| _n | _p | _m | _q |
| | | | |

_____________________________________________________________________
_________
MAGAZINE | NUMEMAG | ADRESAMAG | MARFA | PRET |
______________________|_____________|______________|_____________|
____________|
I.AUTR(P.).Ionescu I. | Unirea | | _m | |
| | | | |

Se pot indica prin intermediul variabilelor subgrupuri de utilizatori la care sa


se aplice anumite drepturi.

Exemplul 5. . Pentru a permite fiecarui cumparator sa poata sa-si citeasca


propriul cont se poate formula cererea
_____________________________________________________________________
_________
CUMPARATORI | NUME | ADRESA | CONT |
______________________|________________|_______________________|
______________|
I.AUTR(P.)._Ionescu I.| _Ionescu | | _c |
| | | |

Toate drepturile introduse prin comenzi AUTR. sunt continute intr-un tabel
din care se pot afla informatii despre drepturile fiecarui utilizator sau restrictiile de
acces la fiecare relatie prin cererile obisnuite din QBE. De asemenea, proprietarul
unei relatii poate sa modifice drepturile de acces la relatia respectiva.

4.2 Securitatea in SQL

Problema securitatii in SQL se rezolva prin mecanismul vederilor prin care


diferitii utilizatori au acces numai la anumite informatii, restul informatiilor
ramanand invizibile pentru ei si prin sistemul de autorizari care permite utilizatorilor
ce au anumite drepturi sa poata sa transmita sau sa anuleze aceste drepturi si pentru
alti utilizatori. Sistemul prevede structuri ce memoreaza constrangerile de autorizare
comunicate de utilizatori, face verificarile lor la efectuarea fiecarei cereri si are un
modul de verificare si identificare a utilizatorilor.

La definirea vederilor prin CREATE VIEW se poate limita accesul numai la


tablourile la care proprietar este utilizatorul respectiv folosind o conditie de selectie
cu cuvantul cheie USER ce da identificatorul utilizatorului de tipul

WHERE CREATOR = USER

Orice operatie din baza de date se face numai pe baza unei autorizari pentru
acea operatie. Initial sistemul acorda toate drepturile de operare pentru
administratorul sistemului (SYSADM) si nu acorda nici-un drept de operare la ceilalti
utilizatori. Apoi drepturile de operare sunt transmise prin intermediul instructiunii
GRANT sau sunt revocate prin instructiunea REVOKE.
Instructiunea GRANT este de forma

GRANT operatii [ ( atribute ) ] ON TABLE tabele TO utilizatori


[ WITH GRANT OPTION ] ;

unde operatii este o submultime a multimii {SELECT, UPDATE, DELETE,


INSERT, ALTER, INDEX} (ultimele doua se aplica numai la tabele de baza
permitand adaugarea unei noi coloane si respectiv construirea unui index pentru
tabelul respectiv) indicand operatiile autorizate (daca sunt permise toate se pune
ALL), atribute este o lista a atributelor la care se aplica operatiile respective, tabele da
lista tabelelor de baza si vederilor implicate in operatii, utilizatori da lista
identificatorilor celor ce au drepturile respective (cuvantul cheie PUBLIC se foloseste
pentru a indica toti utilizatorii sistemului), WITH GRANT OPTION permite
transmiterea in cascada a acodrdarii unor drepturi si a revocarii lor.

Instructiunea REVOKE este de forma

REVOKE operatii ON TABLE tabele FROM utilizatori ;

cu operatii, tabele si utilizatori ca mai sus doar ca de aceasta data se refera la


revocarea unor operatii.

Revocarea unor autorizari se poate face de catre persoana care a dat


autorizarea respectiva si presupune invalidarea tuturor aplicatiilor care utilizeaza
operatiile revocate.

4.3. Securitatea in QUEL

Constrangerile de securitate sunt exprimate in limbajul QUEL prin


intermediul instructiunii DEFINE PERMIT care are forma generala

DEFINE PERMIT operatii ON tabele [ ( atribute ) ] TO utilizatori


[ AT terminale ] [ FROM ora1 TO ora2 ] [ ON zi1 TO zi2 ]
[ WHERE conditie ]

Se poate folosi variabila USERNAME pentru a fixa contextul aplicarii regulei la


utilizatorul curent.

Constrangerile de securitate sunt numerotate si pastrate intr-un catalog al


sistemului INGRES. Numarul asociat unei constrangeri se poate afla cu instructiunile
HELP si RETRIEVE. Acest numar este utilizat la revocarea unei permisiuni printr-o
instructiune de forma:

DESTROY PERMIT tabel nr-constrangere

4.4. Baze de date statistice


Se numeste baza de date statistica o baza de date din care se pot obtine
informatii aplicand operatii agregate la submultimi de elemente continute in ea. Prin
formularea unor intrebari unii utilizatori pot sa obtina informatii la care in mod
obisnuit nu au acces. De exemplu daca un utilizator nu are acces la campul SALARIU
dar poate face suma salariilor unor submultimi de cel putin m persoane cu m dat,
pentru a afle salariul lui Popescu el poate calcula suma tuturor salariilor si suma
tuturor salariilor fara al lui Popescu si prin scaderea celor doua sume afla salariul lui
Popescu la care nu avea acces.

Pentru a preveni astfel de situatii, unele sisteme de baze de date tin o evidenta
a intrebarilor puse de fiecare utilizator in parte sa refuza sa raspunda in anumite
conditii cum ar fi: sunt implicate mai putine inregistrari decat un numar dat m sau
sunt implicate mai mult de n-m inregistrari unde n este numarul total de elemente sau
sunt implicate mai mult de p inregistrari comune cu o cerere anterioara si altele
asemanatoare.

Fie o baza de date cu n inregistrari ce au valorile v=(v1,v2,...,vn)


corespunzatoare unui camp care nu este cheie. Se numeste cerere liniara o suma de
forma c1v1+c2v2+...+cnvn unde ci este un numar real oarecare pentru orice i. Fie
r1,r2,...,rq un numar de q cereri liniare cu ri=ci1v1+...+cinvn. Spunem ca baza de date
este compromisa daca exista o functie f astfel incat una din valorile vi se obtine
aplicand f valorilor r1,...,rq, deci vi=f(r1,...,rq).

Lema 5. . Daca exista o functie f astfel incat vi=f(r1,...,rq) atunci exista o


functie liniara g cu aceeasi proprietate, deci exista d1,...,dq astfel incat
d1r1+d2r2+...dqrq = vi.

Daca notam cu M matricea cu q linii si n coloane a coeficientilor cererilor


liniare r1,...,rq si cu d=(d1,d2,...,dq), din lema precedenta rezulta ca baza de date este
compromisa daca si numai daca exista un vector d astfel incat dM = (0,...,0,1,0,...,0).
Pentru a nu compromite baza de date se fac constrangeri de forma:
- fiecare linie din M are cel putin m elemente nenule;
- oricare doua linii au cel mult k elemente nenule pe coloane comune

Exemplul 5. . Pentru valorile v1,...,v7 cu cererile r1=v2+v3+v4,


r2=v5+v6+v7, r3+v1+v2+v5, r4=v1+v3+v6 si r5=v1+v4+v7 baza de date este
compromisa deoarece v1=(r3+r4+r5-r1-r2)/3 desi s-ar putea lua m=3 si k=1. Deci
punerea conditiei m=4 sau k=0 poate eventual duce la o baza de date care nu e
compromisa.

Teorema 5. . Daca se folosesc cereri liniare in care se folosesc cel putin m


valori, doua cereri au in comun cel mult k valori si se cunosc deja p valori, atunci
pentru a calcula un nou element necunoscut sunt necesare cel putin (m-p-1)/k+1
cereri.

Se poate da un exemplu prin care se demonstreaza ca pentru orice m si orice k


sunt suficiente 2m/k-1 cereri pentru a compromite o baza de date.
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
pentru rezultatele intermediare obtinute dintr-o operatie anterioara fara a
mai fi necesara memorarea tuplurilor din operatia anterioara.

4. Determinarea subexpresiilor comune unei expresii. Acest principiu priveste


mai ales vederile pentru care relatiile utilizate nu sunt prea mari.

5. Prelucrarea corespunzatoare a fisierelor. Sortarea fisierelor dupa anumite


campuri sau folosirea unor indexi permanenti sau temporali pot spori
eficienta in determinarea raspunsului la cereri.

6. Evaluarea optiunilor inainte de a calcula. Se au in vedere dimensiunile


fisierelor cu care se lucreaza si in functie de acestea se determina cea mai
buna succesiune a operatiilor ce trebuiesc executate.

5.1. Prelucrarea algebrica a cererilor

Spunem ca doua expresii relationale E1 si E2 sunt echivalente si notam


E1 @=_ E2 daca cele doua expresii corespund aceleiasi aplicatii in sensul ca inlocuin
cu aceeasi relatie aparitiile diferite ale aceleiasi variabile din cele doua expresii se
obtine acelasi rezultat pentru ambele expresii.

Plecand de la definitia anterioara se pot demonstra o serie de proprietati ale


operatorilor utilizati in bazele de date relationale in care relatiile sunt definite ca
multimi de aplicatii pe multimi de atribute cu valori in domeniile asociate si anume:

1. Comutatitivitatea uniunii, uniunii naturale si produsului cartezian. Daca E1


si E2 sunt expresii relationale si F este o conditie pentru atribute din E1
si E2 atunci au loc echivalentele:
E1 |X| E2 @=_ E2 |X| E1
F F
E1 |X| E2 @=_ E2 |X| E1
E1 X E2 @=_ E2 X E1

2. Asociativitatea uniunii, uniunii naturale si produsului cartezian. Daca E1,


E2 si E3 sunt expresii relationale si F1 si F2 sunt conditii atunci au loc
echivalentele:
(E1 |X| E2) |X| E3 @=_ E1 |X| (E2 |X| E3)
F1 F2 F1 F2
(E1 |X| E2) |X| E3 @=_ E1 |X| (E2 |X| E3)
(E1 X E2) X E3 @=_ E1 X (E2 X E3)

3. Combinarea proiectiilor in cascada. Daca atributele A1,...,Am sunt o


submultime a atributelor B1,...,Bn care la randul lor sunt o submultime
a atributelor expresiei E, atunci are loc echivalenta:
@P/A1,...,Am(@P/B1,...,Bn(E)) @=_ @P/A1,...,Am(E)

4. Combinarea selectiilor in cascada. Daca F1 si F2 sunt conditii pentru


atribute din expresia E atunci au loc echivalentele:
@S/F1(@S/F2(E)) @=_ @S/F1@AF2(E) @=_ @S/F2@AF1(E) @=_
@S/F2(@S/F1(E))

5. Comutativitatea selectiei cu proiectia. Daca in conditia F se gasesc numai


atribute din multimea A1,...,An atunci are loc echivalenta:
@P/A1,...,An(@S/F(E)) @=_ @S/F(@P/A1,...,An(E))
iar daca F mai contine si atributele B1,...,Bm in afara de A1,...,An, atunci:
@P/A1,...,An(@S/F(E)) @=_
@P/A1,...,An(@S/F(@P/A1,...,An,B1,...,Bm(E)))

6. Comutatitivitatea selectiei cu produsul cartezian. Daca toate atributele ce


apar in conditia F apar in E1 atunci:
@S/F(E1 X E2) @=_ @S/F(E1) X E2
si o relatie asemanatoare daca toate atributele apar numai in E2. In general
daca F = F1 @A F2 cu F1 avand atribute numai din E1 si F2 avand atribute
numai din E2 atunci:
@S/F(E1 X E2) @=_ @S/F1(E1) X @s/F2(E2)
sau si mai general daca F = F1 @A F2 @A F3 cu F1 si F2 ca mai sus iar F3
contine atribute din ambele expresii atunci:
@S/F(E1 X E2) @=_ @S/F3(@S/F1(E1) X @S/F2(E2))
7. Comutativitatea selectiei cu reuniunea. Daca expresiile E1 si E2 au aceleasi
atribute atunci:
@S/F(E1 U E2) @=_ @S/F(E1) U @S/F(E2)

8. Comutatitivitatea selectiei cu diferenta de multimi. Daca expresiile E1 si E2


au aceleasi atribute atunci:
@S/F(E1 - E2) @=_ @S/F(E1) - @S/F(E2)

9. Comutatitivitatea proiectiei cu produsul cartezian. Fie E1 si E2 doua


expresii relationale si A1,...,An atribute din care B1,...,Bm sunt atribute
din E1 si C1,...,Cp sunt atribute din E2 (m+p=n), atunci:
@P/A1,...,An(E1 X E2) @=_ @P/B1,...,Bm(E1) X @P/C1,...,Cp(E2)

10. Comutativitatea proiectiei cu reuniunea. Daca E1 si E2 au atribute comune si


A1,...,An este o submultime a lor, atunci
@P/A1,...,An(E1 U E2) @=_ @P/A1,...,An(E1) U @P/A1,...,An(E2).

In afara de echivalentele anterioare se mai pot deduce si alte echivalente cum


ar fi comutatitivitatea selectiei si uniunii care rezulta din regulile 4, 5 si 6 interpretand
uniunea ca o compunere de produs cartezian si proiectie. De asemenea sunt valabile
legi de comutatitivitate intre proiectie si produs cartezian sau reuniune asemanatoare
cu 6 si 7 dar nu este o regula generala de comutatitivitate intre proiectie si diferenta
de multimi.

Se poate construi un program eficient de tratare a unei cereri care sa contina


activitati de una din urmatoarele forme:
- aplicarea unei selectii sau a unei proiectii;
- aplicare selectie+proiectie
- aplicarea unui produs cartezian, reuniune sau diferenta pentru doi
operanzi obtinuti eventual prin proiectie sau selectie, rezultatul
putand si el sa fie selectat sau proiectat.

Fiecare din operatiile anterioare produce un rezultat care se memoreaza si care


poate fi rezultatul final sau operand pentru alta aplicare. Programul de evaluare a
cererii se obtine aplicand algoritmul urmator:

Algoritmul 5. . Sa presupunem ca se da arborele asociat evaluarii cererii


scrisa in algebra relationala.
1. Se foloseste regula 4 pentru a transforma fiecare selectie de forma
@S/F1@A...@AFn(E) in expresia @S/F1(...(@S/Fn(E))...).
2. Se folosesc regulile 4-8 pentru a muta selectiile cat mai jos posibil
in arbore.
3. Se folosesc regulile 3, 5, 9 si 10 pentru a muta proiectiile cat mai
jos posibil in arbore. Se elimina o proiectie daca se face dupa toate
atributele expresiei la care se aplica.
4. Se folosesc regulile 3-5 pentru a combina selectii si proiectii in
cascada obtinand o singura selectie, o singura proiectie sau o
selectie urmata de o proiectie.
5. Se partitioneaza nodurile interioare ale arborelui obtinut in grupe
care contin un operator binar X, U sau - impreuna cu predecesorii
imediati etichetati cu un operator unar (@P sau @S) si descendentii
de pe drumuri cu operatori unari ce se termina cu o frunza in afara
de cazul cand operatorul binar este un produs cartezian si nu este
urmat de o selectie pentru a produce o uniune naturala.
6. Se construieste programul care asociaza la fiecare grup o aplicatie
ordinea aplicatiilor trebuie sa respecte precedenta: un grup se
evalueaza numai dupa ce au fost evaluat toti descendentii sai
directi.

Exemplul 5. . Sa consideram o baza de date pentru o biblioteca avand


urmatoarele relatii componente:

CARTI (TITLU, AUTOR, EDITOR, NR_INV)


EDITORI (NUMEE, ADRESAE, ORASE)
CITITORI (NUME, ADRESA, ORAS, NR_LEG)
FISE(NR_LEG, NR_INV, DATA)

unde, pentre a deosebii numele, adresa si orasul cititorului de cele ale editorului am
adaugat la acesta din urma litera E la atributele respective. Intr-o vedere care contine
informatii despre cartile imprumutate se pot face cereri diverse. Sa numim relatia
corespunzatoare acestei vederi IMPRUMUT ea fiind obtinuta prin uniunea naturala a
relatiilor CARTI, CITITORI si FISE cu

@P/S(@S/F(FISE X CITITORI X CARTI))

unde
S=TITLU,AUTOR,EDITOR,NR_INV,NUME,ADRESA,ORAS,NR_LEG,DATA si
F este

CITITORI.NR_LEG = FISE.NR_LEG AND CARTI.NR_INV =


FISE.NR_INV

Listarea titlurilor cartilor care au fost imprumutate inainte de data de 1 august


1994 se poate face de exemplu cu cererea

@P/TITLU (@S/DATA < 1/8/94 (IMPRUMUT))

si inlocuind expresia relatiei IMPRUMUT se obtine arborele din fig. 5.3.

@P/TITLU
|
|
@S/DATA < 1/8/94
|
|

@P/TITLU,AUTOR,CARTI.NR_INV,NUME,ADRESA,ORAS,
| CITITORI.NR_LEG,DATA
|
@S/CITITORI.NR_LEG=FISE.NR_LEG A
| CARTI.NR_INV=FISE.NR_INV
|
X
/\
/ \
X CARTI
/\
/ \
FISE CITITORI

Figura 5.3.

Conform algoritmului primele transformari pe care le facem privesc selectiile.


Cea de-a doua selectie se desparte in doua selectii avand cele doua conditii legate prin
"si" in selectia originala. Sunt apoi coborate selectiile cat mai jos posibil in arbore.
Selectia cu conditia DATA < 1/8/94 ce contine numai atributul DATA poate fi
coborata pana la FISE ce contine acest atribut si selectia cu conditia
CITITORI.NR_LEG=FISE.NR_LEG poste fi coborata pana inainte de produsul
cartezian dintre @S/DATA < 1/8/94(FISE) si CITITORI avand atribute din aceste
reletii. Se combina apoi cele doua proiectii consecutive obtinand @P/TITLU si
aceasta proiectie impreuna cu selectia cu conditia CARTI.NR_INV = FISE.NR_INV
se inlocuieste cu cascada

@P/TITLU
@S/CARTI.NR_INV = FISE.NR_INV
@P/TITLU,CARTI.NR_INV,FISE.NR_INV

si coborand cea de-a doua proiectie in arbore se obtine rezultatul final din fig. 5.4,

@P/TITLU
|
|
@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

Pentru o cerere din QUEL de forma

range of t1 is R1
.
.
.
range of tk is Rk
retrieve(@a)
where F

unde @a este o lista de atribute ce apar in relatiile R1,...,Rk si F este o conditie asupra
atributelor, se poate gasi o expresie echivalenta in calculul relational de forma

@P/@a(@S/F(R1 X R2 X ... X Rk))

Se pot utiliza proprietatile de comutativitate pentru a cobori proiectiile si


selectiile dar si comutatitivitatea si asociativitatea produsului cartezian pentru a
micsora numarul de elemente cautate.
Exemplul 5. . Sa presupunem ca vrem sa facem uniunea naturala a trei relatii
AB, BC si CD fiecare avand cate n elemente, ca la calculul uniunii naturale rezultatul
are de p ori mai multe elemente decat cea mai mare relatie implicata, ca timpul de
calcul al uniunii naturale este de d ori dimensiunea rezultatului si ca pentru a calcula
un index dupa un atribut al unei relatii este necesar un timp de c ori mai mare decat
dimensiunea relatiei respective.
Pentru a calcula AB |X| BC este necesar timpul cn pentru a crea un index pentru B in
una din relatii si inca dpn pentru a calcula uniunea naturala. Apoi, pentru a ajunge la
rezultatul final mai este necesar cn pentru a calcula un index dupa C pentru CD, cea
mai mica dintre relatii, si inca dp\2n pentru a calcula uniunea naturala. Deci timpul
total de calcul este 2cn + d(p\2 + p)n. Exista o metoda care da in general mai bune
rezultate. Mai intai se creaza cate un index dupa B in AB si dupa C in CD in timpul
2cn. Apoi prin parcurgerea relatiei BC, pentru fiecare tuplu (b1,c1) se determina prin
intermediul indexilor perechile (a1,b1) din AB si (c1,d1) din CD formandu-se tuplul
din rezultatul final (a1,b1,c1,d1). Deci timpul total de calcul este 2cn + ep\2n unde e
este o constanta apropiata de d, deci se obtine un rezultat mai bun. In plus, in aceasta
metoda nu se mai consuma spatiu pentru rezultatele intermediare ci numai pentru
indexi care in general sunt de dimensiuni mai mici.

Sa presupunem ca trebuie sa se faca selectia cu conditia F1@A...@AFn din


produsul cartezian al relatiilor R1,...,Rk. Presupunem ca fiecare Fi nu mai contine
operatorul "si". Se construieste un hipergraf avand drept noduri relatiile R1,...,Rk si
constantele ce apar in conditiile F1,...,Fn (doua aparitii ale aceleiasi valori se
considera constante distincte) si ca hipermuchii multimile de noduri ce apar in fiecare
din conditiile Fi sub forma de atribute ale relatiei respective sau constanta. Graful
obtinut se numeste graful legaturilor.

Exemplul 5. . Sa consideram pentru baza de date din exemplul 5. cererea de


listare a tuturor cititorilor care au imprumutat carti editate in acelasi oras cu cel in
care locuiesc aceasta putandu-se exprima in QUEL prin:

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
create. Se repeta operatia pentru toate muchiile in care apare n. Dupa ce se
evalueaza acest graf producand relatia s se face produsul cartezian s X {t}
si se ia reuniunea tuturor acestor produse carteziene dupa toate tuplurile t
ale lui r obtinand rezultatul final.

Algoritmul 5. . Se poate obtine evaluarea unei cereri prin descompunere


plecand de la graful legaturilor G asociat cererii si obtinand in final REL(G).
Se fac instantieri si disectii tinand seama de urmatoarele preferinte:
1. De cate ori este posibila o instantiere se face acea instantiere.
2. Daca nu mai sunt posibile instantieri se alege un nod n pentru disectie. Se
prefera noduri ce apar numai in muchii simple si dintre acestea cele care au
fost evaluate cu instantiere sau disectie anterioara, altfel se da prioritate
la nodurile care fac graful neconex.
3. Pentru fiecare tuplu t al nodului n se obtine prin disectie graful Gt si
aplicand recursiv algoritmul acesta pentru Gt se obtine relatia REL(Gt) si
se da ca rezultat U/t(REL(Gt)X{t}).
4. Cand nu mai sunt muchii se intoarece drept rezultat produsul cartezian al
relatiilor reprezentand fiecare din nodurile ramase.
Exemplul 5. . Aplicand algoritmul 5. pentru graful legaturilor din fig. 5.5 se
observa ca nu se poate face instantiere iar disecarea se poate face dupa oricare din
cele patru noduri. Daca alegem nodul CARTI pentru fiecare tuplu t din relatia CARTI
se obtine un graf de legaturi ca in fig.5.6.

=============== ===============
|| t[NR_INV] || || t[EDITOR] ||
=============== ===============
| |
NR_INV=t[NR_INV]| | NUMEE=t[EDITOR]
| |
__________ _____________
| FISE | | EDITORI |
|________| |___________|
\ /
FISE.NR_LEG \ / CITITORI.ORAS
=CITITORI.NR_LEG \ / =EDITORI.ORASE
\ /
______________
| CITITORI |
|____________|

Figura 5.6.

Se aplica pentru noul graf obtinut din nou algoritmul obtinandu-se prin
instantiere doua relatii si anume

F1 = @S/NR_INV=t[NR_INV](FISE)
E1 = @S/NUMEE=t[EDITOR](EDITORI)

obtinand un graf cu trei noduri F1, CITITORI si E1 legate prin cele doua muchii din
partea de jos a figurii 5.6. Alegand apoi pentru disectie nodul F1, pentru fiecare tuplu
u din F1 se construieste un graf Gtu asociat avand ca noduri u[NR_LEG], CITITORI
si E1 legate intre ele prin conditiile NR_LEG=u[NR_LEG] si respectiv
ORAS=ORASE. Prin instantiere se inlocuieste nodul CITITORI cu relatia

C1 = @S/NR_LEG=u[NR_LEG](CITITORI)

obtinandu-se un graf cu doua noduri C1 si E1 legate prin muchia ORAS=ORASE. O


ultima disectie alegand nodul C1 cu tupluri v da un graf Gtuv cu nodurile v[ORAS] si
E1 legate prin muchia de conditie ORASE=v[ORAS] si prin instantiere un graf cu un
singur nod E2 dat de expresia

E2 = @S/ORASE=v[ORES](E1)

apoi prin pasul 4 se fac succesiv evaluarile REL(Gtuv)=E2, REL(Gtu)=U/v@cC1


(REL(Gtuv X {v}), REL(Gt)=U/u@cF1 (REL(Gtu) X {u}) si in final

REL(G) = U (REL(Gt) X {t})


t in CARTI
5.4. Micsorarea numarului de uniuni

Evaluarile uniunilor relatiilor sunt mari consumatoare de timp si de aceea o


buna euristica in problema optimizarii cererilor este determinarea unei cereri
echivalente cu cererea data care sa aiba un numar cat mai mic de uniouni. O clasa de
cereri pentru care exista metode de a determina o cerere echivalenta cu numar minim
de uniuni este clasa cererilor conjunctive de forma

{a1...an | (@Eb1)...(@Ebm)(P1@A...@APk)}

unde fiecare Pi este fie de forma R(c1...cr) cu cj constante sau a-uri sau b-uri fie de
forma c@0d cu c si d constante sau a-uri sau b-uri si @0 unul din operatorii de
comparatie <, >, @<=, @>=.

Fiecarei cereri conjunctive i se poate asocia un tablou care este o matrice


bidimensionala eventual urmata de o lista de restrictii. Prima linie a tabloului contine
numele tuturor atributelor relatiilor ce intervin in cerere (daca se cunoaste
corespondenta intre atribute si pozitia lor in tablou se poate omite numirea
atributelor). Al doilea rand numit sumar contine asa numitele variabile (simboluri)
distinse care corespund a-urilor din cerere si spatiu liber pentru atributele care nu apar
printre a-uri. Celelalte randuri ale tabloului corespund termenilor de forma R(c1,...,cr)
care semnifica apartenenta tuplului (c1,...,cr) la relatia R, punand ci in dreptul celui
de-al i-lea atribut al lui R si lasand spatiu liber pentru atributele care nu sunt in R.
Randurile pot fi insotite de numele relatiilor corespunzatoare lor. Sub tabel sunt
trecute predicatele cererii conjunctive de forma c@0d pe care le numim constrangeri.
Variabilele ce apar cu operatorii existentiali (b-uri) le numim variabile (simboluri)
nedistinse.

Tabloul poate fi interpretat ca o aplicatie de la valorile variabilelor relatii cu


rezultat o relatie care are ca atribute pe cele corespunzatoare variabilelor din sumar si
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
relatii continute in expresie).
2. Pentru fiecare din subexpresiile expresiei date pentru care au fost
determinate tablouri corespunzatoare operanzilor se aplica urmatoarele
transformari pana cand obtinem un tablou corespunzator la toata expresia:
- Pentru o subexpresie @P/A1,...,An(E) pentru care s-a construit tabloul T
corespunzator lui E se sterg din sumarul lui T toate variabilele care nu
se afla in corespondenta cu atributele A1,...,An, devenind astfel variabile
nedistinse si putand sa apara in celelalte randuri sau in constrangeri.
- Pentru o subexpresie @S/F(E) unde conditia F nu mai contine operatorul "si"
se modifica tabloul T corespunzator lui E prin adaugarea conditiei F'
obtinuta din F prin inlocuirea fiecarui atribut A cu variabila distinsa
corespunzatoare lui A din sumarul lui T. In particular, daca F este de
forma A = B se identifica in tablou cele doua variabile distinse ce
corespund atributelor A si B iar daca F este de forma A = c unde c este o
constanta, se inlocuieste variabila distincta pentru A cu valoarea c.
- Pentru o subexpresie E1 |X| E2 pentru care se cunosc tablourile T1 si T2
corespunzatoare pentru E1 si E2, se redenumesc eventual unele variabile
astfel incat variabilele distinse pentru atributele comune sa se numeasca
la fel si toate celelalte variabile sa fie denumite distinct in cele doua
tablouri. Se formeaza un nou tabel cu sumarul format prin reuniunea
sumarelor lui T1 si T2 si spatiu liber in rest iar ca randuri si
constrangeri se iau toate randurile si constrangerile celor doua tablouri.

Exemplul 5. . Pentru a construi tabloul corespunzator expresiei cu atributele


A, B si C in ordinea date

@P/A@S/C=0(AB |X| BC)

construim mai intai tablourile pentru expresiile AB si BC care sunt:

a1 a2 a3 a4
____________________________ ____________________________
a1 a2 (AB) 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 constran-
gerile 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 b
___________________________ ___________________________
a c d (R) a e f (R)
a e f (R) h e b (R)
g c b (R)
h e b (R)

Lund aplicatia de simboluri identica de la T2 la T1 se vede imediat ca T1@C= T2.


Reciproc, asiciind lui c pe e, lui d pe f si lui g pe h, restul simbolurilor ramanand
meschimbate se aplica primele doua randuri ale lui T1 in primul rand din T2 si
ultimile doua randuri ale lui T1 in al doilea rand din T2, ceea ce dovedeste ca si T2
@C= T1 si deci cele doua tablouri sunt echivalente.

Teorema 5. . Daca T este un tablou, atunci exista on tablou minimal


echivalent cu T ce se obtine din T prin eliminarea eventuala a unor randuri.

Demonstratie. Sa presupunem ca T1 este un tablou echivalent cu T avand un


numar minim de randuri. Din echivalenta rezulta existenta aplicatiilor de simboluri f
de la T la T1 si g de la T1 la T care indeplinesc condiitiile din teorema 5. deci pot fi
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

7. Construirea unei baze de date de tip arborescent

8. Concurenta in bazele de date

Cele mai multe baze de date sunt folosite in acelasi timp de mai multi
utilizatori. Daca asupra lor s-ar efectua numai operatii de citire nu ar apare probleme
in utilizare. Probleme deosebite apar in momentul cand unele operatii privesc
modificarea unor elemente din baza de date cand, datorita operarii in acelasi timp pot
sa apara inconsistente sau anomalii.

8.1. Accesul concurent la date

Operatiile concurente sunt referite prin notiunea de tranzactie care reprezinta o


unitate logica de lucru definita ca o singura executie a unui program. Programul poate
sa contina o singura cerere exprimata intr-un limbaj de cereri sau o serie de
instructiuni in limbajul gazda impreuna cu cereri. Se considera baza de date ca fiind
alcatuita din elemente ce pot fi locate la un moment dat. Locarea unui element
permite accesul la acel element a unei tranzactii si interzice accesul celorlalte
tranzactii la elementul respectiv pana la terminarea tranzactiei curente cand are loc o
delocare. O parte a SGBD numita administrator de locare se ocupa cu evidenta
elementelor locate si atribuie elementele diferitelor tranzactii.

Nivelul de locare este diferit de la sistem la sistem. Se pot loca relatii, tupluri,
parti de tupluri, grupe de n tupluri cu n dat, seturi in modelul retea, subarbori in
modelul ierarhic si asa mai departe. Locarea la nivel inalt are avantejele de spatiu mai
putin ocupat si timp de lucru suplimentar mai mic iar locarea la nivel jos are avantajul
utilizarii simultane a bazei de date de mai multi utilizatori in acelasi timp. Un criteriu
de a alege elementele locabile este acela al frecventei mai mari de aparitie in cereri.

Un exemplu clasic de incosistenta introdusa prin accesul concurent numita


problema pierderii reactualizarii este cel cu doua tranzactii T1 si T2 care executa in
paralel programul

P: READ A; A:=A+1; WRITE A;


in care rezultatul final poate fi valoarea lui A marita cu o unitate si nu cu doua unitati
cum ar fi normal. Anomalii asemanatoare pot sa apara prin anularea unor modificari
efectuate de tranzactii care nu se termina normal (problema dependentelor necomise)
sau cele produse prin considerarea unor stari de tranzitie ale bazei de date (problema
analizei inconsistente). Anomaliile se pot evita daca fiecare tranzactie nu permite
accesul la variabila A decat dupa ce se termina toate operatiile ei asupra acestei
variabile. Un program care permite aceasta este

P: LOCK A; READ A; A:=A+1; WRITE A; UNLOCK A;

Daca A a fost locat de o tranzactie nu poate fi accesat de alta tranzactie decat dupa ce
tranzactia ce la locat se termina si are loc delocarea lui A.

Prin succesiuni de forma locare-executie-delocare se pot asigura sincronizarea


diferitelor operatii din tranzactiile ce privesc o baza de date.

Pot sa apara unele fenomene ce trebuiesc tratate de sistemul de baze de date


cum sunt asteptarea la nesfarsit (livelock) sau interblocarea (deadlock). Asteptarea la
nesfarsit poate sa apara cand o tranzactie asteapta utilizarea unui element care este
ocupat de noi tranzactii ce apar in sistem. Ea poate fi evitata printr-o strategie de tip
coada pentru fiecare element in parte. Au prioritate de folosire a unui element
tranzactiile cu cea mai veche cerere pentru acel element. Interblocarea apare cand
unele tranzactii detin unele elemente cerute de alte tranzactii si la randul lor cer
elemente detinute de alte tranzactii ajungandu-se la o asteptare in cerc inchis si nici-o
tranzactie nu mai poate continua.

Rezolvarea interblocarilor se poate face prin mai multe metode cum ar fi


impunerea satisfacerii tuturor cererilor de elemente pentru o tranzactie inainte de a se
executa, inpunerea unei ordini asupra elementelor si prezentarea cererilor de elemente
in tranzactii in aceasta ordine, determinarea si tratarea interblocarilor prin
intreruperea si reluarea unor tranzactii si altele.

O alta problema este legata de rezultatul obtinut prin efectuarea anumitor


tranzactii. Se numeste programare a unei multimi de tranzactii ordinea in care sunt
executati pasii elementari ai tranzactiilor, pentru fiecare tranzactie in parte ordinea
pasilor ei din programare coincide cu ordinea de executie din tranzactia respectiva. O
programare este seriala daca pentru fiecare tranzactie pasii sai apar consecutiv in
programare. O programare se numeste serializabila daca efectul ei este echivalent cu
al unei programari seriale.

Exemplul 5. . Considerand tranzactiile urmatoare T1 si T2:

T1: READ A; A:=A-10; WRITE A; READ B; B:=B+10; WRITE B;


T2: READ B; B:=B-20; WRITE B; READ C; C:=C+20; WRITE B;

in orice programare seriala A+B+C este constant. Dintre programarile

T1 | T2 T1 | T2 T1 | T2
__________|__________ __________|___________ ___________|
___________
READ A | READ A | READ A |
A:=A-10 | | READ B A:=A-10 |
WRITE A | A:=A-10 | | READ B
READ B | | B:=B-20 WRITE A |
B:=B+10 | WRITE A | | B:=B-20
WRITE B | | WRITE B READ B |
| READ B READ B | | WRITE B
| B:=B-20 | READ C B:=B+10 |
| WRITE B B:=B+10 | | READ C
| READ C | C:=C+20 WRITE B |
| C:=C+20 WRITE B | | C:=C+20
| WRITE C | WRITE C | WRITE C

prima este o programare seriala, a doua este o programare serializabila iar a treia nu
este o programare serializabila.

Evitarea interblocarii si posibilitatea serializarii unor programari sunt


asigurate prin impunerea unor conditii asupra ordinei de efectuare a operatiilor
fiecarei tranzactii in parte numite protocoale.

In studiul programarilor din fiecare tranzactie se retin numai operatiile de


locare si delocare de resurse. In intervalul de timp al efectuarii unui pas LOCK A
intr-o tranzasctie si urmatoarea UNLOCK A se spune ca respectiva tranzactie detine
pe A. Pentru fiecare pereche formata cu LOCK A si UNLOCK A corespunzator se
asdociaza cate o functie f(A) care arata cum se transforma valoarea lui A in acest caz.
Daca A0 este valoarea initiala a lui A atunci o programare in care locarile si
delocarile lui A au asociate functiile f1,...,fn da in final pentru a valoarea fn...f1(A0).

Algoritmul 5. . Pentru a testa daca programarea S a unei multimi de tranzactii


T1,...,Tk este sau nu serializabila se procedeaza astfel:
Se creaza graful directionat G, numit graf de precedenta, cu noduri
corespunzatoare tranzactiilor si pentru fiecare pas din S de forma Ti:UNLOCK A
urmat de alt pas de forma Tj:LOCK A se construieste in G un arc de la Ti la Tj. Daca
G 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.
5. Pentru fiecare arc ramas Ti-->Tj, fiecare A scris de Ti si citit de Tj si
fiecare tranzactie T care scrie A nu se fac modificari daca Ti=T0 si Tj=Tf,
altfel se adauga arcul Tj-->T daca Ti=T0, se adauga arcul T-->Ti daca Tj=T0
si se adauga perechea de arce (T-->Ti, Tj-->T) altfel.
6. Se determina daca poligraful rezultat este aciclic si in acest caz
programarea S este serializabila, o programare seriala echivalenta cu S
corespunde ordonarii topologice a grafului aciclic rezultat din poligraf si
daca poligraful nu este aciclic atunci S nu este serializabila.

Ca si pentru modelele anterioare protocolul in doua faze este o conditie


suficienta pentru ca orice programare corecta a tranzactiilor respective sa fie
serializabila. Demonstratia se face asemanator.

In cazul structurilor arborescente se pot aplica doua tipuri de strategii: locarea


individuala a fiecarui nod in parte sau locarea unui nod impreuna cu toti descendentii
sai.
Pentru prima strategie a locarii individuale a fiecarui nod se poate aplica
urmatorul protocol numit protocolul de arbore: nu se face locarea de doua ori a
aceluiasi termen in aceiasi tranzactie si in afara de primul element locat in tranzactie
(care poate sa nu fie radacina) orice alt element poate fi locat numai daca tranzactia
detine o locare a tatalui acelui element.

Se poate arata ca protocolul de arbore este o conditie suficienta ca


programarea unor tranzactii de acest tip sa fie serializabila. Serializabilitatea unei
programari se poate testa prin determinarea daca un graf asociat este aciclic sau nu.
Graful are noduri corespunzatoare tranzactiilor si pentru fiecare element A locat de
tranzactiile Ti si Tj se considera arcul Ti-->Tj daca Ti locheaza pe A inainte de Tj.

Pentru a doua strategie a locarii unui element impreuna cu toti descendentii lui
se foloseste atentionarea predecesorilor unui element care se locheaza. Deci operatiile
permise legate de locare sunt: LOCK care locheaza un element impreuna cu toti
descendentii sai (un element nu poate fi locat de doua tranzactii in acelasi timp),
WARN care plaseaza o atentionare intr-un element (nici-o tranzactie nu poate loca un
element in care o alta tranzactie a plasat o atentionare) si UNLOCK care anuleaza o
locare sau o atentionare sau ambele pentru un element.

Spunem ca o tranzactie indeplineste protocolul de atentionare pe o ierarhie de


elemente daca incepe prin a plasa o locare sau o atentionare in radacina, nu plaseaza
in continuare o locare sau o atentionare pe un element decat daca are o atentionare pe
tatal acelui element, anuleaza o locare sau o atentionare numai dupa ce a anulat
locarile si atentionarile pe fii elementului respectiv si se supune la protocolul in doua
faze in sensul ca toate delocarile urmeaza dupa toate locarile si atentionarile
tranzactiei.

Programarile tranzactiilor care indeplinesc protocolul de atentionare sunt


serializabile. Pentru determinarea unei programari seriale echivalenta cu ea se
procedeaza astfel: se elimina atentionarile si anularile corespunzatoare lor, se
inlocuiesc toate locarile si delocarile elementelor cu locari si delocari atat pentru
elementele respective cat si pentru toti descendentii lor, se construieste graful asociat
programarii obtinute si ordonarea topologica a grafului (care este aciclic) da o
programare seriala a tranzactiilor.

8.2. Detectarea erorilor si restabilirea informatiei

Pentru pastrarea consistentei bazei de date orice tranzactie trebuie fie sa se


execute in totalitate fie sa nu se execute deloc. Acest lucru este asigurat de o parte
componenta a SGBD numita administratorul de tranzactii. Procesul de asigurare al
consistentei bazei de date la tratarea tranzactiilor utilizeaza comenzi de tipul
COMMIT ce permite efectuarea efectiva a schimbarilor si respectiv ROLLBACK
pentru anularea unor modificari facute de o tranzactie incomplet executata.

De obicei comanda COMMIT este ultima comanda executata intr-o trnzactie


prin ea indicandu-se ca toate operatiile tranzactiei au fost executate cu succes si deci
modificarile facute sunt considerate corecte. Comanda ROLLBACK semnaleaza
aparitia unei situatii limita ce poate sa duca la inconsistenta bazei de date si sistemul
trebuie sa restabileasca informatiile ca la inceperea efectuarii tranzactiei sau sa nu
permita efectuarea efectiva a modificarilor facute de tranzactia respectiva. Cele mai
multe sisteme adauga automat comanda COMMIT la terminarea trnzactiei in cazul
cand nu sunt determinate erori si comanda ROLLBACK in caz contrar. In cazul
aparitiei unor intreruperi in lucrul sistemului, la reluarea lucrului pentru toate
tranzactiile active din sistem in momentul intreruperii se efectueaza o comanda
ROLLBACK. Aceste tranzactii trebuiesc planificate din nou pentru executie.

Erorile ce pot declansa procesul de restabilire pot fi clasificate in erori locale


care sunt produse de tranzactie si care afecteaza numai tranzactia respectiva si erori
globale care pot afecta mai multe tranzactii active la un moment dat. Erorile globale
pot sa fie erori de sistem (oprirea curentului electric, efectuarea eronata a unor
comenzi, erori din sistemul de operare si altele) sau erori de mediu (functionarea
incorecta a unei unitati de discuri sau a unei portiuni din memoria interna si altele)

Pentru a putea restabili informatiile, sistemul contine o structura numita log


sau jurnal in care sunt continute informatii privind toate modificarile efectuate de
tranzactii. Se pastreaza pe un mediu extern o lista a tranzactiilor active la un moment
dat care se reactualizeaza dupa anumite intervale de timp (checkpoint). La aparitia
unei erori globale de sistem se aplica urmatorul procedeu de restabilire a bazei de
date:

1. Se incepe cu o lista UNDO ce contine tranzactiile active la ultima salvare


si cu lista REDO vida.
2. Se parcurge jurnalul din momentul ultimei salvari a tranzactiilor active.
3. Daca in jurnal se gaseste inceperea tranzactiei T, se adauga T listei UNDO.
4. Daca in jurnal se gaseste "commit" pentru tranzactia T, se muta tranzactia T
din lista UNDO in lista REDO.
5. Se parcurge jurnalul inapoi pana la "checkpoint" si se elimina modificarile
din baza de date efecuate de tranzactii din lista UNDO.
6. Se parcurge jurnalul de la "checkpoint" pana la sfarsit si se fac in baza de
date modificarile facute de tranzactiile din lista REDO.
7. Se pregateste sistemul pentru acceptarea unor noi tranzactii (eventual se
poate reincepe efectuarea tranzactiilor din lista UNDO).

Restabilirea in cazul erorilor de mediu se face prin intermediul copiilor


periodice ale bazei de date si cu ajutorul jurnalului. Se pleaca de la ultima copie a
bazei de date considerata corecta si se fac modificarile continute in jurnal pentru
tranzactiile ce s-au terminat corect (cele din lista REDO date de procedura
precedenta. Copiile bazelor de date se pastreaza de obicei pe benzi magnetice sau
diskete.

In cazul cand tranzactiile afecteaza mai multe medii in modificari acestea sunt
coordonate si aplicate sau nu pentru toate mediile. Se aplica in acest caz un protocol
de commit in doua faze (1) cerere de modificare catre toate mediile implicate si (2)
efectuarea modificarilor la raspunsuri pozitive sau restabiliri daca exista cel putin un
raspuns negativ. Acest sistem permite restabilirile in cazul erorilor.
9. Baze de date distribuite

O baza de date distribuita permite ca o colectie arbitrara de relatii, dintr-o


colectie arbitrara de baze de date aflate pe o mare varietate de masini diferite ce
lucreaza sub diferite sisteme de operare si fiind legate prin diferite retele de
comunicatie sa poata fi utilizate ca si cum ar constitui o singura baza dedate pe o
singura masina.

Primele sisteme de baze de date distribuite au fost INGRES/STAR, versiune


distribuita a lui INGRES, SQL*STAR versiune distribuita a lui ORACLE si R*
versiune distribuita a lui DB2.

Principalele cerinte pe care trebuie sa le asigure un sistem de baze de date


distribuite sunt: autonomia locala in organizarea si prelucrarea datelor, neutilizarea
unei centralizari a evidentei si a datelor, posibilitatea de lucru continuu al nodurilor
independent de schimbarile in configuratiile de lucru (adaugari sau eleminari de
noduri), independenta localizarii si fragmentarii datelor (transparenta fizica),
posibilitati de replicare (copiere) si independenta copiilor, prelucrarea distribuita a
cererilor, administrarea distribuita a tranzactiilor, independenta de hardware, de
sistemul de operare, de retea si de sistemul de gestiune a bazelor de date.

Una din cele mai dificile probleme de rezolvat pentru sistemele distribuite este
minimizarea numarului si dimensiunii mesajelor. Aceasta problema se reflecta in
strategiile de prelucrare a cererilor, in administrarea cataloagelor, in propagarea
reactualizarilor, in controlul reacoperirilor, in controlul concurentei si in celelalte
operatii.

9.1. Reprezentarea bazelor de date distribuite

Pentru bazele de date de dimensiuni foarte mari, cu un numar mare de


utilizatori plasati in locuri diferite se pune problema reprezentarii lor pe fragmente in
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.

Cererile adresate unei baze de date distribuite sunt exprimate in raport de


reltiile logice ce se pot reconstitui din fragmente prin operatii de reuniune si uniune
naturala. Plecand de la acestea se construiesc expresii care au ca operanzi relatiile
fizice. Pentru arborele rezultat se aplica transformari ce fac determinarea rezultatului
final mai rapid cum ar fi coborarea cat mai mult posibil a selectiilor in arbore.

De obicei fragmentele contin anumite valori specifice in anumite campuri si


aceste valori pot servi pentru identificarea informatiilor din fragment purtand numele
de garda. In general, daca fragmentul R are garda g se poate inlocui orice folosire a
lui R intr-o expresie cu @S/g(R) fara a schimba rezultatul. Daca prin coborarea unei
selectii in arbore se ajunge la un conflict cu garda g atunci se poate elimina R din
expresie.

Exemplul 5. . Sa presupunem pentru banca de date din exemplul precedent ca


relatiile POSESORI si OPERAT sunt fragmentate in functie de locul unde s-a facut
identificarea si respectiv operatia si ca sunt in retea trei filiale referite prin 1, 2 si 3.
Pentru a raspunde la o cerere de tipul "lista persoanelor care au in contul deschis la
filiala 1 peste 100000 lei" ar trebui sa se faca o uniune naturala intre relatiile
CONTURI si POSESORI, sa se selecteze din rezultat tuplurile care au F=1 si
T>100000 si apoi sa se ia proiectia dupa P. Acest mod de operare produce un mare
flux de informatii intre cele trei noduri si ocupa mult spatiu suplimentar si timp de
calcul. Cum cereri de tipul specificat sunt destul de frecvente se impune o
reproiectare a bazei de date. Se considera mai intai vederea R(F,N,T,P) care se
fragmenteaza orizontal dupa valorile din F in relatiile R1, R2 si R3 cu F devenita
garda pentru fiecare din cele trei relatii. Apoi fiecare Ri, i=1,2,3 se fragmenteaza
vertical in relatiile Ci(F,N,T) si Pi(N,P) deci au loc egalitatile

Ri = @S/F=i(Ri) = @S/F=i(Ci |X| Pi) si R = R1 U R2 U R3

si cererea initiala care se putea exprima sub forma

@P/P(@S/F=1@AT>100000(R))

capata in baza de date reproiectata forma

@P/P(@S/F=1(@S/T>100000(@S/F=1(C1 |X| P1) U @S/F=2(C2 |X| P2) U


@S/F=3(C3 |X| P3))))

si prin coborarea selectiilor in arbore si eliminarea ramurilor cu conditii contradictorii


se obtine cererea

@P/P(@S/T>100000(C1) |X| P1)

care se poate efectua fara transfer de informatie si cu putina memorie ocupata si timp
de calcul scazut.

Reactualizarea bazelor de date distribuite nu este dificil de realizat. Inserarea


unui tuplu intr-o relatie logica se traduce prin inserarea unor tupluri in unele din
fragmentele asociate relatiei logice. Daca vrem sa inseram tuplul t in relatia logica R
si R este de forma R = R1 |X| ... |X| Rn acasta revine la a insera t[Ri] in Ri pentru
i=1,...,n. Daca R = R1 U ... U Rn atunci se determina un i astfel incat garda lui Ri sa
corespunda valorii din t si se insereaza t in Ri. Daca nu exista nici-un i cu aceasta
proprietate se da mesaj de eroare si daca sunt mai multi indici se alege unul dintre ei,
de preferinta fragmentul ce corespunde nodului unde are loc cererea.

Pentru a sterge un tuplu t din relatia logica R si R este compusa din fragmente
orizontale, atunci se sterge tuplul t din toate fragmentele in care apare. Daca R este
compusa din fragmente verticale apar probleme suplimentare de rezolvat deoarece
stergerea tuplurilor t[Ri] ar putea duce la pierderea de informatii fiind eliminate si
alte tupluri s pentru care s[Ri] = t[Ri]. In sistemul R* problema se rezolva asociind
fiecarui tuplu din relatiile logice fragmentate vertical cate un identificator unic si
acesta este pastrat in fiecare fragment al relatiei logice. Stergerea unui tuplu revine la
eliminarea din fragmente a tuplurilor care au identificatorul respectiv.

9.2. Optimizarea cererilor in baze de date distribuite


O alta problema importanta este legata de costul transmisiilor de date intre
noduri. De exemplu pentru a efectua uniunea naturala dintre relatia R cu r elemente si
relatia S cu s elemente costul transmiterii datelor este proportional cu c0 + min(r,s)
unde c0 este timpul de initiere al unui mesaj, unitatea de timp este considerata timpul
necesar pentru a transmite un tuplu si se presupune ca se face transferul unei copii a
relatiei cu mai putine elemente in nodul relatiei cu mai multe elemente.

Pentru a micsora costul transmisiilor in bazele de date distribuite se utilizeaza


o operatie suplimentara numita semiuniune. Se numeste semiuniunea relatiilor R si S
si se noteaza R |X S relatia obtinuta prin expresia @P/R(R|X|S).Aceasta operatie se
poate efectua de exemplu proiectand pe S dupa atributele comune lui R si S si apoi
eliminand din R acele tupluri t care nu au t[R@OS] in aceasta proiectie adica se
obtine expresia echivalenta R|X|@P/R@OS(S). Aceasta operatie nu este comutativa.

Daca proiectiile lui R si S dupa R@OS contin r' si respectiv s' elemente si
daca R |X S si S |X R au r" si respectiv s" elemente, se poate calcula R |X| S cu
procedeul urmator: se transfera @P/R@OS(S) in nodul lui R, se calculeaza R |X S in
nodul lui R, se transfera R |X S in nodul lui S si se calculeaza (R |X S) |X| S in nodul
lui S (sau simetric schimband intre ele R si S). Costul acestei strategii este 2c0 + s' +
r" si se obtine un cost mai mic decat efectuarea directa a uniunii daca are loc
inegalitatea

c0 + min(s' + r",r' + s") < min(r, s)

care de cele mai multe ori in practica este indeplinita.

Teorema 5. . Pentru orice relatii R si S are loc (R |X S) |X| S = R|X|S.

Demonstratie. Din definitia lui R |X S rezulta ca este inclusa in R si deci


expresia din stanga este inclusa in expresia din dreapta. Reciproc, daca t este un tuplu
al relatiei din dreapta rezulta ca t[R] este in R si t[S] este in S de unde rezulta ca t[R]
este in R |X S si deci t este in relatia din stanga, deci si incluziunea reciproca este
adevarata ceea ce demostreaza teorema.

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 jk-
familie 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


dintr-un 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
/ \ // \
/ \ // \
/ \ / / \
U |X| R S |X|
/\ / \ //\\
/ \ / \ / / \ \
/ \ / \ / / \ \
R S |X| |X| T U V W
/\ /\
/ \ / \ Figura 5.
/ \ / \
T U V W

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
cu frunzele c1,...,ck si se obtine multimea expresiilor asociate lui n prin
inlocuirea frunzelor din acesti arbori cu toate combinatiile de expresii din
multimile asociate S1,...,Sk.
- Se estimeaza costurile asociate expresiilor construite considerand rezultatul
in fiecare din noduri. Pentru o frunza etichetata cu R costul asociat este
zero pentru rezultat in nodul lui R si este c0+|R| pentru rezultat in alt nod.
Fie n un nod intern. Daca n este selectie sau proiectie se obtine un cost
minim daca rezultatul lui n este in acelasi nod cu rezultatul fiului lui n si
deci costul lui n coincide cu costul fiului sau pentru fiecare nod in parte.
Daca n este reuniune pentru a afla cel mai bun cost de a calcula n in nodul a
se considera minimul dupa toate nodurile b si c a costurilor de calcul a
fiilor lui n in b si in c la care se adauga eventualele costuri de transfer
cand b sau c nu coincid cu a. Daca n este uniune se procedeaza ca la reuniune
considerand toate cazurile posibile pentru efectuarea uniunii.
- Se determina arborele ce corespunde costului minim si se descrie programul de
evaluare corespunzator lui.

Considerand ca pentru fiecare relatie R si fiecare submultime de atribute X din


R se poate estima numarul tuplurilor din @P/X(R) si notand cu IR numarul |
@P/R@OS(R)| si cu IS numarul |@P/R@OS(S)| se obtine estimarea

|R |X| S| = |R||S|/max(IR,IS)

9.4. Problema concurentei

In cazul bazelor de date distribuite controlul concurentei se face mai dificil pe


de o parte din cauza numarului mare de mesaje de transmis intre noduri si pe de alta
parte prin posibilitatea de lucru in paralel in diferite noduri. Pentru a micsora numarul
de mesaje, locarile se fac la nivele mari, de cele mai multe ori la nivel de relatii,
fiecarei tranzactii corespunzandu-i in acest fel un numar mic de locari.

O problema suplimentara este asigurarea identitatii copiilor unei relatii


existente in diferite noduri. Si in acest caz solutiile sunt mai simple daca se lucreaza
cu tranzactii in doua faze deci care mai intai fac locarile, apoi fac operatiile de citire
sau scriere si in final fac delocarile.

Una din cele mai utilizate strategii in acest caz este: locarea pentru citire a
elementului A locheaza una din copiile lui A si locarea la scriere a lui A locheaza
toate copiile lui A. Locarile se fac prin trimiterea de mesaje de cerere de locare catre
nodurile ce au copii ale relatiei si obtinerea unor confirmari sau infirmari a
posibilitatii locarii eventual si cu transmiterea valorilor elementelor locate.

O alta strategie se numeste strategia majoritara de locare si consta in


posibilitatea locarii la citire sau scriere daca se pot loca mai mult de jumatate dintre
copii de tranzactia respectiva. Acesta metoda micsoreaza numarul mesajelor la
locarile pentru scriere si il mareste pe cel de la locarile pentru citire. In plus pot sa
apara interblocari prin detinerea de copii de mai multe tranzactii dar nici-una neavand
majoritatea.

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

In acest capitol vom descrie nivelul fizic al bazelor de date.


Plecand de la necesitatea reprezentarii informatiilor si a
legaturilor intre informatiile ce constituie o baza de date vom
descrie metode de organizare si de operare cu astfel de structuri
folosind mediile de memorare.

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
o putere a lui 2 cuprinsa intre 2/e9 si 2/e12 octeti. Fiecarui bloc i
se asociaza o adresa
Un bloc poate sa contina una sau mai multe inregistrari. De regula o
inregistrare nu se poate memora in mai mult decat un bloc cu exceptia
inregistrarilor cu lungimi mai mari decat lungimea blocului (caz rar
intalnit) dar in acest caz nu pot apare informatii pentru doua
inregistrari diferite in acelasi bloc.

Inregistrarile pot sa fie localizate in mai multe feluri: prin


adresa absoluta pe mediu de memorare care se face indicand cilindrul,
pista, sectorul si adresa in sector a inceputului inregistrarii
(metoda mai rar utilizata in diferitele limbaje de programare), prin
indicarea numarului asociat inregistrarii in cadrul fisierului, prin
indicarea distantei fata de inceputul fisierului a inceputului
inregistrarii, prin indicarea blocului si a adresei relative in bloc
( numarul inregistrarii din bloc sau distanta pana la capatul
blocului). Referirea inregistrarilor (pointeri la inregistrare) se
poate face prin oricare din metodele de adresare de mai sus. Un alt
mod de adresare este prin intermediul valorilor unor campuri ale
inregistrarilor, de cele mai multe ori ale campurilor corespunzatoare
cheilor.

Performantele unui sistem depind in foarte mare masura de


timpul necesar accesului la bloc. Acest timp este determinat de
caracteristicile fizice ale sistemului de calcul, de sistemul de
operare folosit, de limbajul de programare utilizat si de modul de
organizare a fisierului.

Pentru gestionarea blocurilor si a inregistrarilor in blocuri,


fiecare bloc are la inceput o eticheta care poate sa contina numarul
inregistrarilor ocupate, biti de ocupare sau biti de stergere.

2. Tipuri de organizare a fisierelor

In organizarea fisierelor se tine seama de mai multi factori


cum ar fi frecventa cu care se efectueaza anumite tipuri de operatii
asupra fisierelor, campurile implicate in operatiile de cautare
(cheile fisierului) sau relatia in care se afla inregistrarile
fisierului cu alte informatii din sistem. Daca exita ponteri la unele
inregistrari din fisier se spune ca fisierul este cu inregistrari
fixate si in acest caz fiecare inregistrare ramane, de obicei pe
locul pe care a fost introdusa, locul ocupat de o astfel de
inregistrare nu mai poate fi refolosit dupa eliminarea inregistrarii.
In caz contrar se spune ca fisierul este cu inregistrari nefixate,
inregistrarile putand fi mutate sau spatiul eliberat prin eliminarea
unor inregistrari putand fi reutilizat.

Cele mai des utilizate tipuri de organizare a fisierelor sunt:


secvential, cu dispersie, cu index rar, cu index dens, cu structura
de B-arbore. Aceste cinci tipuri de organizare a fisierelor vor fi
descrise pe scurt in cele ce urmeaza.

2.1. Fisiere secventiale

Fisierele secventiale (englezeste - heap files) presupun


inregistrarile memorate ca elementele unei liste liniare de cele mai
multe ori in blocuri consecutive, legate intre ele prin pointeri sau
prin construirea unui tabel separat cu adresele acestor blocuri ce
permit accesul la ele.

Inserarea unui element se face de cele mai multe ori prin


adaugarea noului element la sfarsitul listei (in special in cazul
fisierelor cu inregistrari fixate si neordonate). Insararea se mai
poate face prin includerea noi inregistrari pe primul loc disponibil
pentru fisiere cu inregistrari nefixate si cu biti de stergere, prin
includerea noii inregistrari intr-un bloc existent sau unul nou si
legarea ei in lista pentru inregistrari fixate sau ordonate, prin
deplasarea fizica a unor inregistrari pentru a face loc noii
inregistrari in cazul fisierelor cu inregistrari nefixate si ordonate
sau prin alte tehnici asemanatoare.

Stergerea unui element se face prin inlocuirea elementului care


se elimina cu ultimul element al fisierului, prin deplasarea
elementelor care urmeaza inregistrarii care se elimina cu un element
catre inceputul fisierului pentru fisiere cu inregistrari nefixate si
fara bit de stergere, eventual ordonate, prin modificarea bitului de
stergere sau prin eliminarea din lista cu legaturi si marcarea
inregistrarii ca libera. Pentru fisierele cu inregistrari nefixate
pentru care unele blocuri nu mai contin inregistrari, acele blocuri
sunt eliberate si pot fi reutilizate.

Modificarea unui element se face de obicei prin citirea


inregistrarii corespunzatoare, modificarea campurilor implicate si
rescrierea in acelasi loc a valorilor rezultate. Pentru fisierele
ordonate pentru care sunt afectate campuri ce contribuie la ordonare
operatia de modificare presupune citirea valorilor inregistrarii
implicate, stergerea inregistrarii din fisier, modificarea valorilor
campurilor si inserarea unei noi inregistrari cu valorile
reactualizate.

Cautarea unui element se poate face prin parcurgerea


secventiala a tuturor elementelor fisierelor si verificarea
conditiilor de selectionare a inregistrarii examinate. Aceasta metoda
presupune in medie examinarea a (N+1)/2 inregistrari la o cautare cu
succes si a N inregistrari la o cautare fara succes, unde N este
numarul de inregistrari din fisier. Daca fisierul este ordonat si se
face cautare dupa cheie (campurile dupa care s-a facut ordonarea) se
obtine o eficienta mai buna in cazul cautarii secventiale la cautarea
fara succes si anume in medie (N+1)/2 inregistrari examinate dar mai
eficiente sunt cautarile binare care dau in medie log N inregistrari
examinate sau cautarile cu calculul adresei care dau in medie log log
N inregistrari examinate (vezi [Knuth]).

Avantaje: programe simple de organizare si utilizare,


nefolosirea sau folosirea in mica masura a spatiului suplimentar
pentru legaturi sau alte informatii, posibilitati multiple de
reorganizare, uneori permit operare simpla utilizabila pentru fisiere
dinamice.

Dezavantaje: numarul mare de elemente examinate in medie la


cautare, operatii dificile in cazul fisierelor ordonate.

Utilizare: Daca in cazul unor fisiere mari organisarea


secventiala este practic ineficienta, in cazul unor fisiere de
dimensiuni mici se poate utiliza cu succes aceasta organizare.

2.2. Fisiere cu dispersie

Fisierele cu dispersie (englezeste - hashed files) grupeaza


inregistrarile in clase de inregistrari fiecare clasa fiind memorata
in unul sau mai multe blocuri de memorie. Apartenenta unei
inregistrari la una din clase este determinata rapid (de obicei
printr-un proces de calcul) in functie de valoarea pe care o are
cheia inregistrarii. Functia care determina aceasta corespondenta se
numeste functie de dispersie Fiecare clasa este organizata prin
metode de organizare secventiala.
Numarul de clase si modul de calcul al clasei asociate unei
inregistrari se aleg in asa fel incat sa asigure pe de o parte o
distributie cat mai uniforma in clase si pe de alta parte ca numarul
mediu de inregistrari intr-o clasa sa nu fie prea mare pentru a da un
timp rezonabil la cautare. O functie de dispersie des utilizata este
cea care interpreteaza sirul de biti corespunzator chei ca un numar
natural iar clasa asociata elementului este data de restul impartirii
acestui numar la numarul de clase (eventual adunat cu 1 daca
numerotarea incepe de la 1 si nu de la 0).

In implementarea fisierelor cu dispersie se construieste o


lista numita director cu pointeri la blocul de incepere corespunzator
fiecarei clase, blocurile unei aceleiasi clase fiind inlantuite
ultimul bloc avand pointer nul. Directorul este memorat in blocuri
ale fisierului si daca este de dimensiuni mici este incarcat in
memoria principala de cate ori se lucreaza cu fisierul respectiv
pentru a micsora numarul de accese la memoria externa.

Operatiile cu fisiere cu dispersie se fac analog cu operatiile


cu fisiere secventiale, singura deosebire fiind data de localizarea
clasei corespunzatoare inregistrarii inplicate.

Daca clasele devin prea mari se pune problema reorganizarii


fisierului cu marirea numarului de clase. O buna alegere a functiei
de calcul a clasei permite ca in cazul unei mariri de un numar de ori
a numarului claselor, noua functie de calcul sa stabileasca drept noi
clase partitii ale vechilor clase. De exemplu daca se dubleaza
numarul de clase si functia de imprastiere este obtinuta ca restul
unei impartiri la numarul de clase, atunci orice clasa i se imparte
in doua clase distincte si anume i si n+i unde n este numarul initial
de clase. Deci in acest caz operatia de reorganizare se poate face
clasa cu clasa.

Avantaje: timp relativ redus de acces pentru clase de


dimensiuni mici, programe relativ simple de gestionare si utilizare,
posibilitati de organizare in cazul fisierelor cu inregistrari
fixate.

Dezavantaje: spatiu suplimentar pentru organizarea claselor,


posibile reorganizari, dificila parcurgerea in ordine a
inregistrarilor din tot fisierul.

Utilizare: organizare destul de des utilizata in tehnicile de


implementare a bazelor de date mai ales pentru modelele retea si
ierarhic; cu posibilitati bune de operare in cazul fisierelor
dinamice.

2.3. Fisiere cu index rar

Fisierele cu index rar sau indexat secventiale presupun


memorarea inregistrarilor intr-un fisier numit fisierul principal in
ordinea crescatoare a cheilor si grupate pe pagini. Se adauga un alt
fisier, numit fisierul index ce contine pentru fiecare pagina din
fisierul principal cate o inregistrare cu valoarea celei mai mari
chei din pagina si adresa de inceput a paginii. Fisierul index este
ordonat crescator in raport cu valoarea cheii folosind pentru el o
metoda de organizare oarecare. De cele mai multe ori pagina
corespunde cu un bloc. Inlantuirea blocurilor in ordinea crescatoare
a cheilor permite parcurgerea secventiala ordonata a fisierului. Din
necesitati practice se pot inlantui si blocurile corespunzatoare
fisierului index.

Cautarea se face cu o cautare in fisierul index prin metode


adecvate organizarii lui (cautare liniara, cautare binara sau cautare
prin calculul adresei) pentru gasirea unei inregistrari ce contine
cea mai mica cheie mai mare sau egala cu cheia cautata. Adresa din
acea inregistrare da posibilitatea acesului la pagina care poate
contine inregistrarea cautata. Apoi se face o cautare secventiala sau
prin alta metoda in acea pagina. Eventual se testeaza bitul de
existenta sau bitul de stergere daca acestia exista.

Inserarea se face urmand procedeul de la cautare pentru


determinarea paginii unde urmeaza sa apara noua inregistrare si daca
mai este loc in pagina se aplica procedeul de inserare in fisier
ordonat, altfel se introduce un bloc nou cu distribuirea
inregistrarilor implicate si modificarea corespunzatoare a fisierului
index. Daca cheia noii inregistrari este mai mare decat cea mai mare
cheie existenta in fisier trebuie modificata cheia ultimei pagini din
index punand cheia ultimei inregistrari introduse.

Stergerea unui element se face prin eliminarea elementului din


lista ordonata corespunzatoare paginii in care apare acea
inregistrare. Daca blocul nu mai contine nici-o inregistrare se
elimina blocul respectiv din fisierul principal cu modificarea
corespunzatoare a indexului. Se observa ca in cazul in care se
elimina inregistrarea cu cheia cea mai mare din pagina sistemul
functioneaza corect si daca lasam neschimbat indexul in acest caz.

Modificarea se face prin citire, schimbarea valorilor si


rescriere cand nu sunt afectate campuri ce apartin cheii sau prin
stergere si inserare in cazul afectarii unor campuri ce apar in
cheie.

Pentru fisierele cu inregistrari fixate indexul nu se schimba


iar noile inregistrari introduse si care nu mai incap in blocurile
corespunzatoare lor in blocuri noi legate de acestea formand clase ca
la fisierele prin dispersie. Daca clasele devin foarte mari trebuie
aplicata o reorganizare. Parcurgerea in ordine a inregistrarilor se
poate face daca se asociaza fiecarei inregistrari un pointer la
inregistrarea urmatoare.

Avantaje: spatiu supimentar pentru reprezentarea fisierului


index relativ redus, permite determinarea inregistrarilor cu chei
intr-un interval dat, bine adaptabil pentru fisiere dinamice,
fisierele index nu sunt cu inregistrari fixate ceea ce permite
reorganizari mai simple si permite aflarea inregistrarii cu cheia cea
mai mica dintre cele cu chei mai mari decat o valoare data (cheia ce
acopera o valoare v data).

Dezavantaje: uneori poate sa consume spatiu suplimentar mult


daca paginile nu sunt incarcate pana aproape de capacitatea maxima,
operatii de depasire a capacitatii unei pagini dificil de manevrat.

Utilizare: Se folosesc in special la organizarea unor fisiere


statice sau pentru imbunatatirea timpului de acces la alte fisiere
index.
2.4. Fisiere cu index dens

Organizarea cu index dens presupune asocierea la un fisier


numit fisierul de baza a unui alt fisier numit fisier index cu
acelasi numar de inregistrari ca fisierul de baza. Inregistrarile din
fisierul index contin, ca si in cazul fisierelor cu index rar,
perechi formate din cheile inregistrarilor fisierului de baza si
pointeri la aceste inregistrari dar de data aceasta pentru toate
inregistrarile fisierului de baza. Pentru fisierul index se paote
folosi oricare dintre tipurile de organizari prezentate.

Avantaje: inregistrarile fisierului index sunt nefixate ceea ce


permite o organizare mai eficienta, inregistrarile fisierului index
fiind mai scurte decat ale fisierului de baza numartul de blocuri ce
trebuiesc accesate este mai mic pentru diferitele operatii cu
fisierul, la acelasi fisier de baza pot fi asociate mai multe fisiere
index corespunzatoare diferitelor chei. Poate fi utilizat in
transformarea unui fisier cu inregistrari fixate intr-un fisier cu
inregistrari nefixate.

Dezavantaje: spatiu suplimentar ocupat, necesitatea combinarii


cu alte metode, neasigurarea unei bune acoperiri a spatiului alocat.

2.5. Fisiere cu structura de B-arbore

Pentru fisierele de dimensiuni foarte mari se poate privi


indexul din organizarea indexat secventiala ca un fisier de baza si
pentru el sa se organizeze un fisier index rar. Procedand recursiv
pana se obtine un fisier index ce ocupa un singur bloc obtinem o
structura indexata pe mai multe nivele foarte flexibila si eficienta
de arbore echilibrat care are drept frunze blocuri ce contin pointeri
la inregistrarile fisierului sau eventual chiar inregistrarile daca
fisierul nu este cu inregistrari fixate. Numele de B-arbore al
acestor structuri vine de la denumirea in limba engleza a lor
balanced trees.

Pentru a asigura o ocupare eficienta a spatiului toate


operatiile care se fac in B-arbori respecta conditia de a lasa in
toate blocurile cu exceptia eventual a radacinii a unui numar de
inregistrari mai mare decat jumatate din capacitatea blocului
respectiv. Daca de exemplu un nod intern poate memora 2d-1
inregistrari (cheie+adresa bloc) si o frunza poate sa memoreze 2e-1
inregistrari atunci nodurile interne cu exceptia eventual a radacinii
trebuie sa aiba cel putin d inregistrari si frunzele trebuie sa aiba
cel putin e inregistrari.

Se observa ca intr-un B-arbore ultima cheie a fiecarui bloc nu


este necesara presupunandu-se ca orice inregistrare cu cheia mai mare
decat penultima cheie a blocului se afla in blocul dat de ultimul
pointer.

Cautarea se face incepand de la radacina si luind in continuare


blocul dat de adresa corespunzatoare celei mai mici valori a unei
chei dintre cele mai mari sau egale cu cheia cautata (in cautarea
liniara este prima cheie mai mare sau egala cu cheia cautata) apoi
aplicand acest procedeu recursiv pana se ajunge la o frunza unde
poate fi gasita
inregistrarea cautata.

Inserarea se face prin localizarea ca la cautare a blocului


unde ar trebui sa se afle noua inregistrare si prin inserarea acelei
inregistrari in blocul gasit daca mai este loc. Daca toate
inregistrarile blocului sunt ocupate se creaza un nou bloc cele doua
blocuri impartindu-si in mod egal inregistrarile si apoi inseranu-se
la nivelul imediat superior adresa noului bloc impreuna cu cea mai
mare cheie a lui (se presupune ca in blocul nou introdus s-au pus
inregistrarile cu cele mai mici chei. Daca se ajunge astfel la
radacina arborele creste numarul nivelelor cu unu noua radacina avand
in acest caz doi fii: un bloc nou introdus si vechea radacina.

Stergerea se face prin localizarea inregistrarii care se


elimina ca la cautare si se elimina aceasta inregistrare din bloc.
Daca in bloc raman mai mult de jumatate inregistrari ocupate atuci
procesul se termina, altfel blocul respectiv se combina cu un bloc
vecin fie redistribuind inregistrarile fie, daca si acel bloc este la
limita inferioara se formeaza din cele doua blocuri unul singur.
Combinarea a doua blocuri poate produce modificari sau stergeri si la
nivelele superioare uneori (foarte rar) putand micsora inaltimea
arborelui (cazul unei radacini cu numai doi fii care se combina intr-
un singur bloc).

Modificarea se face la fel ca si pentru celelalte metode in


functie de faptul daca sunt afectate sau nu campurile cheie.

Pentru operatiile cu B-arbori se fac un numar de citiri/scrieri


de blocuri de ordinul lui (log n - log e)/log d unde n este numarul
de inregistrari din fisier, o frunza poate sa contina cel mult 2e-1
inregistrari si un nod intermediar poate sa contina cel mult 2d-1
perechi cu chei si adrese.

Avantaje: aplicabil cu foarte bune rezultate in cazul


fisierelor dinamice datorita numarului mic de blocuri accesate in
operatii si a numarului mic de operatii la reactualizari, permite
furnizarea listei elementelor in ordinea data de cheie, se poate
aplica oricarui fisier unul sau mai multi B-arbori care sa lucreze ca
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.

2.6. Inplementarea modelului logic

3. Metode de cautare in fisiere

3.1. Fisiere cu indexi secundari

Nu toate cautarile din bazele de date se fac dupa cheia


principala. Daca un atribut sau un grup de atribute apar des in
cereri atunci pentru acel atribut sau grup de atribute se
construieste un index numit index secundar ce permite accesul rapid
la inregistrarile corespunzatoare valorilor date. Un fisier cu un
index secundar corespunzator unui atribut sau grup de atribute F se
spune ca este fisier inversat in raport cu F. In indexul secundar
inregistrarile sunt indicate fie prin pointeri la ele fie prin
valorile cheilor principale corespunzatoare lor.

Referirea la inregistrari prin pointeri are avantajul accesului


mai rapid la informatie dar produce constrangeri din cauza fixarii
inregistrarilor pe locul pe care au fost introduse sau la nivel de
bloc sau la nivel de clasa. Referirea prin cheia principala asociata
are dezavantajul unui acces mai lent dar nu mai fixeaza
inregistrarile.

3.2. Indicarea partiala a chei de cautare

Daca ne intereseaza inregistrarile care au valorile


a1,a2,...,ak pentru atributele A1,A2,...,Ak care nu constituie o
cheie aceasta revine la determinarea intersectiei multimilor
S1,S2,...,Sk unde Si este multimea tuturor inregistrarilor care au
valoarea ai corespunzatoare atributului Ai.

O metoda utilizata in acest caz este metoda indexilor secondari


multipli. Din indexii asociati atributelor A1,A2,...,Ak se determina
multimile de pointeri P1,P2,...,Pk ale pointerilor catre
inregistrarile multimilor S1,S2,...,Sk si daca acestea nu au prea
multe elemente se face intersectia lor in memoria principala. O
varianta este alegerea unui indice i pentru care multimea Si are cele
mai putine elemente (de obicei se ia multimea pentru care atributul
poate lua cele mai multe valori) si apoi se verifica pentru aceste
elemente daca indeplinesc si celelalte conditii. Daca pointerii sunt
la nivel de bloc, metoda intersectiei multimilor de pointeri poate sa
produca si elemente false si se fac verificari suplimentare.

A doua metoda utilizata in acest caz este o generalizare a


fisierelor cu dispersie ce folosesc functii de dispersie
partitionate. In aceasta metoda la calculul clasei unui element
contribuie toate campurile inregistrarii. Cu functii de dispersie
bine construite se poate limita numarul de clase in care se poate
afla o inregistrare pentru care cunoastem numai o parte dintre
campuri. Aceasta se obtine impartind bitii unui numar de clasa in mai
multe parti componente si atribuid fiecarui atribut posibilitatea de
a determina o anumita parte asociata din adresa.

Sa presupunem de exemplu ca numarul de clase este o putere a


lui 2 si anume 2**B, deci adresa unei clase este un sir de B biti.
Vom imparti cei B biti in grupe, cate o grupa pentru fiecare atribut
(eventual unele grupe nu au nici-un bit). Daca atributele sunt
A1,A2,...,Ak si atributului Ai ii sunt atribuiti bi biti, determinam
clasa inregistrarii (a1,a2,...,ak) calculand hi(ai) pentru i=1,...,k
unde hi este o functie de dispersie pentru atributul Ai cu valori
intre 0 si 2**bi-1 iar numarul clasei inregistrarii se obtine prin
concatenarea acestor adrese deci este sirul de B biti
h1(a1)h2(a2)...hk(ak).
Pentru cautare se construiesc numere de clase cu valori fixate
obtinute aplicand functia de dispersie unei valori cunoscute pentru
atributele pentru care se cunosc valorile si luand toate
posibilitatile pentru grupele asociate atributelor pentru care nu se
cunosc valorile.

Daca se cunosc probabilitatile cu care atributele apar intr-o


cerere atunci se pot stabili proprietati interesante dupa cum
urmeaza.

Teorema 6.1. Daca valorile unui atribut sunt egal probabile


cand se specifica o valoare pentru acest atribut, atunci se obtine in
medie un numar minim de clase de examinat pentru a obtine raspunsul
la o cerere daca pentru anumite numere n1,n2,...,nk al caror produs
este numarul de clase, adresa clasei asociate inregistrarii
(a1,a2,...,ak) se exprima cu formula
hk(ak)+nk(h[k-1](a[k-1])+n[k-1](h[k-2](a[k-2])+...
+n2h1(a1)...))
unde functia de dispersie hi(ai) ia valori intre 0 si ni.

O demonstratie a acestei teoreme este data in Bolour [1979].


Din aceasta teorema se deduce ca alegand fiecare ni ca o putere a lui
2 putem sa obtinem o aproximatie a unei solutii optime. Alegerea
puterilor lui 2 este o alta problema care a fost rezolvata numai in
cazuri particulare. Daca in cereri se considera valoarea unui singur
atribut atunci valorile b1,b2,...,bk se aleg dupa cum urmeaza din
teorema:

Teorema 6.2. Daca toate cererile specifica doar cate un atribut


si pi este probabilitatea ca Ai sa fie atributul specificat, atunci,
presupunand ca nici-un bi nu este mai mic decat 0 sau mai mare ca B,
numarul mediu de clase cercetate este minim daca
bi=(B - (log p1 + log p2 +...+ log pk))/k + log pi
unde k este numarul de atribute, 2**B este numarul de clase si
logaritmii sunt in baza 2.

Demonstratia acestei teoreme se face utilizand metoda


multiplicatorilor lui Lagrange si poate fi gasita in Ullman [1982].
Formula din teorema permite aflarea valorilor elementelor bi aplicand
urmatoarele reguli:
- daca un bi este mai mare decat B se face acel bi egal cu B si
se fac 0
celelalte valori;
- daca o valoare bi este negativa se elimina atributul
corespunzator din
calcule si se reaplica teorema;
- se trunchiaza valorile bi (luandu-se partea intreaga a lor)
si
eventualele unitati ramase se adauga la valorile acelor bi
care au
partea zecimala cea mai mare.

Exemplul 1. Sa consideram un fisier corespunzator entitatii


STUDENT avand atributele MATRICOLA, NUME si DATA_NASTERE care sunt
cerute cu probabilitatile 0.24, 0.75 si respectiv 0.01. Presupunem ca
formam 512 clase, deci B=9 si aplicand formula din teorema obtinem
bi=6.03 + log pi de unde rezulta b1=3.98, b2=5.62 si b3=-0.61.
Deoarece b3 este negativ se ia b3=0 si se refac calculele numai
pentru primele doua campuri cu probabilitatile p1=0.24/(1-0.01)=0.242
si respectiv p2=0.75/(1-0.01)=0.758 de unde se obtine bi=5.72+log pi
rezultand b1=3.68 si b2=5.32 apoi prin trunchiere la 3 si respectiv 5
se obtine disponibil o unitate care se adauga lui b1 care are partea
fractionara cea mai mare obtinand in final b1=4, b2=5 si b3=0.

Un alt caz in care se pot specifica valorile optime pentru bi


este cel in care se cunosc probabilitatile cu care campurile sunt
mentionate in cereri aceste probabilitati fiind independente de
mentionarea altor campuri in aceeasi cerere. Formulele de calcul
pentru bi sunt date de teorema urmatoare:

Teorema 6.3. Daca pi este probabilitatea cu care se specifica


valoarea atributului Ai intr-o cerere independent de celelalte valori
specificate, atunci, presupunand ca bi nu sunt negativi sau mai mari
decat B, numarul mediu de clase de cautat este minim daca se ia
bi=(B - (log q1 + log q2 +...+ log qk))/k + log qi
unde qi=pi/(1-pi), i=1,2,...,k, restul conditiilor fiind ca la
teorema 6.2.

Demostratia acestei teoreme este asemanatoare cu demonstratia


teoremei precedente. Algoritmul de calcul al valorilor bi, i=1,...,k
este la fel ca in cazul precedent doar ca in loc de pi se ia pi/(1-
pi) in calcule.

Exemplul 2. Sa consideram fisierul corespunzator entitatii


COMENZI care are atributele NUME, MARFA, CANTITATE si DATA
specificate cu probabilitatile p1=0.8, p2=0.5, p3=0.01 si p4=0.2 si
numarul de clase este 512, deci B=9. Facand calculele se obtine
b1=5.91, b2=3.91, b3=-2.73 si b4=1.91. Cum b3 este negativ se elimina
atributul CANTITATE din calcule si se face b3=0. Refacand calculele
se obtine b1=5, b2=3, b3=0 si b4=1 si nu mai sunt necesare
reajustari. Numarul de clase cercetate la o cerere este in acest caz
de 58.3 in medie.

3.3. Cazuri speciale de cautare

In cereri pot sa intervina si alte tipuri de conditii pentru


determinarea unei inregistrari sau unei multimi de inregistrari decat
cele prezentate pana acum. Un astfel de caz il constituie indicarea
limitelor intre care trebuie sa se afle valorile corespunzatoare unor
campuri pentru a selectiona inregistrarile. Acest tip de cereri le
vom numi cereri dupa marime.

Pentru cererile dupa marime se pot aplica metodele anterioare


cu o alegere corespunzatoare o tehnicilor de lucru. De exemplu se
poate adapta tehnica de dispersie partitionata alegand functiile de
dispersie in asa fel incat elementele din clase diferite sa fie in
aceeasi relatie de ordine ca si adresele lor. Un exemplu de astfel de
functie este urmatorul. Daca numarul de clase este M (deci adresele
claselor sunt de la 0 la M-1) si valorile unui camp sunt relativ
uniform distribuite pe intervalul [a,b) se ia drept clasa pentru
valoarea v numarul [(v-a)/(b-a)*M] unde prin [] am notat partea
intreaga a numarului respectiv. Pentru distributii neuniforme sau
nespecificarea intervalului de variatie a valorilor campurilor se pot
defini alte functii de dispersie mai bune (eventual tabelate).
O alternativa de rezolvare este si folosirea B-arborilor
construind cate un B-arbore pentru fiecare atribut in parte,
selectionand din ei pointeri catre inregistrarile care au valori
cuprinse intre limitele precizate si apoi facand intersectia acestor
multimi pentru a identifica toate inregistrarile care indeplinesc
toate conditiile specificate.

3.4. Interpretarea vederilor

4. Inregistrari de lungime variabila

In practica apar situatii cand o inregistrarte nu are o lungime


fixa. Aceasta se intampla mai ales in cazul cand un camp sau o
combinatie de campuri se repeta de mai multe ori. De exemplu, in
cazul unei relatii de forma unu-la-mai-multi de la entitatea E1 la
entitatea E2 poate fi implementata logic in felul urmator: fiecarui
element al lui E1 ii corespunde o inregistrare a unui fisier care
include toate informatiile elementelor entitatii E2 care corespund in
relatia data elementului din entitatea E1.

La nivel fizic, fisierele cu inregistrari logice de lungime


variabila sunt reprezentate tot prin fisiere cu inregistrari de
lungime fixa. De obicei transformarea inregistrarilor logice de
lungime variabila se face prin una din urmatoarele trei metode:
metoda spatiului rezervat, metoda inlantuirii sau metoda mixta.

Operatiile cu fisiere cu inregistrari de lungime variabila se


fac la fel ca la celelalte fisiere tinand seama de modul de
organizare a lor. In acest caz intervin operatii suplimentare ce
privesc unele repetari ale grupului repetitiv. Aceste operatii sunt
tratate ca aperatii pe fisiere obisnuite interpretand repetarile unui
grup repetitiv ca un mic fisier.

4.1. Metoda spatiului rezervat

In metoda spatiului rezervat se rezerva spatiu pentru numarul


maxim de ocurente posibile pentru atributul sau grupul de atribute
care se repeta. Se poate decide care elemente sunt ocupate si care nu
in ocurentele definite fie prin intermediul unui nou camp care
contine numarul de ocurente ce apar efectiv fie punand o valoare null
in locurile neocupate. Aceasta metoda se poate aplica in cazul in
care numarul maxim de repetari ale grupului de atribute este destul
de apropiat de numarul mediu de repetari, pentru utilizarea eficienta
a spatiului de memorie alocat, dar in acelasi timp este destul de mic
pentru a evita scrierea de mai multe ori a unor instructiuni din
cauza numelor diferite date campurilor.

4.2. Metoda inlantuirii


In metoda inlantuirii grupurile care se repeta sunt memorate
intr-un fisier separat, in fisierul initial se pune legatura la
primul bloc din al doilea fisier ce contine ocurente corespunzatoare
acelei inregistrari (in cazul cand nu exista astfel de ocurente se
pune valoarea null). Daca repetarile ocurentelor depasesc capacitatea
unui bloc, se folosesc blocuri suplimentare ce formeaza o lista cu
legaturi. Aceasta metoda este utilizata mai ales in cazul in care
numarul de ocurente este foarte mare sau numarul de repetari variaza
foarte mult pentru inregistrarile logice.

4.3. Metoda mixta

Cea de-a treia metoda este o combinatie a precedentelor doua


metode si anume se rezerva loc in inregistrarea initiala pentru un
numar nic de repetari ale grupului repetitiv si un pointer la primul
bloc al lantului de blocuri (al altui fisier) ce contine celelalte
repetari ce nu au putut fi puse aici. Acesta strategie se aplica mai
ales in cazul cand cele mai multe repetari sunt apropiate de numarul
mediu de repetari in care caz numarul de rezervari de locuri este
putin mai mare decat numarul mediu de rezervari urmand sa se apeleze
la al doilea fisier numai in cazurile exceptie cand numarul de
repetari ale grupului repetitiv este mai mare decat numarul spatiilor
rezervate.

4.4. Transformarea modelului virtual in model real

4.5. Implementarea modelelor de baze de date in cazul unor


entitati si
relatii de lungime variabila

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.
Ele se bazeaza pe memorii asociative prin care se determina
informatia prin valori continute in ea.

3. Interfete

Interfetele permit accesul facil la datele unei baze de date si


o definire mai simpla a aplicatiilor care fac posibila utilizarea
bazelor de date si de catre nespecialisti. Interfetele cuprind
componente de acces la date, componente de prezentare a datelor,
componente de generarea unor aplicatii si alte componente cum ar fi
posibilitati de utilizare a metodelor statistice, procesoare de
texte, programe de lucru tabelat, nuclee de sisteme expert, etc.

Se pot adauga la acestea diferite posibilitati de testare, de


simulare, de prelucrare a informatiei (copieri, sortari,
interclasari, etc.), proiectare automata, posibilitati de lucru in
multimedia si altele.
3.1. Interfete pentru acces la date

O metoda de acces la informatii pentru modelul relational il


permite folosirea relatiei universale. Numim relatie universala
asociata unei baze de date o relatie a carei schema contine toate
atributele schemelor relationale ale bazei de date. Se dau aceleasi
nume pentru atribute ce desemneaza aceleasi elemente si nume disticte
pentru atribute ce definesc elemente complet diferite.

Relatia universala poate constitui o interfata intre baza de


date si utilizator in sensul ca toate cererile sunt exprimate in
functie de atributele existente in baza de date si pentru utilizator
este transparent modul de memorare a informatiilor si modul cum sunt
analizate si executate cererile.

Accesul la date se face de obicei prin intermediul unei


interfete cu un terminal de comenzi (limbaje de cereri), prin
intermediul unei interfete de tip menu sau forme predefinite sau prin
intermediul unei interfete pentru limbaje naturale. Se mai pot
utiliza interfete ce utilizeaza semnele (icon - desen ce desemneaza
un anumit obiect ce poate fi activat prin selectarea cu un cursor pe
ecranul terminalului), interfete de selectare cu ajutorul cursorului
pe ecran in general, sisteme de recunoastere a vocii umane si altele.

Se folosesc tehnici diverse cum sunt ferestrele, meniurile


diverse, prompterii, grafica, fonturi si altele. Idea de baza este
aceea de a face lucrul cu baza de date cat mai apropiat de modul de
comportare obisnuita al utilizatorului.

De exemplu in sistemul INGRES accesul la date se face prin


intermediul unei forme care nu este altceva decat transpunerea pe
ecran a formelor de hartie folosite de utilizator. Formele sunt
folosite atat pentru introducerea in sistem a cererilor cat si pentru
comunicarea catre utilizator a rezultatelor cererilor.
Sistemul INGRES creaza automat o forma numita prin lipsa pentru
fiecare tabel de baza sau vedere pe care o descrie in catalog. Forma
cuprinde o linie de inceput de forma TABLE IS tabel urmata de o
listare a numelor atributelor tabelului in ordinea in care au fost
ele definite si de spatii pentru informatii de marime data de tipul
domeniului in care atributul ia valori. La afisarea unei forme pe
ecran apare o ultima linie cu meniul ce contine operatiile pe care
poate sa le execute utilizatorul. Combinatia dintre o forma si meniul
asociat ei se numeste frame. Cu ajutorul unui frame se poate exprima
o cerere folosind comenzile din menu si completand campurile asociate
diferitelor atribute din forma prin lipsa. Executarea cererii se face
prin activarea comenzii "Go".

Partea din sistemul INGRES care permite lucrul cu forme pentru


comunicare cu baza de date se numeste Query By Forms (QBF) si permite
formularea de cereri de catre persoane care nu au cunostinte despre
limbajele de cereri. In cereri pot fi folosite tabele de baza si
vederi, operatori logici si de comparatie, uniuni si alte operatii cu
tabele. Cu QBF se pot face reactualizari si inserari de date
(editarea bazei de date).

Se pot defini forme noi prin care se pot obtine uniuni de


tabele cu indicarea eventualelor modificari posibile sau care sa
contina mai multe randuri pe o singura forma sau se pot combina
diferite forme existente pentru a forma unele noi prin intermediul
unei componente numita Visual Forms Editor (VIFRED). Prin VIFRED
utilizatorul poate sa specifice etichetele ce se asociaza diferitelor
atribute (pot fi diferite de cele din baza de date), forma grafica de
prezentare a campurilor (in framuri, video, subliniat, clipitor,
stralucire), culoarea campurilor, posibilitati de modificare,
pastrarea valorilor anterioare pentru unele campuri (mai ales la
introducere de date), valori obligatorii pentru unele campuri, teste
de validare, mesaje in caz de eroare, valori prin lipsa si alte
indicatii asemanatoare.

Dintre sistemele de interfatare prin limbaje naturale mai


cunoscute sunt sitemele RENDEZVOUS definit de Codd la IBM Research si
INTELLECT definit de Harris la Dartmouth College.

In sistemul RENDEZVOUS cererile din limbajul natural sunt


transformate mai intai in expresii ale calculului relational folosind
bazele de cunostinte. Aceasta translatare se face in mai multe etape,
unele portiuni din cerere fiind traduse imediat iar altele sunt
traduse dupa ce au fost precizate anumite caracteristici ce se fac
intr-un dialog de clarificare intre utilizator si sistem. Sistemul
cere confirmarea privind corectitudinea traducerii dupa care executa
cererea utilizatorului.

Sistemul INTELLECT nu foloseste dialogul de clarificare ci


aplica regulile de constructie sintactica din limba naturala pentru
interpretarea frazelor dar si explorarea bazei de date pentru a
obtine informatii suplimentare. Interpretarea data cererii este
comunicata utilizatorului fara posibilitatea de modificari
ulterioare.

3.2. Interfete pentru prezentari de date

Pentru prezentarea datelor ca raspunsuri ale unor cereri pot fi


unilizate diferite tehnici cum sunt: rapoarete sub forma de tabele
simple, rapoarte editate, grafice economice, afiseri de imagini
(icon), iesire vorbita si alte posibilitati.

Prin raport se intelege o multime de formate de iesire a


datelor unei baze de date pe ecran sau pe hartie. Generatorul de
rapoarte este o componenta software ce permite producerea acestor
rapoarte. In sistemul INGRES se poate activa generatorul de rapoarte
prin comanda

REPORT nume

unde nume este fie numele unui tabel (vedere) din care se produce
raportul respectiv, fie numele unei specificatii de raport ce include
numele acelui tabel sau o cerere prin care se genereaza un tabel.
Initial generatorul de rapoarte genereaza un raport prin lipsa ce
poate fi modificat prin specificari generate de utilizator fie prin
intermediul sistemului Report By Forms (RBF) sau prin limbajul de
definire a rapoartelor.

Sistemul RBF este un editor interactiv de forme ce reprezinta


specificari de rapoarte plecand de la rapoarte prin lipsa.
Utilizatorul poate sa fixeze formatele de afisare, ordinea de
afisare, operatii agregat ce se pot aplica si alte indicatii. Se pot
aplica anumite operatii la inceputul si la sfarsitul rapoartelor de
tip totalizare, titluri, semnaturi, etc.

Pentru reprezentarea datelor sub forma de grafice exista


componente specializate in SGBD-uri asemanatoare cu generatoarele de
rapoarte doar ca modul de reprezentare a iesirilor difera fiind un
grafic. In sistemul INGRES componenta grafica poarta numele de Visual
Graphics Editor (VIGRAPH). Acesta permite patru tipuri de
reprezentari grafice: cu bare (bar charts), cu sectoare (pie charts),
punctuale (scatter graphs) si cu linii (line plots). Datele ce sunt
reprezentate grafic sunt valorile dintr-un tabel rezultat al unei
cereri. Forma de reprezentare grafica poate fi fixata prin
specificari grafice.

3.3. Generatoarele de aplicatii

Generatoarele de aplicatii sunt considerate unele din generatia


a patra fiind utilizate prin asa-numitele limbaje de generatia a
patra (4GL). In aceste limbaje sunt incluse pe langa operatiile
aritmetice si controlul fluxului in program si facilitati de definire
si acces in baze de date, definirea configurarii ecranului, intrari
si iesiri folosind ecranul, prelucrarea datelor pe ecran si altele.
Dezvoltarea aplicatiilor se face in mod interactiv.

Sistemul INGRES are un generator de aplicatii numit


Applications By Forms (ABF) permitand dezvoltarea de aplicatii ce
comunica date cu utilizatorul prin intermediul formelor. Orice
aplicatie poate fi privita ca fiind constituita dintr-un aranjament
arborescent de framuri, fiecare frame find compus dintr-o forma si un
menu asociat. Radacina arborelui este punctul de intrare in aplicatie
putandu-se trece la celelalte framuri ale aplicatiei prin parcurgerea
diferitelor drumuri in arbore. Chiar si sistemul INGRES in
totalitatea lui este construit ca o aplicatie de aceasta forma.

Cel care proiecteaza aplicatiile trebuie sa fie in masura sa


specifice frame-urile implicate in aplicatie, pentru acestea formele
si menuurile care trebuie sa fie afisate si pentru fiecare dintre
comenzile din menu care este sirul de operatii ce se executa in cazul
cand utilizatorul aplicatiei selecteaza acea comanda. De obicei un
sir de operatii se termina cu indicarea acelui frame care se afisaza
dupa terminarea efectuarii comenzii. Acasta se face prin intermediul
unei componente ABF numita limbaj de specificarea operatiilor
(Operation Specification Language - pe scurt OSL). Acest limbaj
contine printre altele instructiunile de operare din bazele de date
(SQL sau QUEL), instructiuni de control al formelor si instructiuni
de control al fluxului. Textele OSL se construiesc cu un editor al
sistemului de operare direct din ABF.

Frame-urile sunt impartite in patru categori: frame-uri


specificate de utilizator (create cu VIFRED sau QBF in ABF), frame-
uri QBF (create in mod QBF), frame-uri rapoarte (construite cu RBF)
si frame-uri VIGRAPH.

Programele pot fi usor depanate prin executia lor partiala in


timpul scrierii lor si corectarea imediata a erorilor semnalate prin
mesaje. Un program corect poate fi instalat in sistem prin crearea
unei imagini executabile a aplicatiei si definirea comenzii din
sistemul de baza care activeaza aplicatia respectiva. Apoi aplicatia
poate fi folosita de orice utilizator care poate sa dea comanda
asociata ei.

Aplicatiile pot fi grupate in pachete de aplicatii ce se pot


particulariza pentru grupuri de utilizatori si medii diferite prin
specificarea unor parametrii in momentul instalarii.

3.4. Facilitati de administrare

Pentru o baza de date se executa zilnic un numar mare de


sarcini ce privesc administrarea sistemului si SGBD-ul contine o
serie de programe si facilitati ce asista administratorul in
efectuarea lor. Sarcinile privesc pregatirea si executarea
aplicatiilor, utilitarele si comenzile sistemului, administrarea
performantelor, accesul la baza de date si altele.

Operatiile de pregatire si executie ale aplicatiilor contin


precompilari, compilari sau asamblari, editarea legaturilor,
instalari si executii de aplicatii. Acestea se fac de obicei prin
intermediul unor menuuri.

Utilitarele si comenzile sistemului permit activarea si


dezactivarea diferitelor baze de date, afisarea informatiilor privind
starea sistemului, urmarirea modului de evolutie a sistemului,
incarcarea, eliberarea si restabilirea bazelor de date, verificarea
unor conditii pe care trebuie sa le indeplineasca unele componente,
crearea de copii totale sau partiale ale bazelor de date, facilitati
de incarcare a bazelor de date prin prelucrarea unor fisiere,
interclasarea informatiilor, reorganizarea bazelor de date,
efectuarea de statistici asupra datelor (de obicei dupa reorganizari)
si altele.

Administrarea performantelor consta in initializarea


parametrilor la activarea sistemului, monitorizarea performantelor
prin producerea de rapoarte si grafice, comenzi de explicatii privind
diferitele optiuni luate de sistem in procesul de tratare a
cererilor, facilitati de instrumentare (diagnostice, statistici,
performante, caracteristici ale datelor si altele), facilitati de
limitare a resurselor (timp si spatiu) si altele.

Administratorul bazei de date mai executa si diferite operatii


de creare (logica si fizica) si intretinere a bazei de date, de
legaturi cu utilizatorii (crearea de vederi, asistarea in proiectarea
si pregatirea aplicatiilor si altele), definirea constrangerilor de
securitate si integritate (identificarea utilizatorilor, controlul
parolelor, constrangeri generale, verificari, reacoperiri, acordarea
de drepturi si revocarea lor), definirea procedurilor de salvare si
reacoperire si monitorizarea performantelor.

3.5. Dictionare

Sistemele de date de tip dictionar (DDS) au fost introduse ca


urmare a utilizarii din ce in ce mai intens a tehnicilor de analiza a
datelor putand fi integrate in SGBD sau construite in afara lui. Ele
sunt folosite pentru a inregistra si prelucra informatii despre
datele definite si prelucrate de utilizator fiind utilizate in
special de administratorul sistemului.

Dintre produsele de acest tip fac parte si Datamanager (MSP),


ICL DDS (ICL), DD/D (IBM), UCC-10 (University Computing-10), Data
Catalog2 (Synergetics), Data Dictionary (Applied Data Research),
Control 200 (Intel), Predict (Software AG), Data Control System
(Cincom) si Adabas DDS.

Dictionarele permit o imbunatatire a documentarii si


controlului, consistenta in folosirea datelor, analiza usoara a
datelor, reducerea redondantei datelor, programarea mai
simpla,standardizarea si o mai buna estimare a eventualelor
schimbari.

Fiecarui element i se asociaza in dictionar o inregistrare cu


urmatoarele informatii: numele elementului, descrierea datelor intr-o
limba naturala, detalii de proprietate, detalii privind utilizatorii
elementului, detalii despre sistemele si programele ce se refera sau
schimba elementul, detalii de constrangeri ce privesc acel element,
detalii despre tipul si structura datelor, conditii de securitate la
accesarea elementului, memorie utilizata, reguli de validare,
legaturi cu alte elemente si alte informatii.

4. Baze de date orientate obiect

Notiunile cu care se lucreaza mai des in sistemele bazate pe


obiecte sunt urmatoarele:

- Obiectul (object) este elementul de baza ce contine


informatii si metode de prelucrare. Fiecare obiect are asociat un tip
numita clasa si o valoare numita stare. Pentru fiecare obiect se
genereaza un identificator in sistem (object ID) care este
transparent pentru utilizator in bazele de date. Plecandu-se de la
obiecte predefinite in sistem se pot construi obiecte complexe.

- Clasa (classe) ce defineste atat structura datelor asociate


unor obiecte cat si operatiile ce se pot aplica acelor obiecte.

- Metoda (method) este o operatie sau o functie ce poate fi


aplicata unui obiect dintr-o clasa data. Multimea metodelor asociate
unei clase dau "interfata cu publicul" pentru obiectele acelei clase
prin ele fiind descrise operatiile de examinare si modificare a
obiectelor din clasa respectiva. Sistemul contine o multime de metode
primitive pentru operatii fundamentale cum ar fi compararea scalara,
operatii aritmetice, operatii pe cuvinte si altele. Pentru fiecare
clasa se defineste automat o metoda NEW prin care se creaza un nou
obiect vid (cu toate componentele nil) din clasa respectiva.

- Mesajul este modul de a transmite o comanda de a aplica o


metoda la un obiect dat. La receptionarea unui mesaj, obiectul
executa metoda indicata asupra datelor continute in obiect si trimite
obiectului care a lansat mesajul un raspuns rezultat din executia
metodei respective.

- Ierarhia claselor (class hierarchy) presupune construirea


unor structuri arborescente in care arcele corespund subordonarii
unei subclase fata de o clasa data. Pentru subclase se aplica
proprietatea de ereditate (structurala si de mediu - privind
metodele).

Din punct de vedere al bazelor de date exista trei nivele de


orientare obiect si anume:
- strucrural (structurally object-oriented) - capacitatea de a
reprezenta obiecte cu structuri complexe arbitrare;
- operational (operationally object-oriented) - abilitatea de a
opera cu
obiecte complexe ca un tot unitar prin intermediul
operatorilor pe
obiecte complexe generice;
- programabil (behaviorally object-oriented) - definirea
tipurilor in
sensul programarii orientate-obiect (clase) cu specificarea
tipurilor
si a operatiilor (mesaje) cu care se pot prelucra obiecte de
un tip
dat fara a cunoaste continutul lor (abstractia datelor).

Principalele caracteristici ale sistemelor orientate obiect


sunt:

1. Identitatea obiectelor. Obiectele au o existenta independenta de


valorile
lor. Astfel, doua obiecte pot fi identice in sensul ca reprezinta
acelasi
obiect sau pot fi egale in sensul ca au aceiasi valoare.

2. Notiunea de tip. Un tip descrie o multime de obiecte cu aceleasi


caracteristici dand structura datelor reprezentata de obiecte si a
operatiilor ce se pot aplica lor. Utilizatorii unui tip vad numai
interfata
tipului adica o lista de metode impreuna cu semnaturile sale
(tipul
parametrilor de intrare si tipul rezultatului) ceea ce se numeste
incapsulare.

3. Notiunea de ereditate. Ereditatea este proprietatea prin care


orice subtip
pastreaza toate caracteristicile tipului din care face parte. In
particular
un obiect A de un subtip dat poate fi utilizat ca parametru actual
in
chemarea unei proceduri de cate ori a fost mentionat ca parametru
formal un
obiect B de tipul din care face parte subtipul obiectului A.

4. Redefiniri (overriding) si constructii ulterioare (late binding).


Corpul unei
metode de un tip dat pot fi redefinite in orice moment in oricare
din
subtipurile sale dar pastrand acelasi nume. Interpretarea se face
in momentul
executiei.

5. Notiunea de polimorfism. Polimorfismul permite ca un obiect sa fie


creat ca
element al unei multimi de tipuri. Se pot face mutari ale unui
obiect de la
un tip la altul.

Tipurile si ereditatile sunt instrumente puternice in modelarea


lumii reale permitand si extinderea sistemelor. Se obtine o
administrare simpla atat a datelor cat si a programelor. Programarea
devine mult mai usor de facut.

O trasatura fundamentala a sistemelor de baze de date orientate


obiect este data de modul in care se stabilesc relatiile intre
obiecte, stabilindu-se criterii de clasificare. O clasa reprezinta o
multime de obiecte cu proprietati comune. Relatia de apartenenta este
o relatie care poate sa fie stabilita intre un obiect a si o clasa
care ar putea sa il contina pe a ca element. Se pot stabili relatii
de diferite tipuri si intre clase. Foarte importante sunt relatiile
de interdependenta care stabilesc o multime de relatii ce au loc in
raport cu o colectie de clase. De exemplu, disjunctia este relatia de
interdependenta care stabileste ca doua sau mai multe clase nu au
elemente in comun.

4.1. Sistemul VISION

Sistemul VISION este o combinatie intre limbajele de programare


si sistemele de baze de date orientate obiect fiind dezvoltat de
Innovative Systems Techniques. Acest sistem aplica doua principii de
baza: ortogonalitatea componentelor conceptuale si incapsularea
iteratiilor colectiilor.

Notiunea principala utilizata in VISION este cea de colectie


care se defineste ca o asertiune despre un numar specificat de
obiecte distincte numite elementele sale. De exemplu colectia
angajati se poate stabili ca are 100 de elemente. In cazul unei
colectii nu se specifica ce sunt obiectele componente, ce valori au
ele sau ce legaturi au ele cu alte obiecte.

Obiectele sunt constructii ce pot fi numite intr-un program


VISION. In general, o entitate poate fi reprezentata prin mai multe
obiecte ce pot sa apara in colectii diferite. Obiectul descrie un rol
pe care il joaca entitatea in lumea reala si apartine colectiei
rolului respectiv. Obiectele ce descriu rolurile unei entitati sunt
legate prin functia super. Exista o colectie numita object in care
este continut cate un element pentru fiecare entitate modelata de
sistem. Mai sunt si alte colectii predefinite in sistem cum ar fi
real si integer care reprezinta colectia tuturor numerelor reale si
respectiv intregi. Fiecare colectie defineste tipul elementelor sale
indicand mediul lor dar aceasta definire este transparenta
utilizatorului. Utilizatorul poate sa numeasca si sa prelucreze numai
colectii, obiecte si relatii intre ele.

Toate informatiile despre obiectele unei colectii sunt


continute in functii ce reprezinta aplicatii de la o colectie la
alta. Functiile se aplica obiectelor prin intermediul mesajelor avand
sintaxa ca in Smalltalk. Daca x este un obiect din colectia c si f
este o functie definita in c, atunci expresia xf este o aplicatie a
functiei f la obiectul x producand un alt obiect ca valoare.
Parametrii din aplicarea functiei sunt precedati de doua puncte, deci
xf:c se traduce prin aplicarea functiei f la obiectul x cu argumentul
c.

Fiecare colectie are o functie speciala numita super care pune


in corespondenta fiecare obiect dintr-o colectie cu obiectul de care
apartine. Daca super aplica o colectie c1 in colectia c2 atunci c1
este o subcolectie a lui c2 si fiecarui element din c1 ii corespunde
un element din c2. Functiile super luate ca arce determina pe
multimea colectiilor luate ca noduri un arbore generalizat avand
drept radacina colectia object. Daca c1 este o subcolectie a lui c2,
atunci functiile definite in c2 sunt accesibile elementelor lui c1
(ereditate).

Se defineste un arbore de obiecte cu arce date de relatia


suobiect in sensul ca x este un subobiect al lui y daca y = x super.
Fiecare obiect o din colectia object este radacina unui arbore
obiect. Arborele obiect reprezinta toate rolurile posibile jucate de
o entitate. Se numeste superdrum al unui obiect x multimea {x, x
super, x super super, ...} deci o parte a arborelui obiect relevant
pentru x.

In programe colectiile sunt reprezentate prin prototipuri de


obiecte din colectiile respective care sunt tipuri de obiecte
distincte ce sunt create cand se creaza o noua colectie si reprezinta
in program acea colectie. Operatia

!y <-- x specialized

creaza o noua colectie a carui prototip de obiect este y pentru care


y super este x. Prototipurile de obiecte au aceleasi functii ca si
obiectele doar ca nu pot fi enumerate intr-o colectie. Ele pot sa
apara in functii sau in expresii. Daca y este un prototip, atunci
expresia !z <-- y new creaza un nou obiect de tipul lui y, deci
creaza copii pentru fiecare obiect din superdrumul lui y.

Sistemul VISION permite utilizarea functiilor polimorfe care


aplica o colectie in mai multe colectii. Si super poate fi o functie
polimorfa ceea ce asigura neomogenitatea colectiilor.

Crearea unei colectii neomogene se poate face printr-un


constructor explicit de tipul

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

Blocurile se supun lexical regulilor de definire a domeniului


lor putand fi evaluate in momentul definirii sau dinamic prin
intermediul functiei send. De exemplu, expresia gm send:[vanzari]
reconstruieste mediul blocului pentru gm fiind echivalenta cu gm
vanzari. Executia unui bloc este implementata printr-un obiect
context sau mediu. Variabilele locale ale blocului devin proprietati
ale mediului obiectul context trebuind sa fie un subobiect al
obiectului in care este definit blocul. La executia blocului sistemul
creaza o noua colectie continand cate o functie pentru fiecare
variabila locala dupa care extinde obiectul care detine blocul la
aceasta noua colectie si executa corpul blocului in contextul acestor
noi obiecte.

Ultimul context se obtine prin ^current a carei valoare se


schimba la fiecare invocare a blocului. In particular, fiecare
sesiune utilizator are un mediu de definire a sistemului care
serveste ca valoare initiala pentru ^current. Toate variabilele
create intr-o sesiune utilizator sunt chiar functii in ^current
initial. Deci, cu exceptia unor nume de definire sistem cum este si
^current, numele din VISION nu se refera la obiecte ci la functii. De
exemplu expresia gm vanzari este considerata o prescurtare a
expresiei corecte ^current gm vanzari care este o functie.

Din punct de vedere fizic, sistemul VISION contine doua


componente: interpretorul de limbaj si administratorul de obiecte.
Amandoua componentele sunt utilizate la incapsularea iteratiilor,
opereaza pe colectii ca unitati de baza in organizarea calculelor si
a structurilor. Masina virtuala VISION este de tip pipeline cu
executie paralela a functiilor pentru toate obiectele unei colectii.
Obiectele sunt memorate pe proprietati permitand un acces rapid la
informatii si in baze de date mari.

4.2. Limbajul OPAL

Limbajul OPAL a fost produs de GemStone de la Servio Logic


Corporation. Pentru o baza de date relationala descrisa in SQL prin
instructiunile

CURS ( CURS#, TITLU )


PRIMARY KEY ( CURS# )
OFERTA ( CURS#, OF#, DATA, LOCUL )
PRIMARY KEY ( CURS#, OF# )
FOREIGN KEY ( CURS# ) REFERENCES CURS
STUDENT ( CURS#, OF#, ANG#, AN )
PRIMARY KEY ( CURS#, OF#, ANG# )
FOREIGN KEY ( CURS#, OF# ) REFERENCES CURS
FOREIGN KEY ( ANG# ) REFERENCES ANGAJAT
PROFESOR ( CURS#, OF#, ANG# )
PRIMARY KEY ( CURS#, OF#, ANG# )
FOREIGN KEY ( CURS#, OF# ) REFERENCES CURS
FOREIGN KEY ( ANG# ) REFERENCES ANGAJAT
ANGAJAT ( ANG#, NUME, FUNCTIE )
PRIMARY KEY ( ANG# )

se poate face o descriere in limbajul OPAL de forma urmatoare:

SET SUBCLASS : 'ASET'


CONSTRAINTS : ANGAJAT .
SET SUBCLASS : 'CSET'
CONSTRAINTS : CURS .
SET SUBCLASS : 'OSET'
CONSTRAINTS : OFERTA .
SET SUBCLASS : 'SSET'
CONSTRAINTS : STUDENT .
SET SUBCLASS : 'PSET'
CONSTRAINTS : PROFESOR .
OBJECT SUBCLASS : 'ANGAJAT'
INSTVARS : # [ 'ANG#', 'NUME', 'FUNCTIE' ]
CONSTRAINTS : # [ # [ # ANG#, STRING ] ,
[ # NUME, STRING ] ,
[ # FUNCTIE, STRING ] ] .
OBJECT SUBCLASS : 'CURS'
INSTVARS : # [ 'CURS#', 'TITLU', 'OFERTE' ]
CONSTRAINTS : # [ # [ # CURS#, STRING ] ,
[ # TITLU, STRING ] ,
[ # OFERTE, OSET ] ] .
OBJECT SUBCLASS : 'OFERTA'
INSTVARS : # [ 'OF#', 'DATA', 'LOCUL', 'STUDENTI',
'PROFESORI' ]
CONSTRAINTS : # [ # [ # OF#, STRING ] ,
[ # DATA, DATETIME ] ,
[ # LOCUL, STRING ] ,
[ # STUDENTI, SSET ] ,
[ # PROFESORI, PSET ] ] .
OBJECT SUBCLASS : 'STUDENT'
INSTVARS : # [ 'ANG', 'AN' ]
CONSTRAINTS : # [ # [ # ANG, ANGAJAT ] ,
[ # AN, STRING ] ] .
OBJECT SUBCLASS : 'PROFESOR'
INSTVARS : # [ 'CURSURI' ]
CONSTRAINTS : # [ # [ # CURSURI, CSET ] ] .

Pentru a incarca in baza de date informatiile despre angajati


mai intai se creaza obiectul cu instructiunea

ANGAJATI := ASET NEW .

apoi se defineste o metoda prin care se poate insera un nou angajat


prin

1. METHODE : ASET
2. ADD_ANG# : ANG#_PARM ADD_NUME : NUME_PARM ADD_FUNCTIE :
FUNCTIE_PARM
3. | ANG_TUPLE |
4. ANG_TUPLE := ANGAJAT NEW .
5. ANG_TUPLE SET_ANG# : ANG#_PARM ,
6. SET_NUME : NUME_PARM ,
7. SET_FUNCTIE : FUNCTIE_PARM .
8. SELF ADD: ANG_TUPLE .
9. %

Liniile 1 si 9 reprezinta respectiv inceputul si sfarsitul unei


metode ce se refera la clasa ASET. Linia 2 defineste trei parametrii
ADD_ANG#, ADD_NUME si ADD_FUNCTIE utilizate in mesaje. Linia 3
defineste o variabila locala ANG_TUPLE careia i se atribuie in linia
4 ID-ul unui nou element de tip ANGAJAT. In liniile 5-7 se trimit
mesaje la acest nou element prin care se specifica trei metode
(SET_ANG#, SET_NUME si SET_FUNCTIE) cu cate un parametru pentru
fiecare (respectiv ANG#_PARM, NUME_PARM si FUNCTIE_PARM). Linia 8
trimite un mesaj la SELF care este o variabila speciala ce reprezinta
obiectul caruia i se aplica metoda definita careia i se aplica metoda
predefinita ADD prin care se insereaza obiectul identificat de
EMP_TUPLE in obiectul identificat de SELF.

Informatiile (S3, Popescu, secretar) se pot insera cu comanda

ANGAJATI ADD_ANG# : 'S3' ,


ADD_NUME : 'Popescu' ,
ADD_FUNCTIE : 'secretar' .

De obicei, pentru fiecare obiect v in parte se construieste o


pereche de metode de tip GET_v care returneaza valoarea lui v
obiectului care trimite mesajul si SET_v care modifica valoarea lui v
conform cu valorile specificate de cel care trimite mesajul. Astfel
de metode sunt SET_ANG#, SET_NUME si SET_FUNCTIE utilizate mai sus.
Inserari in obiectele CURS si OFERTA se fac asemanator. La
inserarea in obiectele STUDENT si PROFESOR se apeleaza crearea unui
element de tip ANGAJAT care se leaga de noile elemente introduse in
STUDENT si PROFESOR.

Regasirea informatiei se poate exprima relativ simplu. De


exemplu, pentru a determina care cursuri 'C5' se tin in Bucuresti se
poate folosi succesiunea de instructiuni

1. | CURS_C5 , C5_OF , C5_BUC_OF |


2. CURS_C5 := CURSURI DETECT : [ :CX | 'C5' = CX GET_CURS# ] .
3. C5_OF := CURS_C5 GET_OFERTE .
4. C5_BUC_OF := SELECT : [ :OX | 'Bucuresti' = OX GET_LOCUL ] .
5. ? C5_BUC_OF .

Linia 1 declara trei variabile locale: CURS_C5 folosita pentru


a contine ID-ul lui C5, C5_OF folosita pentru a contine ID-ul
obiectului ce da multimea ofertelor pentru cursul C5 si C5_BUC_OF
folosit pentru a contine ID-ul rezultatului. In linia 2 se trimite un
mesaj la obiectul CURSURI prin care se cere aplicarea metodei DETECT
avand ca argument blocul de cod cuprins intre paranteze drepte.
Argumentele de forma [ :x | p(x) ] unde x este o variabila ce ia
valori intr-un domeniu pe care se defineste DETECT si p(x) este un
predicat face ca rezultatul aplicarii lui DETECT sa fie un ID
corespunzator primului element x intalmit care face p(x) adevarata.
In linia 3 se atribuie ID-ul pentru multimea ofertelor cursului C5
variabilei C5_OF. Linia 4 este asemanatoare cu linia 2 doar ca SELECT
da toate elementele si nu numai primul ca DETECT. Linia 5 produce
afisarea rezultatului.

In OPAL se pot efectua ciclarii prin constructii de forma

obiect DO : [ :x | bloc-cod ]

unde x este o variabila ce parcurge multimea elementelor obiectului


indicat si pentru fiecare valoare a sa se executa pe rand bloc-cod in
care de obicei se folosesc metode de tipul GET_v, SET_v, IFTRUE,
IFFALSE si altele.

Stergerea obiectelor se face cu metoda REMOVE. De exemplu,


stergerea angajatului A3 din multimea angajatilor identificati cu
variabila ANGAJATI se face prin instructiunea

ANGAJATI REMOVE : DETECT : [ :AX | 'A3' = AX GET_ANG# ] .

Modificarile se fac la fel ca si operatiile de regasire doar ca


in locul metodelor GET_v se folosesc metodele SET_v.

5. Baze de cunostinte

Bazele de cunostinte sunt intalnite in literatura de


specialitate sub diferite denumiri cum sunt: baze de date logice,
baze de date inferentiale, sisteme expert, sisteme deductive,
prelucrare recurenta si altele. In aceste sisteme diferitele tupluri
ale relatiilor sunt interpretate ca axiome iar cererile sunt
interpretate ca teoreme, raspunsul la cerere fiind considerat ca o
demonstratie. Aceasta interpretare permite o uniformitate de
reprezentare (baze de date, axiome deductive, cereri si constrangeri
de integritate sunt reprezentate la fel), uniformitate de operare
(raspunsul la cereri, optimizarea cererilor, proiectarea bazelor de
date, demonstrarea corectitudinii programelor sunt privite la fel),
modelare semantica (evenimente, tipuri de ierarhii si combinatii de
entitati), aplicatii extinse si altele.

Bazele de cunostinte permit interpretarea unor cereri din


limbajele naturale. Printre altele ele contin copii ale unor tabele
din catalogul bazei de date, tabele ce contin valorile datelor ce
sunt utilizate frecvent, o multime de reguli de transformare a
frazelor ce permite unele substituirea automata a unor subexpresii si
un lexicon ce contine un tabel ce defineste cuvinte din limba
naturala ce pot fi utilizate in cereri care pot fi legate de baza de
date (nume de tablouri si atribute) sau cuvinte generale.

Baza de cunostinte se initiaza prin construirea lexiconului si


a altor parti componente si se complecteaza in timp de catre
utilizatori sau automat pe baza informatiilor obtinute in exploatare.

In bazele de cunostinte sunt aplicate rezultatele din calculul


propozitiilor si calculul predicatelor. Pe baza transformarilor
logice se incearca demonstrarea unor asertiuni tinand seama de
axiomele din logica matematica si de informatiile continute in
sistem.

Prin axioma deductiva sau regula de inferenta se intelege o


regula prin care se pot deduce unele fapte plecand de la o multime de
fapte date. Axiomele deductive pot fi reprezentate in bazele de date
sub forma unor vederi.

Pentru a demonstra o asertiune de forma

f1,f2,...,fn |- g

unde f1,f2,...,fn sunt premizele si g este concluzia de obicei se


foloseste medoda reducerii la absurd demonstrand ca formula

f1 & f2 & ... & fn & non g

este falsa. Aceasta se face transformand formula precedenta prin


proprietatile existente in algebra logicii intr-o formula echivalenta
normal conjunctiva de forma

u1 & u2 & ... & um

in care fiecare ui (i=1,...,m) este o disjunctie de atomi eventual


precedati de "non". Se listeaza termenii formulei precedente
u1,u2,...,um si se deriveaza in continuare alti termeni aplicand
legea rezolutiei

|= (( f V g) & ( non g V h )) ==> ( f V h )

Daca printre termenii derivati apare multimea vida (termenul "fals")


atunci asertiunea initiala este adevarata, altfel (cand nu mai pot fi
generati alti termeni) aserfiunea este falsa.

Exemplul 7. . Pentru a demonstra asertiunea


A ==> ( B ==> C ), NOT D OR A, B |- D ==> C

unde A,B,C si D sunt formule, se pleaca de la formulele

A ==> ( B ==> C )
NOT D OR A
B
NOT ( D ==> C )

care aduse la forma normal conjunctiva dau formulele

(1) NOT A OR NOT B OR C


(2) NOT D OR A
(3) B
(4) D
(5) NOT C

Aplicand rezolutia pentru formulele (1) si (2) in raport cu A se


obtine

(6) NOT D OR NOT B OR C

apoi pentru formulele (6) si (3) in raport cu B se obtine

(7) NOT D OR C

pentru formulele (7) si (4) in raport cu D se obtine

(8) C

si pentru formulele (8) si (5) in raport cu C se obtine formula vida


notata [] ceea ce demonstreaza ca asertiunea facuta este adevarata.

Cererile pentru bazele de cunostinte pot fi exprimate sub forma

A1 AND A2 AND ... AND Am ==> B1 OR B2 OR ... OR Bn

unde A1,...,Am si B1,...,Bn sunt de forma r(x1,x2,...,xt) cu r


predicat cu argumentele x1,...,xt.

Pentru m = 0 si n = 1 expresia se reduce la un singur predicat

r ( x1, x2, ..., xt )

Daca toate argumentele sunt constante, predicatul reprezinta o axioma


de baza si este o propozitie adevarata. In termeni de baze de date
tuplul (x1,...,xt) este unul din tuplurile existente intr-o relatie R
din baza de date. In acest caz predicatul r afirma ceva in
concordanta cu intelesul pe care il are relatia R.

Pentru m > 0 si n = 1 se obtine clauza

A1 AND A2 AND ... AND Am ==> B

care poate fi privita ca o axioma deductiva. Aceasta da o definitie


(partiala) a predicatului din partea dreapta a implicatiei in functie
de predicatele din partea stanga. Aceasta poate fi privita si ca o
constrangere de integritate.
Vederile unei baze de date pot fi privite ca modele teoretice.
In aceste modele domeniile de baza contin valori sau constante ce pot
sa descrie anumite obiecte ale lumii reale, acestea formand universul
contextului. Relatiile de baza reprezinta o multime de predicate sau
formule deschise ce urmeaza sa fie interpretate in acel univers.
Fiecare tuplu al unei relatii reprezinta o particularizare a
predicatului corespunzator (formula inchisa - fara variabile) care
are valoarea adevarat pentru universul respectiv. Constrangerile de
integritate sunt tot formule inchise interpretabile pe acelasi
univers. Tuplurile si constrangerile de integritate pot fi privite ca
formand multimea axiomelor ce definesc o anumita "teorie logica".
Baza de date poate fi privita ca multimea tuturor teoremelor ce se
pot demonstra pornind de la axiome. Evaluarea cererilor se face
analog cu demonstrarea teoremelor.

Ca axiome ale unei baze de date pot fi considerate urmatoarele:

1. Axiomele de baza corespund tuplurilor relatiilor de baza,


ele definind ceea ce se denumeste baza de date extinsa (extensional
database - EDB).

2. O axioma de completitudine pentru fiecare relatie prin care


se afirma ca nu exista alte tupluri decat cele ce apar efectiv in
relatia respectiva. Aceasta se mai numeste presupunerea de inchidere
(Closed World Assumption - CWA) prin care se considera false
asertiunile pentru tuplurile ce nu apar in relatie.

3. Axioma "numelui unic" prin care se afirma ca fiecare


constanta se distinge de toate celelalte constante (are nume unic).

4. Axioma "inchiderii domeniului" prin care se afirma ca nu


exista alte constante in afara de cele existente in domeniile bazei
de date.

5. O multime de axiome (standard) prin care se defineste


predicatul "=".

Un sistem deductiv de baze de date este un SGBD care permite


construirea vederilor cu demonstrare teoretica si care este capabil
in particular sa deduca fapte suplimentare din baza de date existenta
aplicand axiome deductive sau reguli de inferenta la aceste fapte.
Axiomele deductive impreuna cu constrangerile de integritate formeaza
ceea ce se numeste continutul intern al bazei de date (intensional
database - IDB) si acesta impreuna cu extinderea bazei de date
formeaza baza de date deductiva (deductive database).

Un limbaj in care se pot exprima asertiuni si cereri pentru


baza de date este Datalog (analog cu Prolog) in care instructiunile
sunt de forma

B <== A1 AND A2 AND ... AND An

unde B este concluzia (capul) si A1,...,An sunt premizele (corpul),


ele fiind predicate nenegate ce contin numai constante si variabile.
Daca in loc de B se pune "?" se face afisarea rezultatului obtinut
prin expresia din partea dreapta.

In acest limbaj pot sa apara si definiri recursive. Acestea pot


fi tratate ca in Prolog prin tehnici de unificare si rezolutie. O
alta tehnica numita evaluarea naiva pleaca de la baza de date extinsa
si aplica in mod repetat premizele definitiei pana se obtine
rezultatul concluziei. O imbunatatire a acestei metode, numita metoda
seminaiva de evaluare, evita recalcularea tuplurilor rezultate in
pasii anteriori. O alta metoda, numita filtrarea statica sau
reducerea multimii factorilor relevanti, foloseste informatia din
cerere (concluzie) pentru a modifica premizele putand astfel sa
elimine tuplurile nefolositoare din extensia bazei de date.

6. Exemple