Sunteți pe pagina 1din 48

LIMBAJE DE PROGRAMARE

4.1. EVOLUŢIA LIMBAJELOR DE PROGRAMARE

Limbajele de programare sunt limbaje artificiale folosite în comunicarea dintre om şi calculator.


Evoluţia limbajelor de programare este strâns legată de evoluţia calculatoarelor electronice şi în
mod analog pot fi stabilite mai multe generaţii:

 Limbajele de generația întâia: primele calculatoare nu puteau fi programate decât în limbaj


cod-mașină (limbaj mașină); fiecare procesor avea propriul cod-maşină definit de constructorul
procesorului.
 Limbajele de generația a doua: la începutul deceniului VI din secolul trecut se face un
progres remarcabil: trecerea la programarea simbolică, prin apariţia limbajelor de asamblare;
sunt considerate limbaje de nivel inferior, deoarece depind de calculatorul pentru care sunt
realizate. Apar primele elemente specifice programării simbolice: codurile mnemonice pentru
instrucţiuni şi adresarea simbolică. Au grad de portabilitate redus.
 Limbajele de generația a treia: sunt considerate limbaje de nivel înalt (limbaje procedurale);
după apariţia în 1954 a primelor specificaţii pentru limbajul FORTRAN, numărul limbajelor de
programare creşte rapid, identificându-se în 1969 un număr de 120 de limbaje de programare,
iar numai după trei ani numărul acestora ajunge la 170. Limbajele procedurale (algoritmice)
permit descrierea algoritmilor de rezolvare a problemelor sub forma unei succesiuni de
instrucţiuni care se vor executa în ordinea stabilită de programator. Aceste limbaje pot fi
folosite, teoretic, în orice problemă ce poate fi descrisă algoritmic şi de aceea mai sunt numite
şi limbaje universale.
 Limbajele de generația a patra: limbajele neprocedurale sunt considerate limbaje de nivel
foarte înalt. Aceste limbaje realizează trecerea de la prezentarea modului cum se rezolvă
problema la ce anume se doreşte. Utilizatorul prin programul neprocedural va defini problema
de rezolvat, fără a intra în detaliile specifice soluţiilor algoritmice. În această categorie sunt
incluse limbajele de interogare pentru gestiunea bazelor de date relaţionale.
 Limbajele de generația a cincea: sunt limbajele inteligenţei artificiale. Fac parte din această
clasă limbajele logice şi limbajele de gestiune a bazelor de cunoştinţe utilizate în realizarea
sistemelor expert.

Există mai multe încercări de clasificare a limbajelor de programare. Unii autori consideră
semnificative două clase: limbajele procedurale şi limbajele neprocedurale. În clasa limbajelor
neprocedurale ar intra şi limbajele specializate (orientate pe problemă), de exemplu limbajele
de simulare (GPSS, SIMULA, SYMSCRIPT etc.). Există limbaje specializate, de exemplu: sistemele
software specializate pentru calcul numeric (MATLAB, MATHCAD, MATHEMATICA, MAPLE etc.),
sistemele software specializate pentru calcule statistice (SPSS, STATISTICA, etc.), care conţin şi

1
elemente de limbaj procedural prin care utilizatorul poate interveni în descrierea algoritmului
de rezolvare a problemei.

Prezentăm în continuare principalele momente istorice în apariţia limbajelor de programare.

(1956) FORTRAN – FORmula TRANslation


Este un limbaj procedural construit pentru calcule ştiinţifice. Primul compilator FORTRAN a fost
dezvoltat pentru IBM 704 în 1954–1957 de o echipă IBM condusă de John W. Backus. Au apărut
numeroase standarde ale limbajului: FORTRAN II în 1958, FORTRAN IV în 1961, FORTRAN 66 în
1966, FORTRAN 77 în 1977 , FORTRAN 90 în 1990, FORTRAN 95 în 1995, și FORTRAN 2003 în
anul 2003. Cele mai recente versiuni includ suport pentru programarea orientată obiect. Larga
lui utilizare în lumea ştiinţifică a anilor 1960-1990, datorată unor puternice biblioteci de
subprograme matematice, a condus la celebra butadă “Ce nu poate fi programat în Fortran nu
merită să fie programat”.

(1958) ALGOL – ALGOrithmic Language


Este un limbaj orientat pentru probleme ştiinţifice, dezvoltat de un grup al European and
American Computer Scientists în 1958 la Universitatea Tehnică din Zürich şi are o mare influenţă
în dezvoltarea altor limbaje de programare: FORTRAN, LISP, COBOL. Cunoaşte 3 specificaţii
majore: ALGOL 58 – propus la început să se numească IAL (International Algebraic Language),
ALGOL 60 (implementat în anul 1960) şi ALGOL 68 (în anul 1968). Este primul limbaj de
programare la care apare o definire riguroasă a descrierii limbajului utilizând formalismul BNF
(Backus-Naur Form).

(1960) COBOL – COmmon Business Oriented Language


Este un limbaj procedural, dezvoltat la iniţiativa comună a guvernului american şi a sectorului
privat, orientat spre probleme de gestiune economică. COBOL a fost creat pentru a îndeplini
două obiective majore: portabilitatea (capacitatea programelor de a fi utilizate pe calculatoare
provenind de la producători diferiţi, necesitând modificări minime) şi lizibilitatea (asemănarea
dintre limbajul folosit de calculator şi limba engleză propriu-zisă). Studii recente arată că
limbajul de programare Cobol, în noile versiuni, ar putea realiza o revenire importantă – în
prezent există aplicaţii web scrise în Cobol şi în viitor ar putea rezida în cloud.

(1965) PL / I – Programming Language no. I


Comapniile IBM şi Share şi-au pus problema dezvoltării unui limbaj de programare care să
trateze atât probleme ştiinţifice cât şi probleme economice. Se doreşte contopirea limbajelor
FORTRAN, ALGOL şi COBOL într-unul singur care să le includă pe cât posibil. Este un limbaj de
nivel înalt, conceput să fie, pe cât posibil, independent de calculator. Nu a avut succesul de
piaţă scontat, cei care lucrau în domeniul ştiinţific nu au renunţat la FORTRAN, iar cei din
domeniul economic nu au abandonat aplicaţiile funcţionale realizate în COBOL.

(1965) BASIC – Beginner’s All purpose Symbolic Instruction Code


Creat de John G. Kemeny și Thomas E. Kurtz la Dartmouth College, limbajul BASIC este
considerat de unii autori ideal pentru începători. Nu suntem de acord cu această afirmaţie,

2
deoarece structurile de control existente nu permit aplicarea principiilor programării
structurate, iar folosirea în exces a instrucţiunii de salt necondiţionat GOTO poate genera un stil
de programare necorespunzător. Alte variante sunt QBasic, GWBasic, Basic2 şi altele. O
variantă evoluată de BASIC este Visual Basic, creată de către compania Microsoft şi care se
adresează programatorilor mai avansați. Limbajul Visual Basic permite crearea de aplicații
relativ complexe prin manipularea componentelor vizuale (grafice) ale programelor.

(1971) PASCAL
Limbajul Pascal a fost dezvoltat de Niklaus Wirth de la Universitatea Tehnică din Zürich. A fost
denumit astfel în onoarea matematicianului, fizicianului şi filosofului francez Blaise Pascal
(1623-1662), care construieşte în 1642 un calculator mecanic numit Pascaline. Limbajul Pascal
permite programarea structurată, este apropiat de limbajul natural (limba engleză) şi are o
sintaxă simplă. Deoarece este foarte asemănător limbajului algoritmic, prin formarea unui mod
de gândire structurat, devine un instrument important de comunicare în mediul universitar.
Limbajul Pascal este un limbaj de programare procedural imperativ. Cele mai populare
implementări ale acestui limbaj au fost Turbo Pascal și Borland Pascal, ambele ale firmei
Borland. Profesorul Niklaus Wirth a sintetizat în următoarea ecuaţie conceptul de program scris
într-un limbaj de programare procedural imperativ : algoritmi + structuri de date = programe.

(1972) C
A fost dezvoltat în Laboratoarele Bell de către Denis Ritchie pentru a avea un limbaj simplu și
portabil pentru scrierea sistemului de operare UNIX. Limbajul operează în strânsă legătură cu
hardware-ul, fiind cel mai apropiat de limbajul de asamblare, față de majoritatea celorlalte
limbaje de programare. Sintaxa limbajului C a stat la baza multor limbaje create ulterior: C++,
Java, JavaScript.

(1979) ADA
Numele limbajului este dat în memoria primei femei programator din lume, Augusta Ada Byron,
contesă de Lovelace, fiica lordului Byron și asistenta lui Charles Babbage. Ideea realizării acestui
limbaj este dată de constatarea că în Departamentul Apărării a SUA erau implementate în
deceniul opt peste 450 de limbaje de programare, inclusiv “dialecte” şi variante. Proiectul vast,
costisitor şi ambiţios de a construi “un PL/I al anilor ’80” a condus la realizarea şi standardizarea
limbajului ADA pentru a fi utilizat în aplicaţiile software ale Penatgonului. Limbajul a fost
proiectat pornind de la limbajul Pascal, este orientat spre programare modulară, are o mare
elasticitate în ceea ce privește tipurile de date şi aduce o abordare nouă pentru tratarea
excepțiilor program. Implementările pe diverse arhitecturi sunt însoțite și de instrumente de
ingineria programării. Aşteptarea ca limbajul ADA să devină unul din principalele limbaje de
programare utilizate în mod curent, la fel ca şi în cazul limbajului PL/I, nu s-a realizat.

(1983) C++
A fost realizat de Bjarne Stroustrup la Bell Labs ca o serie de îmbunătățiri ale limbajului C. Este
un limbaj procedural care permite programarea orientată pe obiecte. Devine unul dintre cela
mai populare limbaje de programare. Limbajul de programare C++ a fost standardizat în 1998.

3
(1989) SQL – Structured Query Language
SQL este un limbaj de programare neprocedural bazat pe algebra relaţională, pentru
manipularea datelor în sistemele de gestiune a bazelor de date relaționale. Permite inserarea
datelor, actualizarea și ștergere, modificarea și crearea schemelor, controlul accesului la date şi
formularea interogărilor. A devenit un standard în domeniu, fiind cel mai popular limbaj de
interogare utilizat în SGBD-urile relaționale.

Din clasa limbajelor de simulare amintim:


(1961) GPSS – General Purpose Simulation System
Limbajul GPSS, realizat de Geoffrey Gordon (iniţial s-a numit Gordon's Programmable
Simulation System), permite simularea sistemelor dinamice discrete. Sistemul este modelat cu
ajutorul unor tranzacţii care trec de la un bloc la altul. Limbajul este bazat pe ceasul simulării cu
creştere variabilă, iar translatarea se face în modalitate interpretativă. O versiune modificată
este limbajul SIMUB (limbajul de SIMulare al Universitaţii Bucureşti), realizat în cadrul Centrului
de Calcul al Universităţii din Bucureşti în anul 1977.

(1967) SIMULA – SIMulation LAnguage


A fost dezvoltat la Norwegian Computing Center din Oslo de către Ole-Johan Dahl şi Kristen
Nygaard. Iniţial, versiunea SIMULA I a fost prezentată ca o extensie a limbajului Algol 60 pentru
descrierea reţelelor de evenimente discrete. Varianta SIMULA 67 introduce conceptele de
obiect, clasă, subclasă, metode virtuale, simularea evenimentelor discrete. Limbajul SIMULA
este considerat primul limbaj de programare orientat obiect.

Din clasa limbajelor inteligenţei artificiale amintim:


(1958) LISP – LISt Processing
LISP este cel de-al doilea ca vechime limbaj de programare de nivel înalt; doar limbajul
FORTRAN este mai vechi. A fost creat la Massachusetts Institute of Technology (MIT) de către
John McCarthy. LISP este un limbaj de programare funcțional, conceput inițial ca un model de
calcul (asemănător celui construit de Alan Turing), a devenit limbajul cel mai folosit la crearea
aplicațiilor de inteligență artificială. Programarea funcţională are la bază pe noţiunea de
funcțională sau funcție de nivel înalt, o funcție care poate accepta ca argument sau returna ca
valoare o altă funcție. Programul este văzut ca o funcţie, care se obţine din compunerea mai
multor funcţii simple, fie funcţii sistem, fie definite de utilizator.

(1973) PROLOG – PROgramming LOGical


Limbajul PROLOG este un limbaj specific inteligenței artificiale. A fost realizat la Universitatea
din Marsilia de Alain Calmaureur. Este utilizat la demonstrarea automată a teoremelor,
realizarea sistemelor expert şi a jocurilor.

Din clasa sistemelor software specializate pentru calcul numeric amintim:


(1979) MATLAB - MATrix LABoratory
MATLAB este un mediu de dezvoltare pentru calcul numeric și analiză statistică dezvoltat iniţial
de Cleve Moler de la Universitatea din New Mexico. Limbajul permite lucrul cu matrice,
reprezentări grafice în 2-D şi 3-D, implementarea algoritmilor, realizarea de calcule simbolice.

4
Un pachet adițional, Simulink, oferă posibilitatea de a realiza modele matematice de simulare
pentru sistemele dinamice.

(1986) MATHCAD – MATHematics Computer Aided Design


MathCAD1 este un produs software al firmei MathSoft Inc., Cambridge, Massachusetts realizat
de Allen Razdow de la Massachusetts Institute of Technology (MIT) şi cofondator al firmei
MathSoft. Este un produs de tipul CAD (Computer Aided Design) destinat rezolvării problemelor
de calcul numeric cu aplicaţii în cele mai variate domenii. Versiunile mai noi permit şi realizarea
de calcule simbolice.

Limbajele apărute după 1990, sunt în general legate de dezvoltarea noilor tehnologii web, a
aplicaţiilor pe Internet.
(1995) JAVA
Java este un limbaj de programare orientat-obiect. A fost dezvoltat de către James Gosling la
Sun Microsystems (în prezent filială Oracle). În Java sunt realizate multe aplicaţii web, iar noile
evoluţii tehnologice permit utilizarea sa şi pe dispozitivele mobile. Un program Java compilat,
corect scris, poate fi rulat fără modificări pe orice platformă pe care este instalată o mașină
virtuală JVM (Java Virtual Machine). Are un mare nivel de portabilitate datorită modalităţii de
translatare în două faze, care va fi prezentată în paragraful următor.

ASP - Active Server Pages


ASP este un limbaj de programare folosit pentru a construi site-uri web cu conţinut dinamic,
putând interacţiona cu diferite baze de date. ASP este dezvoltat de Microsoft şi este legat de
sistemul Windows şi de serverul web Microsoft Internet Information Services Web Server (IIS).
Se prezintă ca o tehnologie foarte bine suportată, bazându-se pe comunitatea de dezvoltatori
Microsoft. ASP este gratuit numai dacă este folosit un server Windows care are deja liceanţă.
PHP - Personal Home Pages
PHP, la fel ca şi ASP, este un limbaj de programare folosit pentru a construi site-uri web cu
conţinut dinamic, ce pot interacţiona cu diferite baze de date. PHP a fost creat de Rasmus
Lerdorf şi poate funcţiona atât pe servere Unix şi Linux cât şi pe sisteme Microsoft. Limbajul are
o mare popularitate printre programatori, prin sintaxa relativ simplă, un set foarte mare de
funcţii şi prin faptul că este complet gratuit. Este portabil pe orice platformă. Se integrează cu
toate serverele web indiferent de sistemul de operare utilizat.

(1989) HTML – Hyper Text Markup Language


HTML nu este un limbaj de programare. HTML este un limbaj universal de marcare a textului,
interpretat de browsere şi se foloseşte pentru elaborarea diferitelor documente text cu link-uri
şi elemente multimedia – pagini web, prezentări etc. Este dezvoltat de Tim Berners-Lee la CERN
(Centrul European de Cercetări Nucleare de la Geneva) pentru facilitarea accesului rapid la
informaţiile tehnice cuprinse în manualele de utilizare a calculatoarelor. Un document HTML
este un fişier text (ASCII) care conţine descrieri recunoscute de programele de navigare pe

1
Prima lucrare în limba română apare în 1994 la Editura Tehnică - MathCAD Prezentare şi probleme
rezolvate, autori Ernest Scheiber şi Dorin Lixăndroiu.

5
Internet. Aceste fişiere pot fi create utilizând orice editor de texte, afişate şi modificate pe orice
calculator cu orice sistem de operare.

4.2. REZOLVAREA UNEI PROBLEME CU CALCULATORUL

Rezolvarea unei probleme cu calculatorul presupune adaptarea algoritmului de rezolvare a


problemei sub forma unor comenzi sau indicaţii transmise spre execuţie calculatorului.
Descrierea succesiunii acestor operaţii care reprezintă procesul de calcul se numeşte program.
Prin program este transmis calculatorului algoritmul de rezolvare al problemei. Limbajul de
programare descrie regulile de realizare ale unui program.

Limbajul de programare apare ca un intermediar între sistemul real în care a apărut problema
de rezolvat şi sistemul de calcul. În această idee, fiecare element al limbajului de programare
trebuie văzut simultan din două puncte de vedere:
- logic (punctul de vedere al problemei), adică ce reprezentăm din problemă cu ajutorul
elementului din limbaj;
- fizic (punctul de vedere al implementării), adică ce realizează calculatorul la execuţia
elementului din limbaj.

Pentru rezolvarea unei probleme cu calculatorul se construieşte un model care apoi va fi


simulat pe calculator. Ce cuprinde acest proces este redat schematic în figura 4.1.

Utilizarea unui program scris într-un limbaj de programare de nivel înalt devine posibilă prin
activarea unui program de translatare (program de traducere) care traduce şi converteşte în
una sau mai multe etape programul iniţial, într-un limbaj de nivel inferior acceptat de
calculatorul pe care se doreşte execuţia programului.

Problema

modelare

Algoritmul
problemei

limbaj de programare

Program

Figura 4.1. De la problemă la program

6
Translatarea se poate realiza în 3 moduri:
 modalitatea compilativă – translatarea este efectuată înaintea execuţiei de un program
specializat numit compilator; programul scris în limbaj sursă (program sursă) este
tradus într-un program obiect echivalent cu cel iniţial ce poate fi executat direct
de procesor. Avantaj: execuţie rapidă. Dezavantaj: programul obiect (executabil)
obţinut în urma compilării într-un format de nivel scăzut (cod maşină) nu poate fi
rulat decât pe platforma pe care a fost compilat.
Exemple de limbaje cu compilator: Pascal, C,...
 modalitatea interpretativă - translatarea este efectuată în cursul procesului de execuţie de
un interpretor. Fiecare instrucţiune din programul sursă este interpretată
(tradusă) şi executată. De exemplu, în cazul unei instrucţiuni de ciclare
interpretarea este repetată la fiecare reluare a ciclului. Avantaj: simplitate.
Dezavantaj: viteza de execuţie redusă.
Exemplu de limbaj cu interpretor: Basic.
 modalitatea translatării în două faze – în prima fază programul sursă este tradus într-un cod
intermediar (cod de octeţi) care apoi este rulat pe o maşină virtuală. Prima fază
corespunde compilării, iar cea de-a doua fază corespunde interpretării codului
de octeţi generat, care este asemănător codului scris într-un limbaj de
asamblare. De aici, avantajul acestui cod care este interpretat în mediul de
execuţie al limbajului de programare şi poate fi rulat pe orice platformă care
foloseşte acest mediu.
Exemplu de limbaj cu translatare în două faze (compilare şi interpretare): Java cu
mediu de execuţie maşina virtuală Java (JVM). JVM interpretează codul
precompilat şi îl va rula sub forma unei aplicaţii.

Pentru a înţelege semnificaţia termenilor utilizaţi în continuare şi a legăturii limbaj natural –


limbaj de programare (limbaj artificial), reamintim câteva definiţii legate strict de studiul
limbajelor naturale (conform Dicţionarului encicopedic, Editura Enciclopedică, Bucureşti, 1993-
2009):
Gramatică := disciplină a lingvisticii al cărei obiect de studiu îl constituie structura gramaticală a
unei limbi date; ansamblu de reguli privitoare la modificarea formei cuvintelor şi la
îmbinarea lor în propoziţii şi fraze.
Lexic := vocabular.
Vocabular := totalitatea cuvintelor unei limbi.
Semantică := ramură a lingvisticii care studiază sensurile cuvintelor şi evoluţia acestor sensuri.
Sintactică := (adjectiv) privitor la sintaxă, care aparţine sintaxei.
Sintaxă := parte a gramaticii care studiază funcţiile cuvintelor şi ale propoziţiilor în vorbire şi
care stabileşte regulile de îmbinare a cuvintelor în propoziţii şi a propoziţiilor în frază.

7
4.3. COMPILATOARE

În cazul existenţei unui program de translatare (compilator) execuţia unui program scris în
limbaj de programare (program sursă) presupune într-o primă etapă compilarea programului,
urmată de lansarea în execuţie.

Datele de intrare

Program Compilator Program Rezultate


sursă obiect

Figura 4.2. Execuţia unui program în modalitate compilativă

Compilatorul este un program complex, care realizează printr-un şir de transformări succesive
trecerea programului sursă în program obiect.

Pentru a înţelege conceptul de compilator şi fazele procesului de compilare, definim:


Entitatea (token) := o succesiune de simboluri, utilizate în scrierea programelor sursă şi căreia i
se asociază o definiţie sintactică. Informaţia relativă la entităţile unui program este memorată
sub forma unor tabele în care apare tipul entităţii, denumirea în program a entităţii, adresa
(pointer). În limbajele de programare se consideră entităţi: identificatorii, constantele, cuvintele
cheie, operatorii etc.

În figura 4.3 se prezintă modelul unui compilator, din care rezultă fazele procesului de
compilare.

8
Programul sursă

Analiza lexicală

Şir de entităţi
Analiza
Analiza sintactică erorilor
Arbore sintactic
Gestiunea
tabelelor Analiza semantică

Cod intermediar

Optimizarea de cod

Generarea de cod

Programul obiect

Figura 4.3. Modelul unui compilator

1) Analiza lexicală este realizată de analizorul lexical, parte a compilatorului, care admite
la intrare şirul simbolurilor din programul sursă şi produce la ieşire un şir de entităţi.
2) Analiza sintactică este realizată de analizorul sintactic, parte a compilatorului, care
admite la intrare şirul entităţilor furnizate de analizorul lexical şi produce la ieşire o
reprezentare a structurii sintactice (expresii, liste, instrucţiuni, proceduri etc.).
Structurile sintactice identificate sunt plasate într-un arbore sintactic, care reflectă
relaţiile existente între structuri. Analiza sintactică verifică dacă şirul entităţilor este
corect, în sensul respectării definiţiilor sintactice.
3) Analiza semantică este realizată de generatorul de cod, parte a compilatorului, care
admite la intrare reprezentarea structurii sintactice a programului sursă. Prin
parcurgerea arborelui sintactic se extrag informaţii privind apariţia obiectelor
purtătoare de date din program (ex. variabile, proceduri etc.) şi se verifică consistenţa
utilizării lor. Se obţine o translatare a programului sursă în cod intermediar, care este o
succesiune de instrucţiuni simple (similare macroinstrucţiunilor unui limbaj de
asamblare) direct executabile de calculator.
4) Optimizarea codului este realizată de optimizator, parte a compilatorului, care admite
la intrare forma în cod intermediar a programului sursă şi produce la ieşire o transcriere
eficientă a acestuia. Optimizarea constă în eliminarea redundanţelor, a calculelor şi
variabilelor inutile în scopul unei execuţii mai eficiente prin reducerea memoriei
ocupate şi a timpului de execuţie.

9
5) Generarea finală a codului este realizată de asamblor, parte a compilatorului, care
admite la intrare transcrierea eficientă a programului sursă translatat şi produce la
ieşire programul obiect (forma direct executabilă).
6) Gestiunea tabelelor este o colecţie de proceduri ce crează şi actualizează baza de date
cu care se lucrează în diferitele faze ale compilării.
7) Analiza erorilor este o colecţie de proceduri care sunt activate în momentul apariţiei
unei erori în program. În urma detectării sunt transmise utilizatorului mesaje de eroare
pentru a efectua corecţiile necesare şi se revine din eroare, adică, pe cât posibil,
procesul de compilare continuă până la epuizarea textului sursă, astfel încât numărul de
compilări necesare eliminării tuturor erorilor dintr-un program să fie cât mai mic.
Practic, există erori specifice fiecărei faze de compilare.

Observaţie. Modelul de compilator prezentat este o structură conceptuală. Compilatoarele


existente pot prezenta abateri de la acest model, în sensul că unele componente pot lipsi,
funcţiile lor fiind preluate de alte componente.

10
ELEMENTE DE TEORIA LIMBAJELOR FORMALE

Teoria limbajelor formale stă la baza definirii limbajelor de programare şi construcţiei


compilatoarelor.
Considerăm o mulţime finită şi nevidă V, numită alfabet. Elementele acestei mulţimi se numesc
simboluri. Notăm cu N  0 ,1,2 ,... mulţimea numerelor naturale.

Definiţia 4.1. Numim cuvânt peste alfabetul V orice element al mulţimii V    V k .


kN

V reprezintă vocabularul, adică mulţimea tuturor cuvintelor pe V. Orice cuvânt
x  a1a2 ...ak V k , va fi notat a1a2 ...ak , iar k reprezintă lungimea cuvântului, adică numărul
de simboluri din cuvânt. Notăm cu x lungimea cuvântului x. Mulţimea V 0 are un singur
cuvânt, notat cu e şi numit cuvântul vid. Lungimea cuvântului vid este 0 ( e  0 ). Notăm cu
V   V   e .
Exemplu. Dacă V  a , b , atunci V 0  e, V 1  a , b, V 2  aa , ab , ba , bb,....

Definiţia 4.2. Dacă a1a2 ...ar şi b1b2 ... bp sunt două cuvinte, funcţia c : V   V   V  definită
 
prin c a1a2 ...ar , b1b2 ... bp  a1a2 ...ar b1b2 ... bp se numeşte operaţie de concatenare. Avem
evident xy  x  y . Cuvântul vid este elementul neutru pentru operaţia de concatenare.

Definiţia 4.3. Un limbaj formal L este o mulţime de cuvinte pe un alfabet V, adică L  V * .


Pentru un limbaj formal, problema apartenenţei unui cuvânt la limbaj este esenţială şi se
defineşte astfel: dat cuvântul x V , se poate decide dacă x  L sau x  L ? Dacă DA spunem că
L este decidabil.

Tradus în termenii unui limbaj de programare problema apartenenţei constă în a decide dacă
un şir de simboluri din alfabetul limbajului formează un program corect sau nu. Această
problemă trebuie rezolvată de orice compilator.

Pentru a studia un limbaj acesta trebuie specificat într-un anumit mod. Dacă limbajul L este
finit, specificarea se poate face prin enumerarea tuturor cuvintelor limbajului şi atunci, evident,
problema apartenenţei unui cuvînt la limbaj este rezolvată – L este decidabil.
Dacă L este infinit studiul limbajului presupune definirea unor proprietăţi a cuvintelor şi a unor
reguli de formare a propoziţiilor. În acest caz, o metodă de a reprezenta limbajul L este
sistemul generator numit gramatică. Orice cuvânt din L se poate construi prin metode bine
definite, folosind regulile gramaticii, numite şi producţii.

1
O gramatică G pentru un limbaj L foloseşte două mulţimi finite şi disjuncte de simboluri:
VT - simboluri terminale (ireductibile), reprezintă chiar alfabetul V pe care L este definit;
VN - simboluri neterminale (variabile sintactice), sunt folosite în procesul de generare a
cuvintelor limbajului.

O producţie (regulă de deducţie) este o pereche ordonată  ,   unde:


  VN  VT VN VN  VT  , deci α conţine cel puţin un simbol neterminal;
  VN  VT  reprezintă un cuvânt din vocabularul total al limbajului.
Notăm o producţie    şi spunem “  derivă din  ” sau “  generează pe  ”.
Procesul prin care se aplică regulile de deducţie se numeşte derivare.

Definiţia 4.4. O gramatică G este un sistem G  VN ,VT , S , P  , unde:


VN - mulţimea simbolurilor neterminale;
VT - mulţimea simbolurilor terminale;
S – simbolul de start al gramaticii S VN  ;
P – mulţimea finită de producţii (reguli de rescriere) de forma  ,   .

Exemplu
Gramatica G este definită astfel:
G  S , X ,Y ,a , b , c , d, S , P 
unde: VN  S , X ,Y 
VT  a , b , c , d
S VN este simbolul de start
P  S  XY , X  a , X  b ,Y  c ,Y  d .
Relaţiile de derivare directă pot fi extinse la relaţii de derivare în k paşi.
k
Notăm    o derivare de lungime k, formată dintr-un şir de derivaţii:
   1 ,  1   2 ,....,  k1  

Notăm cu    relaţia de derivare generală, care spune că în gramatica G, α generează pe 
G
(sau  derivă din  ) în k  1 paşi.

Definiţia 4.5. Numim forme propoziţionale şirurile derivate din simbolul de start (S) al
gramaticii. Formele propoziţionale alcătuite numai din simboluri terminale se numesc
propoziţii.

Definiţia 4.6. Fie gramatica G  VN ,VT , S , P  . Limbajul generat de gramatica G este format din
  
mulţimea propoziţiilor LG   w | S  w  . Două gramatici sunt echivalente, dacă generează
 G 
acelaşi limbaj.

2
Observaţii. Limbajul generat de o gramatică G este format numai din propoziţii care conţin
simboluri din alfabetul terminal VT . Propoziţiile sunt derivabile din simbolul de start (S).

Exemplu
Fie gramatica G definită astfel:
G  S,a , b, S , P 
unde: VN  S
VT  a , b
S VN este simbolul de start
P  S  aSb , S  ab .
O propoziţie care aparţine lui L(G) este:
3
S  aSb  aaSbb  aaabbb  a 3 b 3 sau notat altfel: S  a 3 b 3


Se poate demonstra că limbajul generat de această gramatică este LG   a n b n | n  1 . 
Noam Chomsky1 introduce în 1959, o clasificare a gramaticilor după forma producţiilor: tipul 1 –
gramatici dependente de context, tipul 2 - gramatici independente de context, tipul 3 –
gramatici regulate. Corespunzător acestor tipuri de gramatici avem clasele limbajelor generate.

Definiţia 4.7. O gramatică G  VN ,VT , S , P  se numeşte independentă de context (context free)
dacă fiecare producţie este de forma A   cu AVN şi   VN  VT  .
Limbajul independent de context, generat de o gramatică independentă de context, reprezintă
modelul utilizat în definirea limbajelor de programare. Se demonstrează că orice limbaj
independent de context este decidabil.

Concluzii. În sensul celor prezentate mai sus, putem spune că un program scris într-un limbaj de
programare este o propoziţie corectă pe un vocabular. Limbajul de programare conţine o
mulţime infinită de propoziţii, care sunt programele realizabile în acest limbaj. Gramatica
limbajului conţine regulile care stabilesc modul de construcţie a propoziţiilor limbajului, adică
regulile care ne permit scrierea programelor.

În general, o formă propoziţională poate fi obţinută prin mai multe derivări considerate
echivalente. Numim derivare stânga, derivarea în care se înlocuieşte la fiecare pas cel mai din
stânga simbol neterminal. Analog, derivarea dreapta se obţine înlocuind la fiecare pas cel mai
din dreapta simbol neterminal.

1
Noam Chomsky (n. 1928, Philadelphia, SUA) este un cunoscut profesor de lingvistică la Massachusetts
Institute of Technology (MIT). Are contribuţii majore în “teoria gramaticii generative” cu aplicaţii directe
în construcţia limbajelor de programare și în domeniul lingvisticii teoretice.

3
Exemplu. Fie gramatica G definită astfel:
G  S,a , , ,( , ) , , S , P 
unde: VN  S
VT  a , , ,( , ) 
S VN este simbolul de start
P  S  S  S , S  S  S , S  S , S  a .

Propoziţia a  a  a L( G ) poate fi obţinută, plecând de la simbolul de start, în două moduri:


 derivare stânga:
S  S  S  a  S  a  S   a  S  S   a  a  S   a  a  a
 derivare dreapta:
S  S  S  S  S   S  S  S   S  S  a  S  a  a  a  a  a

Reprezentarea grafică a derivării poate fi făcută cu ajutorul arborilor de derivare.

Definiţia 4.8. Un arbore de derivare pentru o gramatică G  VN ,VT , S , P  independentă de


context este un arbore aşezat pe niveluri, în care fiecare vârf este etichetat cu elemente din
VN  VT , astfel încât:
a) rădăcina arborelui este etichetată cu S ;
b) vârfurile interioare (care au descendenţi) sunt etichetate cu simboluri neterminale ale
gramaticii, iar vârfurile terminale (frunzele) sunt etichetate cu simboluri terminale;
c) pentru orice vârf interior A având descendenţii direcţi etichetaţi  1 , 2 ,..., k , există o
producţie în P de forma: A   1 2 ... k .
Şirul simbolurilor care etichetează frunzele arborelui scrise în ordine de la stânga la dreapta
formează frontiera arborelui.
Pentru propoziţia din exemplul anterior a  a  a L( G ) arborele de derivare este dat în figura
4.4.
S

S S
x
S S
( )
a
S
S S
+
+
S
a a
S
Figura 4.4. Arborele de derivare

4
Observăm că frontiera arborelui din Figura 4.4. reproduce propoziţia a  a  a L( G ) .

Aplicaţie.
Fie gramatica independentă de context G  VN ,VT , S , P  ,
unde: VN  S , A , B
VT  a , , ,( , ) 
S VN este simbolul de start
P conţine următoarele producţii (reguli de rescriere):
(1) S  S  A
(2) S  A
(3) A  A  B
(4) A  B
(5) B  S 
(6) B  a

Cu ajutorul acestei gramatici având ca operand a şi operatori +, x, ( , ) se pot genera expresii


aritmetice. Acestea constituie limbajul L(G), generat de gramatica G.
a) Considerăm propoziţia:
a  b  a  a
Acest program aparţine lui L(G)? Răspunsul este negativ, deoarece simbolul bVT . Un
compilator construit pentru acest limbaj va semnala eroare în faza de analiză lexicală.
b) Fie acum propoziţia:
a  a  a  a  a
Acest program aparţine lui L(G)? Compilatorul construit pentru acest limbaj parcurge faza de
analiză lexicală fără erori, deoarece toate simbolurile utilizate aparţin lui VT .
În faza de analiză sintactică pornind de la simbolul de start S, aplicând regulile gramaticii,
încercăm să obţinem propoziţia. Exemplificăm aplicând derivări la stânga (cifrele de sub
simbolul de derivare indică regula de rescriere aplicată).

S  S  A  A  A  B  A  a  A  a  A  B  a  B  B  a  a  B  a  a  S  
( 1) ( 2) ( 4) (6) ( 3) ( 4) (6) ( 5) ( 1)
a  a  S  A  a  a  A  A  a  a  B  A  a  a  a  A  a  a  a  A  B 
( 2) ( 4) (6) ( 3) ( 4)
a  a  a  B  B  a  a  a  a  B  a  a  a  a  a .
(6) (6)
Rezultă că propoziţia a  a  a  a  a LG  şi deci faza de analiză sintactică a fost parcursă
fără eroare.

5
Analog, aplicând derivări la dreapta obţinem:
S  S  A  S  A  B  S  A  S   S  A  S  A  S  A  S  A  B 
( 1) ( 3) ( 5) ( 1) ( 3) (6)
S  A  S  A  a  S  A  S  B  a  S  A  S  a  a   S  A  A  a  a 
( 4) (6) ( 2) ( 4)
S  A  B  a  a  S  A  a  a  a  S  B  a  a  a  S  a  a  a  a 
(6) ( 4) (6) ( 2)
A  a  a  a  a  B  a  a  a  a  a  a  a  a  a LG  .
( 4) (6)

Problema realizării analizei sintactice revine la definirea unui algoritm care să decidă dacă o
propoziţie aparţine sau nu limbajului generat de gramatica G. Un astfel de algoritm poate fi
privit ca o maşină cu operaţii simple, care primeşte la intrare şirul simbolurilor de analizat (care
constituie programul sursă), îl parcurge secvenţial şi în final prin starea în care rămâne,
stabileşte dacă şirul a fost acceptat sau nu. Structura matematică folosită pentru recunoaşterea
(acceptarea) unui program ca aparţinând limbajului de programare în care a fost realizat se
numeşte automat de acceptare.

Pentru a crea o imagine asupra modului de lucru al compilatorului, prezentăm fazele parcurse
pentru translatarea unei instrucţiuni simple de atribuire.

valoare := avans + rata x 12

Analiza lexicală

id1 := id2 + id3 x 12

Analiza sintactică

:=
Id1 +
= Id2 = x
:= Id3 12
2:
=
Analiza semantică

6
:=

Tabela informaţii +
Id1
= x
valoare ....... Id2
avans ....... :=
Id3 int-to-real
rata ....... 2:
=
12

Generarea codului
intermediar

temp1 := integer-to-real (12)


temp2 := id3 x temp1
temp3 := id2 + temp2
id1 := temp3

Optimizarea codului

temp1 := id3 x 12.0


id1 := id2 + temp1

Generarea codului

MOVE id3, R2
MULTIPLY 12.0, R2
MOVE id2, R1
ADDITION R2, R1
MOVE R1, id1

Comentarii
 Analiza lexicală - se parcurge şirul simbolurilor din instrucţiunea de atribuire şi se
constată că din punct de vedere lexical instrucţiunea este corectă, se găseşte un şir de
entităţi format din 3 identificatori (id1, id2, id3) şi o constantă (12).
 Analiza sintactică pleacă de la şirul entităţilor furnizate de analizorul lexical şi produce o
reprezentare a structurii sintactice sub formă de arbore de derivare (o reprezentare
grafică a derivării). Se constată că şirul entităţilor este corect, în sensul respectării

7
definiţiei sintactice de construcţie a unei instrucţiuni de atribuire, cu alte cuvinte,
instrucţiunea de atribuire este corectă.
 Analiza semantică impune schimbarea reprezentării întregi a valorii 12 în formatul de
reprezentare a numerelor reale. Se realizează prin funcţia de conversie int-to-real
(integer to real). Această conversie este necesară pentru a putea evalua o expresie de
forma: real := real x real.
 Generarea codului intermediar presupune execuţia secvenţei:
temp1 := integer-to-real (12)
temp2 := id3 x temp1
temp3 := id2 + temp2
id1 := temp3
unde temp1, temp2, temp3 sunt variabile temporare.
Se obţine: temp1 ← 12.0
temp2 ← rata x 12.0
temp3 ← avans + temp2 (← avans + rata x 12.0)
id1 ← temp3 (← avans + rata x 12.0)
 Optimizarea codului presupune o analiză a secvenţei generate anterior. Se observă că
numărul de atribuiri poate fi redus.
Se obţine: temp1 := id3 x 12.0
id1 := id2 + temp1
adică: temp1 ← rata x 12.0
id1 ← avans + rata x 12.0

 Generarea codului presupune o transcriere eficientă a programului sursă translatat.


Se obţine secvenţa: MOVE id3, R2
MULTIPLY 12.0, R2
MOVE id2, R1
ADDITION R2, R1
MOVE R1, id1
care impune utilizarea a 2 regiştri, R1 şi R2, pentru efectuarea operaţiilor.
Operaţiile din secvenţă trebuie interpretate astfel:
MULTIPLY operand2, operand1
presupune efectuarea inmulţirii: operand1 x operand2
şi apoi rezultatul este depozitat în: operand1

ADDITION operand2, operand1


presupune efectuarea adunării: operand1 + operand2
şi apoi rezultatul este depozitat în: operand1

MOVE operand2, operand1


presupune transferul operand2 în operand1.

8
Revenim la secvenţă şi obţinem în urma execuţiei:
R2 ← rata
R2 ← R2 x 12.0 (← rata x 12.0)
R1 ← avans
R1 ← R1 + R2 (← avans + rata x 12.0)
id1 ← R1 (← avans + rata x 12.0)
adică evaluarea instrucţiunii de atribuire:
valoare := avans + rata x 12

BIBLIOGRAFIE

Aho A.V., Sethi R., Ullman J.D. (1986) Compilers: Principles, Techniques, and Tools,
Addison Wesley, Pearson Education, Inc.
Niţchi Ş. (coord.) (2009) Elemente avansate de informatică economică, Editura RisoPrint,
Cluj-Napoca

9
INTRODUCERE ÎN BAZE DE DATE

1.1. EVOLUŢIA PROCESULUI DE ORGANIZARE A DATELOR

Organizaţiile gestionează colecţii de date în scopul satisfacerii cerinţelor informaţionale la toate


nivelele decizionale (operaţional, tactic, strategic). În absenţa datelor asupra funcţionării
interne şi asupra mediului extern, o organizaţie nu ar putea supravieţui.

O colecţie de date reuneşte date despre o anumită clasă de obiecte (reale sau conceptuale). De
exemplu, în domeniul contabilităţii financiare, colecţia de date CONTURI conţine informaţiile
referitoare la clasa de obiecte conturi: simbolul contului (SIMB_CONT), denumirea contului
(DEN_CONT), tipul contului (TIP_CONT), soldul iniţial debitor (SID) şi respectiv soldul iniţial
creditor (SIC). Evident, un cont dat va avea soldul iniţial fie debitor, fie creditor. Pentru
exemplificare, considerăm colecţia de date CONTURI.

SIMBOL_CONT DENUMIRE_CONT TIP_CONT SID SIC


121 Profit şi pierderi B 0 1000
O realizare a colecţiei de date CONTURI

Într-o întreprindere sunt identificate mai multe colecţii de date, de exemplu: PERSONAL –
conţine informaţii despre persoanele angajate în firmă;
PRODUSE - conţine informaţii despre produsele realizate;
STOCURI - conţine informaţii despre stocurile existente de materii prime, materiale,
produse finite, etc.
TRANZACŢII - conţine informaţii privind intrările/ieşirile în/din stocuri.

Procesul de organizare a datelor presupune:


 definirea, structurarea, ordonarea şi gruparea datelor în colecţii de date omogene;
 stabilirea relaţiilor între date, între elementele unei colecţii, între colecţii de date;
 stocarea datelor pe suport informational.

Organizarea datelor este necesară pentru:


 minimizarea timpului de acces la date;
 asigurarea unicităţii datelor;
 sistemul de organizare a datelor adoptat trebuie să reflecte cât mai fidel toate legăturile
dintre obiectele, fenomenele, procesele economice pe care aceste date le reprezintă;
 asigurarea flexibilităţii datelor.

Etapele evoluţiei procesului de organizare a datelor


Procesul de organizare şi prelucrare a datelor a parcurs mai multe etape, până s-a ajuns la
soluţia dominantă în prezent, care constă în organizarea datelor în baze de date.

1
Principalele etape ale evoluţiei tehnicilor de organizare şi prelucrare a datelor sunt:

 Prima etapă – se caracterizează prin adaptarea tipurilor de organizare a datelor


existente în sistemele de prelucrare manuală la condiţiile tehnice impuse de calculator.
În această etapă, apare fişierul organizare secvenţială, iar ca suport de memorare
externă se utilizează benzile magnetice. Este caracteristică prelucrarea pe loturi (batch
processing).

 A doua etapă – este marcată de separarea dintre structura logică de date şi structura
fizică. Rezultă independenţa fizică a datelor. În această etapă se utilizează fişiere
secvenţial-indexate, fişiere directe, fişiere inverse, etc. Ca suport de memorare externă
apare discul magnetic.
Se asigură independenţa aplicaţiilor de modificările echipamentelor hardware (bandă,
disc, etc.). Apar primele facilităţi de protecţie a datelor. Apare şi posibilitatea de lucru în
mod conversaţional. O facilitate importantă pusă la dispoziţia utilizatorilor este
generarea automată de rapoarte. Apare o separare (parţială) între modul în care un
fişier este privit de utilizator (nivelul logic) şi modul de memorare pe suportul magnetic
(nivelul fizic).

O caracteristică comună a primelor două etape: fiecare aplicaţie lucrează cu propriile fişiere,
fără a avea nici o legătură cu fişierele utilizate de alte aplicaţii. Aceasta aduce inconvenienţe
majore legate de:
 redundanţa datelor - prezenţa aceloraşi date în mai multe fişiere, crează probleme
evidente în operaţiile de actualizare;
 inconsistenţa datelor - aceeaşi informaţie este memorată diferit în fişiere diferite (mai
ales când informaţia se modifică);
 absenţa unor legături logice între datele din grupuri diferite de fişiere, număr mare de
fişiere, timp mare de prelucrare;
 flexibilitate redusă a sistemului la apariţia unei noi aplicaţii.

 A treia etapă – este definită de apariţia fişierelor integrate (sisteme de fişiere). Se reduce
redundanţa şi implicit inconsistenţa datelor - aceleaşi date fizice pot fi utilizate în comun
de către mai multe aplicaţii. Apar proceduri care gestionează relaţiile dintre fişierele din
sistem, rezultând astfel o structură logică unitară. Rămân însă deficienţele comune
primelor două etape, legate de gestiunea fişierelor care uneori este realizată cu
programe scrise în diferite limbaje de programare. Structura fişierului trebuie precizată
în programul de gestiune, ceea ce conduce la modificarea programului în cazul
modificării structurii fişierului.

Notă. Structura integrată stă la originea noţiunii de model conceptual (modelul ce conţine
descrierile tuturor datelor şi a legăturilor dintre ele).
În concluzie, sistemele bazate pe fişiere (file based) au următoarele caracteristici:
 fiecare program defineşte şi gestionează propriile date;
 datele sunt descrise independent în toate fişierele în care apar;

2
 fiecare fişier de date este descris în toate programele care îl accesează;
 nu există control al accesului şi al manipulării datelor, în afara celui impus prin
programele de aplicaţie.

Din aceste carcateristici decurg următoarele dezavantaje ale organizării datelor după modelul
file based:
 redundanţa şi inconsistenţa datelor;
 dificultatea accesului – în cazul în care o informaţie este exploatată de mai mulţi
utilizatori, fişierele tradiţionale nu permit accesarea datelor după mai multe criterii
specifice diferiţilor utilizatori sau grupuri de utilizatori;
 complexitatea actualizărilor – într-un mediu multiutilizator (multiuser) efectuarea unei
actualizări (modificare, adăugare sau ştergere) poate conduce la situaţii conflictuale
atunci când doi utilizatori vor să modifice simultan aceeaşi dată; acest gen de conflicte
poate fi rezolvat printr-un program supervizor al prelucrărilor;
 probleme de securitate – crearea unor mecanisme de protecţie a datelor împotriva
accesului neautorizat este dificilă;
 asigurarea integrităţii datelor – presupune crearea unor proceduri de analiză a
restricţiilor semantice la care sunt supuse datele; acestea formează mecanismul de
integritate;
 dificultatea de a obţine răspunsuri rapide la probleme ad-hoc simple – presupune
realizarea unor programe utilizând limbaje procedurale pentru a obţine răspunsul la o
interogare;
 inflexibilitatea faţă de schimbările ulterioare din sistemul informaţional;
 costul ridicat – datorat gradului de redundanţă a datelor şi efortului necesar
interconectării fişierelor de date pentru a realiza un nivel minim de integritate şi
securitate a datelor.

 A patra etapă – este etapa bazelor de date. Sintagma bază de date apare în anul 1964,
în titlul conferinţei Development and Management of a Computer – Centered Data
Base organizată la Santa Monica (California) de System Development Corporation.
Momentul consacrării termenului DATA BASE este 1969, când la CODASYL (Conference
On DAta SYstems Language) se prezintă într-un raport conceptul de bază de date.

3
1.2. BAZE DE DATE - CONCEPTE GENERALE

Definiţia 1.1. DATA reprezintă înregistrarea unei observaţii, obiect, fenomen, imagine, sunet sau
text, într-o formă convenabilă unei prelucrări, interpretări sau transmiteri prin mijloacele
informaticii. Datele reprezintă aspecte elementare nesupuse unei prelucrări şi neevaluate din
punct de vedere al utilităţii.

Definiţia 1.2. INFORMAŢIA este semnificaţia ce poate fi ataşată sau poate fi dedusă dintr-un
ansamblu de date pe baza corelaţiilor dintre acestea, având un scop bine determinat, de
satisfacere a cerinţelor utilizatorilor.

Definiţia 1.3. BAZA DE DATE (Database) este un ansamblu structurat de colecţii de date
operaţionale înregistrate pe suport adresabil, aflate în interdependenţă logică, împreună cu
descrierea datelor şi a relaţiilor dintre ele şi care sunt prelucrate în aplicaţiile informatice ale
unei organizaţii. Baza de date permite operaţii de introducere, ştergere, actualizare şi
interogare a datelor.

BAZA DE DATE este un ansamblu de date:


 structurate;
 coerente, adică există legături (interdependenţe) logice între diferitele colecţii ce
alcătuiesc baza de date; coerenţa bazei de date este dată de restricţiile de integritate
care sunt verificate la fiecare operaţie de actualizare;
 persistente, adică datele rămân memorate pe suport magentic, independent de
execuţia programelor de aplicaţii, fiind păstrate pentru o anumită perioadă de timp;
 neredundante - condiţia de neredundanţă este în general înlocuită de o condiţie mai
slabă: redundanţă minimă şi controlată în scopul de a mări viteza de acces la date;
 independente de programul de aplicaţie;
 direct accesibile după mai multe criterii;
 simultan accesibile de către mai mulţi utilizatori.

În gestiunea bazelor de date există două tipuri de baze de date:

BAZE DE DATE OPERAŢIONALE – sunt utilizate cu precădere în prelucrarea on-line a tranzacţiilor


(on-line transaction processing – OLTP), adică în situaţii cînd este necesară colectarea,
modificarea şi întreţinerea zilnică a bazelor de date. Datele stocate într-o bază de date
operaţională sunt de tip dinamic, ceea ce înseamnă că se modifică în permanenţă şi reflectă
întotdeauna informaţii actualizate în timp real.

BAZE DE DATE ANALITICE - sunt utilizate mai ales în aplicaţiile de prelucrare analitică on-line
(on-line analytical processing – OLAP), când este necesară stocarea şi urmărirea datelor istorice
şi dependente de timp. Sunt importante cînd este necesară urmărirea tendinţelor, vizualizarea
datelor statistice pe o perioadă mai lungă de timp sau efectuarea unor previziuni tactice sau
strategice de afaceri. Datele stocate într-o bază de date analitică sunt de tip static, adică nu se

4
modifică niciodată (sau foarte rar). Bazele de date analitice utilizează frecvent bazele de date
operaţionale ca sursă principală de date.

ARHITECTURA UNUI SISTEM DE BAZE DE DATE (Database System) cuprinde:


 baza de date propriu-zisă în care se memorează datele
 software-ul format din Sistemul de Gestiune al Bazei de Date (SGBD) şi aplicaţiile de
baze de date (Database Application)
 metabaza de date - dicţionarul datelor (DD), conţine informaţii despre date, structura
acestora, documentaţie
 hardware-ul utilizat
 utilizatorii bazei de date: administratorul bazei de date, programatorul de aplicaţii
(administratorul aplicaţiei) şi utilizatorii finali (nespecialişti)
 reglementările legislative ce permit buna funcţionare a sistemului.

Cerinţele minimale care se impun unei baze de date sunt:

 furnizarea în timp util a informaţiilor solicitate; se referă la timpul de răspuns la o


interogare efectuată;
 costuri minime de prelucrare şi întreţinere a informaţiei;
 capacitatea de a satisface, cu aceleaşi date necesităţile informaţionale ale unui număr
mare de utilizatori;
 flexibilitatea - posibilitatea de adaptare la cerinţe noi, de a da răspunsuri la interogări
neprevăzute iniţial;
 integrarea – baza de date poate fi considerată o unificare a mai multor fişiere – altfel
diferite – redundanţa acestor fişiere fiind parţial sau total eliminată;
 asigurarea unei redundanţe minime şi controlate a datelor – rezultă din cerinţa de
integrare; menţinerea mai multor copii ale aceloraşi date poate fi impusă de motive de
ordin tehnic, însă această redundanţă minimă trebuie controlată cu atenţie, ceea ce
presupune ca sistemul de gestiune al bazei de date să o cunoască şi să-şi asume
responsabilitatea de a propaga actualizările;
 partajarea şi sincronizarea – posibilitatea de partajare şi exploatare simultană a datelor
de către mai mulţi utilizatori; se realizează astfel posibilitatea de acces concurent la
date;
 confidenţialitatea – asigurarea securităţii datelor prin mecanisme de protecţie împotriva
accesului neautorizat;
 integritatea – presupune existenţa unor proceduri de validare şi recuperare a datelor
după accidente; problema integrităţii este de a garanta (atât cât este posibil) că datele
din baza de date sunt corecte;
 compatibilitatea şi expandabilitatea – posibilitatea de valorificare a eforturilor
anterioare şi anticiparea nevoilor de dezvoltare;
 permisivitatea – posibilitatea de ierarhizare a datelor după criteriul frecvenţei acceselor
sau reorganizarea datelor în scopul creşterii performanţelor bazei de date.

5
Utilizatorii bazei de date sunt:

 Administratorul bazei de date (DBA - DataBase Administrator) este responsabil de


menţinerea funcţionalităţii bazei de date: prin efectuarea operaţiilor periodice de
salvare a datelor (backup) şi de refacerea a datelor în cazul apariţiei unui incident
(rollback) şi prin urmărirea performanţelor sistemului; autorizează drepturile de acces
pentru diferitele categorii de utilizatori, ajută la definirea cerinţelor utilizatorilor, etc.

 Programatorul de aplicaţii (administratorul aplicaţiei) este cel care dezvoltă aplicaţiile


de baze de date folosind limbaje de programare de nivel înalt, generatoare de aplicaţii şi
biblioteci care permit încorporarea operaţiilor de acces la baza de date; aplicaţiile care
rezultă pot fi cu execuţie independentă (batch-processing) sau pot fi aplicaţii interactive
(on-line) destinate utilizatorilor finali.

 Utilizatorii finali (nespecialişti) accesează baza de date prin intermediul unui program de
aplicaţie care le dă drepturi limitate de acces la date pentru anumite operaţii de
prelucrare; utilizatorii finali, în general, efectuează un număr mare de operaţii
tranzacţionale asupra bazei de date utilizând interfeţe de comunicare cu baza de date
apropiate de limbajul natural, dar nu cunosc structura bazei de date şi nici modul efectiv
de lucru cu baza de date.

Arhitectura internă a unui sistem de baze de date (figura 1.1) - conţine trei nive niveluri de
abstractizare şi percepţie a datelor, introduse în anul 1975, prin raportul ANSI/SPARC DBMS –
Report of the Study Group on Data Base Management Systems (Acronimul ANSI/SPARC
înseamnă American National Standards Institute / Standards Planning And Requirements
Committee):

 Nivelul intern (Internal Schema) – specifică modul de stocare a datelor în sistem.


Vederea internă este o reprezentare de nivel inferior a întregii baze de date şi este
descrisă prin intermediul schemei interne, care defineşte diversele tipuri de înregistrări
stocate, specifică indexurile care există, modul în care sunt reprezentate câmpurile
stocate, în ce secvenţă fizică se află înregistrările stocate, etc. Schema internă este scrisă
folosind un limbaj de definire a datelor - limbajul DDL intern. Administratorul bazei de
date este responsabil cu crearea schemei interne, adică proiectarea fizică a bazei de
date.

 Nivelul extern (External Schema, User’ View) – este nivelul logic al utilizatorului
individual, care este cel mai apropiat de utilizator. Acesta poate fi un programator de
aplicaţii (administratorul aplicaţiei) sau un utilizator final. Fiecare utilizator are la
dispoziţie un limbaj:
- pentru programatorul de aplicaţii (administratorul aplicaţiei) limbajul poate fi Java,
C++, PL/I, etc.
- pentru utilizatorul final limbajul va fi ori unul de interogare (SQL), ori unul specializat
adaptat cerinţelor utilizatorului.

6
Un sistem de baze de date acceptă mai multe limbaje gazdă. Un sublimbaj de date (DSL
– Data SubLanguage) este un subset al limbajului complet, care se referă în mod specific
la obiectele şi operaţiile bazei de date. Sublimbajul de date este înglobat în limbajul
gazdă corespunzător. Unul dintre sublimbajele de date acceptat de către majoritatea
sistemelor curente este SQL. Limbajul SQL, care va fi prezentat în Capitolul 4, poate fi
folosit interactiv, ca limbaj de interogare autonom, cât şi înglobat în alte limbaje, cum ar
fi Java, C++, PL/I, etc.
De exemplu, sistemul de baze de date Oracle are 6 precompilatoare (C, Pascal, Ada,
Cobol, Pl/1, Fortran) care permit includerea de instrucţiuni SQL sau blocuri PL/SQL în
programele scrise în limbajele gazdă.
Orice sublimbaj de date conţine două limbaje subordonate:
- un limbaj de definire a datelor (DDL –Description Data Language) pentru definirea
obiectelor bazei de date;
- un limbaj de manipulare a datelor (DML – Data Manipulation Language) care
realizează prelucrarea acestor obiecte.

Observăm că graniţele dintre: a) limbajul gazdă şi sublimbajul de date şi b) limbajele


DDL şi DML sunt de natură conceptuală. Important este ca aceste limbaje să fie
transparente pentru utilizator.

 Nivelul conceptual (Conceptual Schema) – corespunde unei reprezentări abstracte a


întregului conţinut informaţional al bazei de date. Schema conceptuală este scrisă
folosind un limbaj DDL conceptual şi conţine definiţii ale conţinutului informaţional, care
includ caracteristici suplimentare, cum ar fi constrângerile de securitate şi de integritate.
Proiectarea logică sau conceptuală a bazei de date reprezintă responsabilitatea
administratorului de date (DA – Data Administrator). Administratorul de date (numit şi
administratorul întreprinderii) este persoana care “înţelege” datele şi necesităţile
întreprinderii referitoare la ele. Are ca sarcină să decidă ce date trebuie stocate în baza
de date şi să stabilească regulile de întreţinere şi de tratare a acestor date.

7
Utilizator A1 Utilizator A2 Utilizator B1

Limbaj Limbaj Limbaj


gazdă + gazdă + gazdă +
DSL DSL DSL

Schema Schema
externă A - Vederea externă externă B - Vederea externă
interfaţa cu A interfaţa cu B
utilizatorul utilizatorul

Corespondenţa extern/
conceptual pentru B
Corespondenţa extern/
conceptual pentru A

Schema Vederea
conceptuală conceptuală

Sistemul de
Corespondenţa
gestiune a
conceptual/intern
bazelor de date
(SGBD)

Definiţia
structurii de
stocare Baza de date stocată
(schema
(vederea internă)
internă)

Fig.1.1. Arhitectura unui sistem de baze de date


(sursa: Date C.J., Baze de date)

8
Curs 5 Baze de date – Modelele de date specializate

Modelele de date specializate sunt modelul ierarhic, modelul rețea, modelul relațional,
modelul obiect si modelul obiect-relațional.
Modelul de date ierarhic – în modelul ierarhic o baza de date se reprezintă print-o
structură ierarhică de înregistrări de date conectate prin legături. Modelul de date
ierarhic a fost primul model folosit pentru dezvoltarea bazelor de date. Cel mai
cunoscut SGBD ierarhic este sistemul IMS (information management system) si a fost
dezvoltat de IBM in cadrul programului de cercetări spațiale Apollo in anii 1960. O
inregistrare de date in modelul ierarhic este o instanta a unui tip de inregistrare si constă
dintr-o colectie de campuri, fiecare camp continand valoarea unui atribut. Un tip de
inregistrare corespunde unui tip de entitate iar o inregistrare corespunde unei entități
din modelul entitate-asociere. Un tip de legatura in modelul ierarhic este un tip de
asociere cu raportul de cardinalitate 1 la n intre doua tipuri de inregistrari. Tipul de
inregistrare din partea 1 a asocierii este numit tip de inregistrare parinte iar tipul din
partea cu multiplicitatea n a asocierii este numit tip de inregistrare fiu. Schema
conceptuala a unei baze de date ierarhice se reprezinta printr-un nr de scheme ierarhice.
O schema ierarhica este un arbore directionat reprezentat pe mai multe niveluri in care
nodurile sunt tipurile de inregistrari iar arcele sunt tipuri de legaturi. Fiecare nod cu
exceptia nodului radacina are o singura legatura catre un nod de nivel superior. Fiecare
nod cu except nodurilor frunza are una sau mai multe legaturi catre nodurile de pe
nivelul imediat inferior adica nodurile fii. In concluzie se poate stabili o corespondenta
intre o schema conceptuala ierarhica si o diagrama entitate-asociere dupa cum
urmeaza: tipurile de inregistrari corespund tipurilor de entitati iar tipurile de legaturi
corespund tipurilor de asocieri. In modelul ierarhic nu sunt admise decat legaturi de tip
parinte-fiu care corespund asocierilor 1 la 1 si asocierilor 1 la n din modelul entitate
asociere. Asocierile n la n din modelul entitate-asociere nu se pot reprezenta in mod
direct in modelul ierarhic ci doar prin multiplicarea inregistarilor de tip fiu atunci cand
sunt referite de mai multe inregistrari de tip parinte. Acest lucru conduce la o mare
redundanta a datelor (datele respective sunt multiplicate de mai multe ori).
Implementarea modelului ierarhic se realizeaza prin memorarea explicita a tuturor
legaturilor de tip parinte-fiu astfel in fiecare inregistrare de tip parinte se memoreaza
lista adreselor la inregistrarile fiu cu care aceasta este asociata. De aceea, in modelul
ierarhic nu se pot rezolva decat acele interogari pentru care au fost prevazute in mod
explicit legaturile necesare. Avantajele acestui model sunt simplitatea si eficienta de
calcul dar datorita redundantei foarte mari a datelor astazi acest model nu mai este
folosit.
Modelul de date retea: acest model foloseste o structura de graf pentru definirea
schemei conceptuale a bazei de date. Nodurile grafului sunt tipuri de entitati iar
muchiile grafului reprezinta asocierile dintre tipurile de entitati.
Deosebirea fata de modelul ierarhic consta in aceea ca in modelul retea, asocierile n la
n se reprezint afara duplicarea inregistrarilor, fiecare inregistrare putand fi referita de
mai multe inregistrari ceea ce elimina redundanta datelor. La fel ca si in modelul
ierarhic, un mare dezavantaj este ca fiecare interogare trebuie sa fie prevazuta inca din
faza de proiectare prin memorarea explicita a legaturilor intre tipurile de entitati. In
plus, in cazul modelului retea, complexitatea reprezentarii datelor este deosebit de
ridicata. Azi modelul de date retea este foarte putin utilizat de BD de uz general.
Primele generatii de realitate virtuala cu scene tridimensionale se bazau pe modelul de
date retea pentru stocarea bazelor de date grafice.
Modelul de date relational: modelul relational se bazeaza pe notiunea de relatie din
matematica care corespunde unei multimi de entitati de acelasi tip si are o reprezentare
usor de inteles, de manipulat ce consta dintr-o tabela bidimensionala compusa din linii
si coloane. Fiecare linie din tabela reprezinta o entitate si este compusa din multimea
valorilor atributelor entitatii repsective, fiecare atribut corespunzand unei coloane a
tabelei. Modelul de date relational a fost propus de cercetatorul E.F.Cod din cadrul
companiei IBM la inceputul anilor 1970. Chiar daca notiunile de relatie tabela difera
in esenta lor, pentru ca relatia este o multime de entitati iar tabela este o reprezentare
vizuala a acesteia, cele doua denumiri se pot folosi in general in mod interschimbabil.
Principalele caracteristici ale modelului de date relational: datele sunt percepute de
utilizatori ca tabele din numai ca tabele; operatorii care pot fi folositi pentru prelucrarea
datelor genereaza o tabela rezultat din tabelelele operanti; asocierea dintre tabele se
realizeaza prin intermediul egalitatii valorilor unor atribute comune ce permite
rezolvarea oricarei interogari fara sa fie necesar sa se prevada legaturi explicite in cazul
modelelor prerelational. Prin SGBD relationale intelegem acele sisteme de gestiune
construite pe modelul relational cum ar fi Microsoft Access, Oracle, MySQL,
SQLServer etc. Un mare avantaj al modelului de date relational il reprezinta faptul ca
datele pot fi manipulate cu ajutorul unui limbaj comun numit SQL.
Modelul orientat obiect – modelul obiect este un concept unificator in stiinta
calculatoarelor si este aplicabil in programare, in proiectarea hardware-ului, a
interfetelor sau bazelor de date. Sistemele de BD orientate obiect se bazeaza pe limbaje
de programare orientate obiect cu capacitati de persistenta in care datele sunt
independente de tipul de viata al programelor care le creeaza sau acceseaza prim
memorare pe calculator. In practica, exista unele domenii in care modelul relational s-
a dovedit insuficient cum ar fi sisteme GPS, medicina etc. In programarea orientat
obiect, programele sunt organizate ca si colectii de obiecte, fiecare obiect fiind o
instanta a unei clase, fiecare clasa reprezinta abstractizarea unui tip de entitate din
realitatea modelata, iar clasele sunt membre ale unei ierarhii de clase corelate intre ele
prin relatii de mostenire. Orice obiect este incapsulat, ceea ce ca inseamna
reprezentarea lui nu este vizibila utilizatorilor care au acces doar la functiile pe care
acel obiect este capabil sa le execute. Principalul avantaj al acestui model de date il
reprezinta capacitatea lor de a definii si manevra tipuri de date complexe care se pot
extinde prin mecanismul de mostenire. Principalul dezavantaj il reprezinta faptul ca
programatorii trebuie sa prevada in structura obiectelor toate asocierile necesare tuturor
interogarilor.
Modelul de date obiect-relational: acest model reprezinta extinderea modelului
relational cu caracteristici ale modelului obiect extinderea necesara pentru realizarea
BD care definesc si prelucreaza tipuri de date complexe. Acest model pastreaza
structura datelor in relatii sau tabele dar adauga posibilitatea definirii unor noi tipuri de
date pentru domeniile de valori ale atributelor. Tipurile de date definite de utilizator
pot fi extinse prin mecanismul de moștenire. In general aceste modele se realizeaza
prin extinderea sistemelor relationale, adaugandu-se caracteristici ale modelului obiect
dar pastrand toate caracteristicile modelului relational.
Curs 6 Baze de Date – Baze de date relationale
Modelul relational a aparut in 1970, si pana la acest moment este cel mai
raspandit model de date, astfel incat majoritatea sistemelor de baze de date astazi
folosesc modelul de date relational. Modelul relational se caracterizeaza prin
simplitate si precizia modului de definire a elementelor de baza precum si un
suport teoretic substantial pentru realizarea bazelor de date relationale.
(relatie=tabela)
O baza de date relationala este compusa dintr-o multime finita de relatii,
fiecare relatie reprezentand un tip de entitate sau o asociere intre doua sau mai
multe tipuri de entitati. Exemplu – baza de date pentru administrarea unei
biblioteci cuprinde relatiile carti (titlu, autor, an aparitie, cod editura), edituri (cod
editura, denumire, adresa, telefon) si imprumuturi (nr inmprumut, cod carte, cod
abonat, data imprumutului si data returului)
Din definitia bazei de date rezulta ca intr-o baza de date, fiecare relatie este
unica deoarece am spus ca baza de date este o multime de relatii. Orice relatie se
defineste prin intermediul atributelor sale (Exemplu – relatia carti se defineste
prin atributele cod carte, titlu, autor, an aparitie, cod editura). Atributele unei
relatii sunt atributele tipului de entitate sau de asociere pe care il reprezinta relatia
respectiva. Fiecare atribut al unei relatii are un domeniu de definitie si poate lua
o singura valoare din domeniul sau de definitie pentru fiecare tuplu al relatiei
(linie). Domeniul de definitie reprezinta o multime de valori si atributul nostru isi
poate lua valoarea doar din acel domeniu.
Un domeniu de definitie este o multime, un nume de valori atomice de
acelasi tip, avand o anumita semnificatie din care isi iau valori atributele relatiei.
Nu trebuie confundata atomicitatea din punct de vedere semantic a valorii unui
atribut cu atomicitatea structurii de date prin care se reprezinta valoarea acelui
atribut in memoria calculatorului. De exemplu, un atribut care desemneaza un
nume de persoana se reprezinta printr-un sir de caractere care poate fi descompus
in elementele componente, adica in caractere, dar sistemul de gestiune nu atribuie
nici o semnificatie unui element separat, ci numai intregului sir de caractere.
Schema relatiei este notata r (A1, A2, Ai,…… An) este compusa din
numele relatiei si din lista ordonata a atributelor sale A1, A2, Ai, ….. An, fiecare
atribut Ai definit pe domeniul sau de definitie D(Ai). Relatia carti (cod carte, titlu,
autor, an aparitie, editura). Schema relatiei este folosita pentru a descrie relatia
respectiva si se mai numeste tipul sau intensitatea relatiei. Numarul de atribute
ale schemei unei relatii se numeste gradul relatiei. O relatie R definita de schema
r de A1, A2, Ai….. An este o multime de n tupluri, fiecare tuplu fiind o lista
ordonata de n valori V1, V2, Vi, Vn, unde Vi este valoarea atributului Ai
apartinand domeniului sau de definitie. Din aceasta definitie rezulta ca intr-o
relatie nu exista tupluri duplicat, deoarece relatia este o multime matematica de
tupluri. Totodata, in fiecare tuplu, un atribut nu poate lua decat o valoare din
domeniul sau de definitie. Numarul de atribute ale relatiei se numeste gradul
relatiei iar numarul de tupluri se numeste cardinalitatea relatiei. O relatie
corespunde in general unei multimi de entitati din diagrama entitate-asociere a
unei baze de date, iar un tuplu reprezinta o entitate din multimea de entitati.
Atributele tipului de entitate din modelul conceptual de nivel inalt devin
atributele relatiei in modelul relational. De exemplu se defineste relatia studenti
(nr matricol, nume, prenume, data nasterii, gen, adresa, specializare). Domeniile
de definitie ale atributelor se specifica prin numele domeniului, semnificatia
acestuia, tipul de date si restrictiile asupra valorilor in cadrul acelui tip de date.
De exemplu, domeniul pentru nume este format din numele de persoane
reprezentate printr-un sir maxim de 30 de caractere, pentru ca ne imaginam ca nu
exista niciun nume mai lung de 30 de caractere in care primul caracter este o litera
mare, iar celelalte sunt mici. Domeniul pentru data nasterii este format din
domeniul tuturor datelor calendaristice posibile pentru un student, astfel incat
studentul sa aiba mai mult de 18 ani si mai putin de 80. Domeniul pentru gen este
format din valorile posibile pentru sexul unui student masculin/feminin. Cel mai
frecvent in implementarea modelului relational in cadrul unor sisteme de gestiune
de baze de date diferite este ca domeniile de definitie ale atributelor sa foloseasca
direct tipurile de date predefinite ale limbajului de definire a datelor specific
acelui sistem de gestiune de baze de date.
Reprezentarea relatiilor prin tabele
O tabela este o reprezentare a unei relatii si este compusa din urmatoarele
parti: numele tabelei care este identic cu numele relatiei pe care o reprezinta; un
numar de coloane egal cu numarul de atribute ale relatiei, fiecare coloana
reprezentand un atribut; capul tabelei in care se inscriu numele atributelor relatiei
fiecare atribut fiind inscris in coloanal corespunzatoare; o multime de linii, fiecare
linie corespunzand unui tuplu, deci unei entitati; fiecare element al unei linii se
inregistreaza valoarea atributului corespunzator coloanei in care se afla elementul
respectiv. Termenul de tabela, pe care o reprezinta o relatie, este de fapt o notiune
similara, cu mentiunea ca tabela este o notiune reala, in timp ce relatia este o
notiune abstracta. Reprezentarea unei notiuni abstracte cum este relatia intr-o
forma usor de interpretat cum este tabela, este o proprietate esentiala a modelului
relational.
Ordonarea valoriilor atributelor in tupluri
Tuplul este considerat o lista ordonata de n valori ale atributelor A1, A2,
Ai,… An, ordinea valorilor atributelor intr-un tuplu nu are nicio importanta daca
se face o corespondenta intre un atribut cu valoarea acestuia. Fie schema relatiei
definite ca o multime de atribute R de A1, A2, Ai, An, relatia R este o multime
de n tupluri T, fiecare tuplu fiind compus dintr-o multime de n perechi ordonate
T=A1 V1, Ai Vi, An Vn, unde Vi este valoarea atributului Ai din domeniul sau
de definitie. In aceasta definitie, ordinea atributelor nu mai conteaza deoarece
numele atributului si valoarea lui sunt grupate impreuna si de aceea, aceasta
definitie a relatiei are un caracter mult mai general
Curs 7 Baze de date – Limbajul SQL (Structured Query
Language)
Limbajul SQL este limbajul utilizat de majoritatea sistemelor de baze de
date relationale pentru definirea si manipularea datelor. Limbajul SQL a fost
dezvoltat la mijlocul anilor 1970 iar in 1979 Oracle a introdus prima
implementare a limbajului SQL in varianta comerciala. In anul 1987 Institutul
National American de Standarde a elaborat standardul limbajului SQL.
Majoritatea sistemelor de gestiune de baze de date relationale suporta standardul
SQL 2. Totusi, fiecare dintre acestea implementeaza un dialect specific al
limbajului SQL, de exemplu, in diferite implementari ale limbajului SQL pot sa
lipseasca unele comenzi prevazute in standardul SQL 2 dar pot exista extensii
specifice neprevazute in standarde. Limbajul SQL foloseste termenii de tabela,
linie si coloana pentru a desena o relatie, un tuplu sau un atribut. Deci se poate
spune ca este orientat spre reprezentarea prin tabele a relatiilor care este mai
simpla si mai intuitiva atat pentru proiectanti cat si pentru programatori.
Limbajul SQL cuprinde atat componenta de descriere a datelor relationale
cat si componenta de manipulare a datelor, ambele fiind absolut necesare in
gestiunea bazelor de date. Pe langa aceste componente principale, standardul
SQL 2 mai prevede si alte componente dupa cum urmeaza:
1 – Controlul tranzactiilor contine comenzi pentru specificarea
tranzactiilor. Unele implementari adauga comenzilor prevazute in standard ci alte
comenzi suplimentare de control al concurentei sau de refacere a datelor.
2 - Controlul securitatii si al protectiei datelor. Aceasta componenta contine
comenzi de administrare a bazelor de date pentru definirea utilizatorilor si a
drepturilor acestora de acces la tabele. Aceasta componenta este puternic
dependenta de sistemul de gestiune al bazei de date, iar pentru sistemele
performante, administrarea bazei de date este o munca foarte complexa.
Limbajul SQL este un limbaj neprocedural. O instructiune SQL specifica
ce informatii trebuie sa fie setate sau obtinute si nu specifica modul sau procedura
in care se opereaza. Limbajul SQL contine numai instructiuni de definire si
manipulare a datelor si nu contine instructiuni de control al fluxului executiei cum
ar fi FOR, WHILE sau IF. De aceea pentru realizarea aplicatiilor de baze de date
s-au dezvoltat mai multe tehnologii, limbaje, biblioteci sau interfete de
programare care integreaza instructiunile SQL de acces la date. O instructiune
SQL este o secventa de elemente componente ce se termina cu semnul; . Fiecare
instructiune SQL contine o comanda SQL care specifica ce actiune se efectueaza,
urmata de alte elemente componente care specifica operatii, clauze sau
parametrii. De exemplu, instructiunea SELECT Nume FROM Studenti contine
comanda SQL SELECT urmata de alte elemente componente ale instructiunii.
Un element al unei instructiuni SQL poate fi cuvant cheie, identificator, constanta
sau caracter special.
Cuvinte cheie si identificatori: cuvintele cheie sunt elemente componente
cu semnificatie fixa in limbajul SQL. Acestea pot fi de exemplu comenzi
(SELECT, INSERT, UPDATE, DELETE), pot fi operatori (AND, OR, NOT,
LIKE) sau clauze (WHERE, SET, VALUES). De exemplu, SELECT Nume,
Varsta FROM Studenti WHERE Specializare=”Management”. In acest caz
cuvintele cheie sunt SELECT, FROM si WHERE. Identificatorii sunt elemente
componente care denumesc tabele, coloane sau alte elemente ale bazei de date.
In exemplul anterior Studenti si Specializare sunt identificatori. Pe langa acest tip
de identificatori simpli formati dintr-o secventa de litere sau cifre, mai exista si
alt tip de identificatori numiti identificatorii delimitati ce constau dintr-o secventa
de caractere incadrata la inceput si la sfarsit de ghilimele. Un identificator
delimitat este considerat intotdeauna identificator si niciodata nu este considerat
cuvant cheie.
Constante: constantele pot fi siruri de caractere, numere intregi, numere
reale sau constanta null. O constanta sir de caractere consta dintr-o secventa de
caractere delimitata la inceput si la sfarsit de cate un apostrof.
Caractere speciale: Unele caractere care nu sunt litere sau cifre au rol de
operator SQL sau pot avea o semnificatie speciala in cadrul comenzilor SQL. De
exemplu caracterul; este folosit pentru terminarea comenzilor. Caracterul. este
folosit ca punct zecimal in timp ce simbolul asterix * este folosit atat pentru
inmultire dar si pentru inlocuirea tuturor atributelor cand urmeaza dupa SELECT.
De exemplu SELECT * FROM Studenti va afisa toate coloanele din tabela
Studenti.
O expresie SQL consta dintr-unul sau mai multi operanti, operatori si
paranteze. Un operant poate fi numele unei coloane dintr-o tabela, o constanta
sau valoarea rezultat a unei functii. Parantezele sunt folosite pentru a preciza o
anumita ordine a operatiilor daca aceasta este diferita de cea implicita data de
precedenta operatorilor. Un operator SQL este compus din unul sau mai multe
caractere speciale care nu sunt cifre sau litere cum ar fi de exemplu +-*<>?! sau
este un cuvant cheie ca de exemplu AND, OR, NOT sau LIKE.
Operatorii de comparatie din SQL: a between m and n. (Compara a cu
valorile m si n adica A trebuie sa fie mai mare decat m si mai mic decat n). IN –
a IN (v1, v2... vn) compara a cu o lista de valori v1, v2.... vn. IS null – a IS null
(compara a cu valoare null). Tot asa a IS not null (compara a cu valoarea not null).
a LIKE sir de caractere (compara a cu un model sir de caractere). Operatorii logici
ai limbajului SQL sunt notati prin cuvinte cheie AND, OR si NOT. Toti acesti
operatori se aplica unor variabile logice cu 3 valori ADEVARAT, FALS si
NULL, unde NULL semnifica lipsa de informatie.
A B A AND B A OR B
ADEVARAT ADEVARAT ADEVARAT ADEVARAT
ADEVARAT FALS FALS ADEVARAT
ADEVARAT NULL NULL ADEVARAT
FALS FALS FALS FALS
FALS NULL FALS NULL
NULL NULL NULL NULL

A NOT A
ADEVARAT FALS
FALS ADEVARAT
NULL NULL
Curs 8 Baze de date Functiile definite in SQL
De 2 categorii: functii agregat si functii scalare. Functiile agregat
calculeaza un rezultat din mai multe linii ale unei tabele. Functiile scalare primesc
unul sau mai multe argumente si returneaza o valoarea calculata sau valoarea null
in caz de eroare (functiile numerice, pentru manipularea sirurilor de caractere,
pentru timp sau functii de conversie).

Tipurile de date si domeniile din SQL


In limbajul SQL sunt definite mai multe tipuri de date: tipul numeric, tipul
sir de caractere, tipul sir de biti, data calendaristica, tip timp etc.
Tipul numeric include numere intregi de diferite dimensiuni, numere reale
sau numere zecimale.
Tipul sir de caractere permite definirea sirurilor de caractere de lungime
fixa sau lungime variabila.
Tipul siruri de biti defineste secvente de cifre binare, adica care pot lua
valoarea 0 sau 1 cu o lungime fixa sau variabila.
Tipurile pentru data calendaristica si timp sunt de genul: date, time sau
interval.
Domeniile atributelor in SQL se specifica pe baza tipurilor de date
predefinite ale limbajului SQL, deci sunt destul de departate de notiunea de
domeniu relational pentru ca nu se face nici o precizare a semnificatiei
domeniului.

Instructiuni SQL de definire a datelor


Componenta de definire a datelor in SQL permite crearea (create),
modificarea (alter) si distrugerea (drop) a obiectelor din baza de date.
Crearea tabelelor: sintaxa instructiunii create este: create table, nume tabela
(coloana 1 domeniul 1, coloana 2 domeniul 2, coloana n domeniul n,
[constrangeri tabela]). Crearea unei tabele se poate face prin instructiunea create
table, studenti (nume caracter de 20, prenume caracter de 20, data nasterii date,
sex caracter de 1, specializare caracter de 20). Tabelele create cu instructiunea
create table sunt numite si tabele de baza. Ele sunt memorate in fisierele bazei de
date si pot fi accesate pentru introducerea, modificarea si interogarea datelor.
Vederile sau view sunt tabele virtuale care nu sunt memorate fizic in
fisiere, ci reprezinta o selectie dupa un anumit criteriu a datelor memorate in una
sau mai multe tabele de baze.
Comanda de modificare a datelor (alter table) permite adaugarea sau
stergerea unor atribute, modificarea domeniilor unor atribute, precum si
adaugarea, modificarea sau stergerea unor constrangeri ale tabelei. Pentru
stergerea unei coloane dintr-o tabela se foloseste cuvantul cheie drop in comanda
alter table. De exemplu, daca vrem sa stergem data nasterii din tablea studenti,
vom avea instructiunea alter table studenti drop data nasterii.

Instructiuni SQL de manipulare a datelor


Instructiunile SQL de manipulare a datelor contin una din comenzile
SELECT, INSERT, UPDATE sau DELETE.
SELECT – instructiunea SELECT este instructiunea de interogare in
limbajul SQL prin care se regasesc informatiile dorite din una sau mai multe
tabele ale bazei de date. Sintaxa generala a instrctiunii SELECT este: SELECT
[distinct] lista coloanelor FROM tabele [WHERE] [clauze secundare]. Ca rezultat
al instructiunii SELECT se obtine o tabela care contine atributele (coloanele) din
lista coloane ale acelor linii (tupluri) ale produsului cartezian al tabelelor ce
urmeaza dupa FROM pentru care expresia logica conditie este adevarata. Cluaza
WHERE defineste conditia pe care trebuie sa o indeplineasca fiecare linie a
tabelei rezultat. In afara acestor clauze, comanda SELECT mai poate contine si
alte clauze secundare cum este ORDER BY, GROUP BY sau HEADING care
permit ordonari sau grupari ale rezultatelor.
Clauza SELECT: introduce lista coloanelor din tabele care vor fi selectate
si afisate. Coloanele din aceasta lista trebuie sa apartina uneia dintre tabelele
specificate in clauza FROM. De exemplu, daca dorim afisarea numelui si
prenumelui din tabela studenti vom avea: SELECT nume, prenume FROM
studenti. Ca rezultat al acestei instructiuni se pot obtine doua sau mai multe linii
identice daca exista studenti cu acelasi nume si prenume. Pentru eliminarea
liniilor duplicate, se introduce cuvantul DISTINCT dupa SELECT (SELECT
DISTINCT nume, prenume FROM studenti). Daca in loc de lista coloanelor se
foloseste simbolul asterix (*) atunci vor fi afisate toate atributele produsului
cartezian al tabelelor indicate prin clauza FROM care indeplinesc conditia din
clauza WHERE. De exemplu, daca se doreste afisarea tuturor datelor din tabela
studenti vom avea SELECT * FROM studenti.
In clauza SELECT se pot introduce si functii de totalizare (functii agregat)
care sunt: COUNT numara liniile din rezultat, SUM face suma tuturor valorilor
dintr-o coloana, MAX arata valoarea maxima dintr-o coloana, MIN arata valoarea
cea mai mica dintr-o coloana si AVG care face media aritmetica a valorilor dintr-
o coloana. De exemplu, daca vrem sa vedem cati studenti avem la specializarea
MANAGEMENT (SELECT COUNT (*) FROM Studenti WHERE
SPECIALIZARE=”MN”). Suma tuturor varstelor studentilor (SELECT SUM
(VARSTA) FROM Studenti). Care este varsta cea mai mare a unui student
(SELECT MAX (VARSTA) FROM Studenti). Care este varsta minima pentru
un student (SELECT MIN (VARSTA) FROM Studenti). Media valorilor dintr-o
coloana cu AVG, care este varsta medie a studentilor (SELECT AVG (VARSTA)
FROM Studenti). Media varstei fara AVG (SELECT SUM (VARSTA)/ COUNT
(*) FROM Studenti).
In clauza SELECT se pot redenumi atributele sau se pot specifica nume
pentru expresii folosind AS urmat de noul nume care va aparea in rezultat. De
exemplu, daca dorim redenumirea atributului SPEC in SPECIALIZARE pentru
toti studentii vom avea (SELECT NUME, SPEC AS SPECIALIZARE FROM
STUDENTI).
OBS: Intotdeauna dupa AS noul nume va fi un singur sir de caractere
Baze de Date 9
Clauza FROM este obligatorie daca intr-una din clauzele
SELECT,WHERE sau HAVING apar numele unor coloane din unele tabele. In
acest caz lista de tabele care insoteste clauza FROM, trebuie sa contina numele
tuturor tabelelor ale caror coloane se folosesc. Daca lista contine mai mult de o
tabela, atunci numele coloanelor din clauza SELECT trebuie sa fie diferite si daca
nu sunt diferite se precizeaza tabela careia ii apartine, notandu-se numele tabelei.
si numele coloanei,
Clauza WHERE restrictioneaza tuplurile returnate ca rezultat la acele
tupluri care indeplinesc conditia introdusa de aceasta clauza sub forma unei
expresii logice. O expresie logica se construieste din valori logice, operatori logici
(AND,OR si NOT) si paranteze. O valoare logica se obtine in mod obisnuit ca
rezultat al comparatiei intre 2 operanzi, folosind un operator de comparatie. Un
operand poate fi un atribut (nume de coloana), o constanta, valoarea unei expresii
aritmetice sau o valoare returnata de o functie.
Clauza ORDER BY introduce numele atributului dupa care se face
ordonarea liniilor tabelei rezultat. Ordonarea se face in ordine crescatoare in mod
implicit sau daca numele atributului este urmat de cuvantul cheie ASC. Daca
numele atributului este urmat de cuvantul cheie DESC, ordonarea se face in
ordine descrescatoare a valorilor acelui atribut.
Clauza GROUP BY se foloseste pentru gruparea rezultatelor functiilor
agregat in functie de valoarea uneia sau mai multor coloane. Pentru aceasta, in
instructiunea SELECT, se introduce clauza GROUP BY urmata de numele
coloanei sau al coloanelor dupa valoarea carora se doreste gruparea rezultatelor
functiei agregat. In acest caz, functia agregat se aplica separat acelor linii care au
aceasi valoare a atributelor specificate de clauza GROUP BY
Clauza HAVING: functiile agregat nu pot fi utilizate in clauza WHERE si
de aceea se foloseste clauza HAVING. Clauza HAVING este asemanatoare
clauzei WHERE, adica introduce o conditie pe care trebuie sa o indeplineasca
tuplurile rezultat.
Curs 10 Baze de Date
Instructiunea INSERT se foloseste pentru introducerea datelor in tabele si
are urmatoarea sintaxa: INSERT INTO TABELA (coloana_1, coloana_2...
coloana_n) VALUES (val_1, val_2... val_n). Intre valori si numele coloanelor
trebuie sa existe o corespondenta de 1 la 1, lista de coloane poate sa lipseasca
daca valorile se introduc exact in ordinea coloanelor tabelei.

Instructiunea UPDATE permite actualizarea valorilor coloanelor din una


sau mai multe linii ale unei tabele. Clauza WHERE impune ca actualizarea
valorilor coloanelor sa se efectueze numai asupra acelor linii care indeplinesc
conditia data. Sintaxa generala este: UPDATE tabela, set coloana1=expresie1
[WHERE conditie]. Daca este omisa clauza WHERE, vor fi modificate valorile
din toate liniile tabelei.

Instructiunea DELETE permite stergerea uneia sau mai multor linii dintr-
o tabela ce are sintaxa: DELETE FROM tabel [WHERE conditie]. Din tabela se
sterg acele linii care indeplinesc conditia data in clauza WHERE. Daca este omisa
clauza WHERE, vor fi sterse toate liniile din tabela.
Curs Baze de Date 11- Constrangeri de
integritate
Constrangerile de integritate sunt reguli care se definesc la proiectarea unei
baze de date si care trebuie sa fie respectate de orice stare a acesteia. Relatiile
unei baze de date reflecta realitatea moderata si de aceea valorile pe care le scoti
trebuie sa respecte anumite reguli care sa corespunda celor din realitate.
Constrangerile se pot clasifica dupa locul unde sunt definite si dupa modul in care
sunt definite. Din punct de vedere al locului unde sunt definite, constrangerile pot
fi constrangeri intra-relatie si constrangeri inter-relatie.
Constrangerile intra-relatie sunt reguli care se impun in cadrul unei singure
relatii si asigura integritatea datelor acesteia. Ele sunt la randul lor de 3 categorii:
1- constrangeri de domeniu
2- constrangeri de tuplu
3- constrangeri impuse prin dependente de date
Constrangerile inter-relatii sunt reguli care se impun intre doua sau mai
multe relatii. Cele mai importante constrangeri inter-relatii sunt constrangerile de
integritate referentiala care se realizeaza prin intermediul cheilor straine si asigura
asocierea corecta a relatiilor.
Din punct de vedere al modului de definire, constrangerile unei baze de
date se pot clasifica in constrangeri inerente, implicite si explicite. Constrangerile
inerente sunt cele ale modelului de date insusi care nu trebuie sa fie specificate la
definirea relatiilor dar sunt respectate prin modul in care se construiesc relatii.
De exemplu in modelul relational, constrangerea ca valoare a fiecarui
atribut sa fie atomica, adica indivizibila, este o constrangere inerenta
Constrangerile implicite sunt reguli care se definesc odata cu definirea
schemelor relatiilor, sunt memorate in baza de date si sistemul de gestiune
verifica si impune automat respectarea lor. Constrangerile de domeniu,
constrangerile de tuplu si constrangerile de integritate referentiala sunt exemple
de constrangeri implicite.
Constrangerile explicite sunt constrangeri suplimentare pe care trebuie sa
le respecte relatiile unei baze de date si care nu sunt impuse automat de sistemul
de gestiune de baze de date si necesita proceduri speciale de verificare si
impunere a respectarii lor.
Constrangeri de domeniu
Constrangerile de domeniu sunt conditii impuse valorilor atributelor astfel
incat acestea sa corespunda semnificatiei pe care o au in realitatea modelata.
Dintre constrangerile de domeniu, constrangerea NOT NULL si constrangerea de
valoare implicita sunt constrangeri cu caracter general care se pot aplica oricarui
atribut.
Nu orice atribut poate lua valoarea NULL. De exemplu, tabela studenti
(nume, data nasterii, specializare, adresa...) nu are sens sa inregistreze un student
al carui nume nu se cunoaste, deci pentru care sa se admita valoarea de NULL
pentru atributul nume. In aceste situatii, la definirea relatiilor se impune pentru
anumite atribute constrangerea NOT NULL, insemnand ca atributul nu poate lua
valoarea NULL in niciun tuplu al relatiei. Constrangerea NOT NULL pentru un
atribut se introduce la crearea relatiei prin comanda Create Table.
Valorile implicite ale atributelor se stabilesc pentru unul sau mai multe
atribute ale unei relatii. In cazul in care la inserarea unui tuplu nu se specifica
valoarea unui atribut, atunci atributul primeste valoarea implicita daca a fost
definita sau valoarea NULL daca nu a fost definita o valoare implicita pentru
atributul respectiv dar sunt admise valori NULL. In situatia in care nu a fost
definita o valoare implicita, si nici nu sunt admise valori NULL, se genereaza o
eroare.
In limbajul SQL, valoarea implicita a unui atribut se poate specifica la
crearea tabelei corespunzatoare ca o constrangere de coloana impreuna cu alte
constrangeri.
Constrangerea de verificare in limbajul SQL, domeniile se pot stabili ca
tipuri de date predefinite cum este tipul numeric, text sau sir de caractere, data
calendaristica etc. Pentru fiecare atribut definit pe un tip de date SQL se pot
adauga constrangeri de verificare la definirea tabelei prin comanda Create Table.

Constrangerile de tuplu
O relatie este definita ca o multime de tupluri, deci tuplurile unei relatii
trebuie sa fie distincte. Aceasta inseamna ca intr-o relatie nu pot exista 2 sau mai
multe tupluri care sa contina aceasi combinatie de valori ale tuturor atributelor.
De obicei intr-o schema de relatie exista o submultime de atribute SK cu
proprietatea ca nu exista doua tupluri distincte ale relatiei TI si TJ care sa aiba
aceasi combinatie de valori ale atributelor submultimilor respective, adica TI
(SK) este diferit de TJ (SK) daca TI este diferite de TJ.
O super cheie a relatiei este o submultime SK de atribute ale relatiei care
prezinta proprietatea de unicitate, adica orice combinatie de valori ale atributelor
supercheii este unica pentru orice stare a relatiei. O cheie candidata este o super
cheie ireductibila. Cheia candidata trebuie sa prezinte urmatoarele doua
proprietati:
1- unicitate, adica nu exista doua tupluri diferite ale relatiei care sa contina
aceasi combinatie de valori ale atributelor cheii candidate
2- ireductibilitate, adica nu exista nicio submultime proprie nevida a cheii
candidate care sa aiba proprietatea de unicitate
Acest lucru inseamna ca daca se elimina un atribut oarecare din
submultimea cheii candidate, noua submultime de atribute nu mai are proprietatea
de unicitate, adica vor putea exista doua sau mai multe tupluri care sa prezinte
aceeasi combinatie de valori ale atributelor din submultimea cheii candidate.
Asadar o cheie candidata este o super cheie minimala, adica o super cheie din
care nu se mai poate elimina niciun atribut fara sa se piarda proprietatea de
unicitate.
Proprietatea cheii de a avea o valoare unica pentru fiecare tuplu este o
constrangere de integritate a tuplurilor relatiei respective care trebuie sa fie
respectata de orice stare a relatiei in orice moment. O cheie candidata poate sa fie
simpla daca este alcatuita dintr-un singur atribut sau compusa daca este alcatuita
din mai multe atribute. Atunci cand exista mai multe chei candidate, una dintre
ele se alege ca si cheie primara, celelalte fiind numite chei secundare, alternative
sau unice.
Curs 12 Baze de Date
O cheie primară este o cheie candidată, căreia proiectantul îi conferă un rol special de
accesare și identificare a tuplurilor relației. Asupra cheii primare se impun următoarele
restricții: 1- nici o valoare atributelor cheii primare nu poate fi modificată prin operații de
actualizare a datelor.
2- nu se admit valori de NULL pentru nici unul din atributele cheii primare.
O cheie secundară este o cheie candidată care nu a fost desemnată de proiectant ca și
cheie primară. Cheile secundare admit valori de NULL pentru unele din atributele lor dacă se
respectă condiția de unicitate a valorilor. Alegerea cheii primare din mai multe chei candidate
este arbitrară, dar în mod obișnuit, se alege acea cheie cu cel mai mic număr de atribute.
Deoarece condiția de unicitate se verifică la fiecare tuplu nou introdus, și toate operațiile de
identificare a tuplurilor se fac prin operații de comparație a valorilor atributelor cheii primare,
este evident că aceste operații sunt cu atât mai eficiente cu cât numărul de atribute ale cheii
primare este mai mică.
O cheie primară compusă din atributele existente ale tipului de entitate se numește cheie
naturală. În general, cheile naturale sunt compuse din mai multe atribute, ceea ce conduce la
scăderea eficienței operaților relaționale, de aceea, de foarte multe ori se introduc chei
artificiale.
O cheie artificială primară este un atribut care se adaugă în schema relației pentru
identificarea unică a tuplurilor. De exemplu, dacă presupunem o tabelă cu studenții unei
universități, putem introduce câmpul artificial număr matricol, prin care fiecare student este
identificat în mod unic. Câmpul CNP nu poate fi folosit în acest caz ca și cheie primară,
deoarece o persoană poate fi student la mai multe facultăți și atunci CNP-ul s-ar repeta,
nemaiputând fi o cheie unică.
În limbajul SQL, constrângerea de cheie primară se introduce la definirea relației prin
comanda CREATE TABLE. Dacă cheia primară este simplă, adică formată dintr-un singur
atribut, constrângerea de cheie primară se poate specifica la definirea atributului ca o
constrângere de atribut. Dacă cheia primară este compusă, adică formată din mai multe atribute,
atunci constrângerea de cheie primară se specifică după definirea atributelor ca o constrângere
de tabelă

Constrângeri între relații


Cheia străină – asocierile între tipurile de entități definite în modelul conceptual prin
diagrama entitate asociere a unei baze de date se realizează în modelul relațional prin
intermediul cheilor străine.
EXEMPLU: Relațiile secții și angajați se află într-o asociere de tip 1:N, ceea ce
înseamnă că o secție poate avea mai mulți angajați, dar un angajat poate lucra cel mult într-o
secție. Pentru a asigura asocierea dintre relația angajați și secții, se adaugă în relația angajați
un atribut suplimentar cod_ secție, care reprezintă codul secției în care lucrează angajatul
respectiv. Pentru orice tuplu din relația angajați, atributul cod_secție trebuie să aibă o valoare
egală cu valoarea atributului corespunzător dintr-un tuplu oarecare din relația secții.
O cheie străină este o submulțime de atribute ale unei relații R1 care referă relația R2
și satisface următoarele condiții:1 - atributele cheii străine sunt definite pe domenii compatibile
cu cele ale atributelor unei chei candidate din relația.
2 – Combinația de valori ale atributelor cheii străine într-un tuplu din relația R1, fie este
identică cu combinația de valori ale atributelor cheii candidate al unui tuplu oarecare din starea
curentă a relației R2 fie ia valoarea NULL.
Relația care conține cheia străină se numește relația care referă, iar relația care conține
cheia candidată se numește relația referită. Din punct de vedere relațional, două domenii sunt
compatibile dacă ele sunt comparabile din punct de vedere semantic. De exemplu, are sens să
se compare atributul cod_secție din relația secții cu atributul cod_secție din relația angajați,
deoarece aceste atribute reprezintă coduri de identificare ale secțiilor, deci domeniile celor 2
atribute sunt compatibile. În schimb, nu are sens să fie comparate codurile de identificare ale
secțiilor cu codul de identificare al angajaților, deoarece domeniile celor 2 atribute sunt
incompatibile.
Cheia străină realizează asocierea N:1 între relațiile R1 și R2 și reprezintă o
constrângere între 2 relații numită constrângere referențială. Integritatea referențială este
proprietatea bazei de date care garantează că oricare valoare a unei chei străine se regăsește
printre valorile cheii candidate corespunzătoare din relația referită, sau cheia străină are
valoarea NULL.
Curs 13 Baze de Date Indexarea relațiilor
Unul din avantajele sistemelor de gestiune este acela că eliberează
proiectantul bazei de date de necesitatea de a cunoaște detaliile de organizare a
datelor prin asigurarea independenței datelor. Totuși, această independență nu
este completă, și în stadiul actual de realizare a sistemelor de baze de date,
programatorii de aplicații trebuie să ia în considerare influența pe care modul de
stocare de regăsire a datelor îl are asupra performanțelor aplicațiilor.
Într-o relație privită ca o colecție de elemente în care nu sunt admise
elemente duplicat, operațiile de bază sunt ca în orice colecție de elemente:
căutarea, inserarea și ștergerea unui element, cărora le corespund operațiile de
interogare, inserare și ștergere, de exemplu din SQL.
În cazul unei mulțimi reprezentate printr-o colecție neordonată de
elemente, timpul de căutare a unui element crește proporțional cu numărul de
elemente ale mulțimii deoarece, în cazul cel mai defavorabil, este necesar să fie
parcurse toate elementele colecției pentru a găsi elementul dorit. Timpul de
căutare a unui element poate să fie micșorat dacă elementele mulțimii sunt
ordonate.
Pentru inserarea unui element într-o mulțime trebuie mai întâi să fie căutat
elementul respectiv în mulțimea respectivă. Dacă există deja un element identic,
se interzice inserarea noului element. Dacă nu există, atunci se introduce noul
element. În general, operațiile de căutare, inserare și ștergere a elementelor dintr-
o mulțime se execută mai rapid dacă elementele mulțimii sunt reprezentate printr-
o colecție ordonată.
Un index al unei relații este o structură auxiliară, memorată în baza de date,
care permite accesul rapid la înregistrările relațiilor prin ordonarea acestora. La
definirea unei relații se stabilesc două categorii de indexuri: indexul primar al
relației care determină localizarea tuplurilor în fișierele bazei de date și zero, unul
sau mai multe indexuri conectate care nu modifică localizarea înregistrărilor, dar
sunt folosiți pentru regăsirea tuplurilor după un criteriu dat.
Indexul primar se definește pe unul sau mai multe atribute ale relației și
reprezintă cheia după care se ordonează înregistrările relației. Operațiile de
căutare sau ștergere în care se specifică valoarea atributului index primar se
execută eficient. Astfel, se calculează mai întâi grupul căruia îi aparține
înregistrarea și apoi se caută poziția înregistrării în lista înlănțuită,
corespunzătoare grupului. După aceasta se continuă cu operații specifice de
ștergere sau citire la nivelul înregistrării găsite.
Un index secundar pe un atribut A al unei relații este o structură care
conține o mulțime de perechi de genul V,L ordonate după V, fiecare pereche
corespunzând unei înregistrări a relației, unde V este valoarea atributului A, iar L
este adresa înregistrării respective în structura indexului primar al relației
Observație: Deoarece indexurile sunt folosite în special pentru
îmbunătățirea performanțelor bazelor de date și nu fac parte din modelul
relațional de bază, ei nu sunt cuprinși în standardul limbajului SQL

S-ar putea să vă placă și