PREFAŢĂ

Istoria bazelor de date relaţionale începe în 1970 o dată cu publicarea articolului lui Edgar Frank Codd „A Relational Model of Data for Large Shared Data Banks” care descrie modelarea datelor sub formă de relaţii (termen matematic, reprezentarea intuitivă a unei relaţii fiind o tabelă) şi operaţiile de bază cu acestea. A durat aproape 10 ani până la apariţia primelor sisteme de gestiune a bazelor de date (SGBD) bazate pe acest model, timp în care s-au dezvoltat algoritmi şi metode de a realiza în timp util operaţiile cu tabele. O serie de firme prestigioase au investit în cercetări privind modelul relaţional al datelor, printre acestea numărându-se şi IBM care a lansat în anii ’70 dezvoltarea unui prototip de cercetare numit System R. În cadrul acestui sistem – care nu a fost niciodată comercializat ca atare, fiind folosit doar ca instrument de cercetare – a fost dezvoltat şi un limbaj de cereri prin care utilizatorul interacţiona cu datele din baza de date numit SEQUEL (de la Structured English-like Query Language) redenumit apoi din motive comerciale SQL. System R a fost tatăl sistemului DB2 pe care IBM îl comercializează şi în momentul actual. Lucrarea de faţă îşi propune să prezinte atât fundamentele teoretice ale modelului relaţional (capitolele 1-4 şi 6) cât şi limbajul de cereri SQL care a devenit în timp limbajul standard de comunicare cu un sistem de gestiune (capitolul 5). În exemplele din capitolul dedicat SQL s-au folosit următoarele convenţii care să asigure o mai mare claritate şi lizibilitate: • S-a preferat scrierea cu litere mari a cuvintelor cheie şi identificatorilor. • Fiecare nouă clauză a unei cereri a fost scrisă începând cu o nouă linie. • S-a folosit indentarea în cazul expresiilor lungi şi a subcererilor.

2011

Autorii

6

BAZE DE DATE ON-LINE

CUPRINS
1. Concepte şi problematică ..................................................................9 1.1. Bază de date şi Sistem de gestiune a bazelor de date ...............9 1.2. Funcţiile unui SGBD ...............................................................11 1.3. Categorii de utilizatori .............................................................13 1.4. Nivele de descriere a unei baze de date ..................................13 2. Modelarea datelor ...........................................................................15 2.1. Etapele dezvoltarii unei aplicatii ............................................15 2.2. Modelul entitate-asociere clasic .............................................18 2.3. Modelul entitate-asociere utilizat în instrumente CASE ........25 3. Modelul relaţional ...........................................................................27 3.1. Modele de date: ierarhic, reţea, relaţional ..............................27 3.2. Elementele de baza ale modelului relational ..........................28 3.3. Transformarea diagramelor EA in modelul relational ............30 3.4. Algebra relaţională ..................................................................31 3.5. Calcul relational ......................................................................36 4. Proiectarea bazelor de date .............................................................37 4.1. Anomalii care apar în cazul proiectării incorecte ...................37 4.2. Dependenţe funcţionale ..........................................................38 4.3. Forme normale ........................................................................45 4.4. Descompunerea schemelor de relaţie .....................................47 4.5. Dependenţe multivalorice. Forma normală 4 .........................52 5. Limbajul SQL .................................................................................55 5.1. Interogarea datelor ..................................................................56 5.2. Cereri simple ...........................................................................57 5.3. Cereri cu clauza WHERE .......................................................58 5.4. Metode de join ........................................................................61 5.5. Equi-join si non equi-join .......................................................62 5.6. Joinul unei tabele cu ea insăşi .................................................63 5.7. Join extern ...............................................................................63 5.8. Join vertical .............................................................................64 5.9. Funcţii în SQL .........................................................................65

..........................................................2........8 BAZE DE DATE ON-LINE 5. Tranzacţii şi acces concurent ..........................................................................................88 6..............93 6..... Terminologie ..........................16................................3.........89 6.........86 6...... Subcereri SQL .........................85 Comanda DELETE ...80 Comanda ALTER TABLE ................. Prezentarea problematicii..14.....................................86 Comanda UPDATE ...............12.........13.......................................4.......................5............ Asigurarea consistentei la citire ....91 6....... 5...........88 6....... Gestiunea tranzacţiilor ......83 Comanda INSERT ........................10............................................77 Constrângeri de integritate ..............15..... 5.... 5..74 Crearea şi definirea structurilor tabelare .................................11.................... Serializabilitate ..... 5....... 5.......................................1........... 5............... Protocolul de blocare in doua faze ............94 ..........................

Concepte şi problematică 9 .

Definiţie: Un sistem de gestiune a bazelor de date este ansamblul de programe care permit utilizatorului să interacţioneze cu o bază de date. CONCEPTE ŞI PROBLEMATICĂ În acest moment termenul de bază de date a intrat în limbajul curent fiind folosit uneori şi în alte accepţiuni decât cea de provenienţă. În cazul modelului relaţional . Bază de date şi Sistem de gestiune a bazelor de date Literatura de specialitate conţine mai multe definiţii pentru conceptele de bază de date şi sistem de gestiune a bazelor de date. În continuare sunt prezentate două definiţii apreciate pentru valoarea lor descriptivă. 1. Aceste definiţii conţin majoritatea elementelor importante ale problematicii bazelor de date prezentate în capitolele urmatoare: … un ansamblu structurat de date … Nu orice colecţie de date este o bază de date. Termenul de relaţie (care dă denumirea modelului) provine din matematică iar reprezentarea intuitivă a unei relaţii este o tabelă. datele sunt organizate sub formă de tabele. O cerinţă primordială este aceea a organizării acestora după anumite reguli. Popularitatea acestui model este datorată simplităţii sale (din punct de vedere al utilizatorului) şi a posibilităţii de definire a unor limbaje neprocedurale de descriere şi manipulare a datelor. În acest moment majoritatea sistemelor de gestiune sunt bazate pe modelul relaţional al datelor în care. Capitolul se incheie cu prezentarea celor trei nivele de descriere ale unei baze de date şi a conceptului de independenţă dateprogram.1. Definiţie: O bază de date este un ansamblu structurat de date înregistrat pe suporturi accesibile calculatorului pentru a satisface simultan cerinţele mai multor utilizatori într-un mod selectiv şi în timp util.1. Regulile şi conceptele care permit descrierea structurii unei BD formează modelul datelor. Sunt prezentate apoi funcţiile pe care trebuie să le asigure un SGBD şi categoriile de utilizatori ale unui astfel de sistem. În acest capitol sunt definite conceptele de bază de date (BD) şi sistem de gestiune a bazelor de date (SGBD) şi se face o trecere în revistă a elementelor conţinute în aceste definiţii. intuitiv.

.înregistrat pe suporturi accesibile calculatorului .. Gestiunea utilizatorilor.. . rezolvarea problemelor pe care le poate ridica aşteptarea circulară pentru deblocarea acestor porţiuni (deadlock). În cazul accesului simultan al mai multor utilizatori la aceleaşi date un SGBD trebuie să aiba mecanisme pentru a preîntâmpina inconsistenţa datelor. Mecanismul de drepturi de acces are ca obiective principale: • Blocarea accesului unor categorii de utilizatori la date pe care nu trebuie să le acceseze.. 2. modificarea şi stergerea utilizatorilor. Dacă ansamblul de date nu este înregistrat pe suporturi accesibile calculatorului acesta nu se poate numi bază de date în accepţiunea lucrării de faţă.. Operaţia este efectuată de obicei de administratorul bazei de date.Concepte şi problematică 11 descrierea structurii unei baze de date constă în principal din descrierea tabelelor componente: denumire. În acest fel este asigurata una dintre funcţiunile de baza ale unui SGBD şi anume confidenţialitatea datelor. Un SGBD trebuie să permită crearea. Capitolul 6 prezinta problemele legate de blocarea (acapararea) unor porţiuni ale BD de catre o execuţie a unui program.. într-un mod selectiv . • Blocarea accesului unor categorii de utilizatori la date de care nu au nevoie în activitatea lor. pentru a satisface simultan cerinţele mai multor utilizatori Funcţiile unui SGBD relative la accesul utilizatorilor la baza de date sunt urmatoarele: 1. execuţia paşilor programelor de actualizare echivalentă cu o execuţie secvenţială a programelor (serializabilitate) şi reguli de scriere a programelor de aplicaţie pentru rezolvarea problemelor de acces concurent. Orice SGBD are mecanisme prin care diverşilor utilizatori sau categorii de utilizatori li se asociază drepturi de acces specifice la obiectele bazei de date. listă de coloane şi tipul datelor din acestea. Concurenţa la date. În limbajul curent se întalnesc expresii ca: "avem această informaţie în baza noastră de date" şi în cazurile în care datele respective sunt de exemplu stocate sub forma unor fişe (pe hârtie) sortate alfabetic sau după alte criterii.. minimizându-se astfel riscul distrugerii accidentale a datelor prin operaţii necorespunzatoare. În acest caz este vorba despre o extensie a termenului de bază de date.. În acest mod fiecărui utilizator i se dă dreptul de a efectua doar operaţiile specifice activităţii sale şi doar pe acea portiune a bazei de date care este necesară pentru acestea. ... .. În cazul sistemelor de gestiune a bazelor de date suporturile pe care sunt stocate datele sunt în principal magnetice şi optice.

În cazul bazelor de date relaţionale aceasta constă în principal în posibilitatea creării şi modificării structurii tabelelor şi constrângerilor de integritate asociate acestora. De asemenea. De aceea orice SGBD are mecanisme prin care minimizează timpul de răspuns. operaţii mai complicate prin care se regăsesc date stocate în mai multe tabele legate între ele prin coloane comune pot duce în lipsa unor algoritmi specifici la timpi de execuţie inacceptabili. Funcţiile unui sistem de gestiune a bazelor de date sunt urmatoarele: Descrierea datelor Un SGBD trebuie să includă posibilitatea descrierii stucturii obiectelor care formează baza de date. Regăsirea datelor după anumite criterii de căutare . Cele patru categorii de operaţii principale sunt următoarele: • • • • Inserarea de noi date. selectivitatea accesului şi timpi de execuţie normali pentru cereri..12 BAZE DE DATE ON-LINE . mecanisme bazate în special pe indecşi şi modalităţi specifice de organizare fizică a datelor. Operaţiile asupra datelor sunt efectuate de sistemul de gestiune a bazelor de date. Actualizarea datelor.. însemnând modificarea conţinutului unor linii existente în tabele.2.. Limbajul prin care se realizează aceste operaţii se numeste Limbaj de Descriere a Datelor (LDD) şi în cazul primelor sisteme de gestiune el era implementat sub forma unor module separate. Aceasta se concretizează prin adăugarea de noi linii în tabelele care formează baza de date. şi în timp util .. În sistemele relaţionale bazate pe SQL aceste operaţii au fost incluse în limbaj sub forma comenzilor de tip CREATE (pentru creare) sau ALTER (modificare). accesul concurent al utilizatorilor. În cazul bazelor de date de dimensiuni mari este evident ca orice cautare care s-ar baza pe o parcurgere secvenţială a înregistrarilor din tabele ar duce la timpi de răspuns inadecvat de mari. Deci ea reprezintă depozitul de date al oricărei aplicaţii de gestiune. Ştergerea de linii din tabele. Dar acestea sunt doar o parte din operaţiile pe care acesta trebuie să le asigure. 1. partea sa statică. Funcţiile unui SGBD O definiţie alternativă a conceptului de bază de date este următoarea: o bază de date este o colecţie de date interconectate. Utilizarea datelor Această funcţie include operaţiile de lucru cu datele înregistrate într-o bază de date. El este cel care asigură structurarea datelor.

ambele valori fiind în intervalul admisibil. Un utilizator este identificat uzual printr-un nume-utilizator şi o parolă. În cazul în care o operaţie are ca rezultat violarea acestor restricţii aceasta este automat rejectată şi nu are efect în baza de date. Definirea de constrângeri de integritate nu previne însă total erorile accidentale de operare: de exemplu introducerea din greşeală a unei note de 4 în loc de 5 nu va fi semnalată. În cazul mai multor execuţii simultane care accesează baza de date se consideră că efectul lor este corect dacă rezultatul final este identic cu execuţia lor succesivă. Facilităţi de blocare a unor porţiuni ale bazei de date.Concepte şi problematică 13 Pentru implementarea acestei funcţii fiecare SGBD are un Limbaj de Manipulare a Datelor (LMD) care poate fi un modul separat sau inclus în limbajul sistemului cum este în cazul SQL. 2. Aceasta înseamnă că o execuţie a unui program poate căpăta un acces exclusiv la o porţiune a bazei de date. siguranţa în funcţionare este o caracteristica esenţială pentru un SGBD şi conţine acele . Siguranţa în funcţionare Desi nu este legată direct de cele prezentate până acum. O altă posibilitate de asigurare a confidenţialităţii este aceea a accesului la datele din baza de date doar prin intermediul unor programe de aplicaţie. Modalităţi de evitare sau de eliminare a interblocarii. Confidenţialitatea datelor În cazul unui SGBD accesul la date este permis doar utilizatorilor înregistraţi şi doar în măsura drepturilor de acces alocate. Execuţia serializabilă. 3. În felul acesta este asigurată o mai mare siguranţă în ceea ce priveşte corectitudinea datelor. Fiecărui utilizator i se permite accesul doar la o porţiune a bazei de date şi doar pentru a efectua anumite tipuri de operaţii. Accesul concurent la date Există trei tipuri de probleme pe care un SGBD trebuie să le rezolve pentru a asigura accesul concurent corect al mai multor utilizatori la aceeaşi bază de date: 1. Integritatea datelor Majoritatea sistemelor de gestiune permit definirea unor reguli pe care datele stocate trebuie să verifice numite constrângeri de integritate. În cazul bazelor de date accesate în reţea se pot defini de asemenea locaţiile de la care utilizatorul poate interacţiona cu baza de date. Utilizatorii acestor programe nu sunt în acelasi timp şi utilizatori înregistraţi ai SGBD-ului care gestionează datele iar porţiunea din baza de date la care au acces este cablată în program.

• Restaurarea după incident. moştenind drepturile de acces ale acestora. 1. Termenul consacrat pentru descrierea structurii unei baze de date . Termenul generic pentru acest tip de utilizatori este cel de administratori ai bazei de date şi în general este vorba de una sau mai multe persoane care răspund de buna funcţionare a SGBD-ului. un SGBD are două tipuri principale de utilizatori: Utilizatori privilegiaţi Aceştia sunt utilizatori care au dreptul de a afectua toate tipurile de operaţii puse la dispoziţie de sistem. Din punct de vedere al drepturilor de acces. Nivele de descriere pentru o bază de date O aceeasi bază de date poate fi privită din diverse perspective rezultând descrieri diferite. În cazul apariţiei de incidente hardware sau software care au ca efect distrugerea bazei de date este necesară efectuarea operaţiei de restaurare care să minimizeze volumul de operaţii al caror efect se pierde. ca şi în cazul sistemelor de operare. În cazul sistemelor mai vechi aceste facilităţi erau suplinite de opţiunile de copiere sau arhivare a fişierelor bazei de date oferite de sistemul de operare pe care rula SGBD-ul. Categorii de utilizatori În paragrafele precedente a fost folosit frecvent termenul de utilizator.3.4. În cele ce urmează sunt prezentate categoriile de utilizatori care interacţionează cu o bază de date. 1. Prncipalele facilităţi pe care un sistem de gestiune a bazelor de date trebuie să le asigure din acest punct de vedere sunt următoarele: • Salvarea datelor. Majoritatea sistemelor de gestiune permit definirea de categorii generice de utilizatori (numite roluri) iar fiecare utilizator individual are asociat unul sau mai multe roluri. Utilizatori neprivilegiaţi Aceştia sunt utilizatorii obişnuiti ai SGBD-ului şi dispun de drepturile de acces care le-au fost alocate de administratorul bazei de date.14 BAZE DE DATE ON-LINE elemente care exclud sau minimizează posibilitatea de pierdere a datelor datorată incidentelor software sau hardware. Actualmente implementarea operaţiilor de salvare este mult mai sofisticată având în vedere dificultatea teoretică şi practică a efectuării de copii de siguranţă consistente ale bazei de date în condiţiile în care aplicaţia rulează non-stop şi operarea nu poate fi oprită pentru efectuarea salvării. Este uşurată astfel operaţia de creare a unui nou utilizator.

etc. Independenţa fizică reprezintă posibilitatea de schimbare a schemei fizice a bazei de date fără modificarea schemei conceptuale şi implicit a schemelor externe. Ea constă într-o descriere abstractă dar exactă a structurii acesteia. Condiţia este ca modificarea să nu elimine nici unul dintre elementele necesare translaţiei de la schema externă la schema conceptuală. structura fizică a acestora. Nivelul conceptual Descrierea bazei de date la acest nivel poartă numele de schema conceptuală (numita uneori şi schema logică) a bazei de date. În literatura de specialitate există o clasificare pe trei nivele a acestor descrieri: fizic. lasând la o parte detaliile fizice de implementare.Concepte şi problematică 15 este acela de schema. O bază de date are deci asociate o singură schemă fizică şi o singură schemă conceptuală dar mai multe scheme externe. Independenţa datelor Existenţa celor trei nivele de descriere permite definirea conceptului de independenţă între datele stocate în baza de date şi aplicaţiile care utilizează aceste date. Nivelul fizic Schema fizică este descrierea bazei de date din perspectiva stocării sale pe dispozitivele fizice: identificarea discurilor şi a căilor unde este stocată. Descrierea acestor porţiuni poartă numele de scheme externe. Există două tipuri de independenţă: Independenţa logică reprezintă posibilitatea de schimbare a schemei conceptuale a bazei de date fără modificarea schemelor externe. conceptual şi extern. În lumea reala orice operaţie de modificare a bazei de date a unei aplicaţii se măsoară şi prin prisma costurilor materiale necesare modificării programelor care o folosesc. Nivelul extern Diferitele categorii de utilizatori ai unei baze de date au nevoie în activitatea lor doar de porţiuni specifice ale acesteia. Aceasta dă posibilitatea reorganizării fizice a bazei de date fără afectarea aplicaţiilor care o folosesc. . numele fişierelor care formează baza de date. Conceptul de independenţă a datelor a apărut o dată cu dezvoltarea sistemelor complexe de aplicaţii pentru care cablarea informaţiilor structurale în program constituie o bariera în calea dezvoltării şi modificării acestora.

Această abordare de tip bottom-up creează însă dificultăţi în cazul bazelor de date complexe în care numărul de tabele şi de dependenţe este mare. În capitolul următor vor fi prezentate regulile de transformare din modelul entitate-asociere în modelul relaţional. Impactul conceptelor de abstractizare şi generalizare precum şi elaborarea unui model de descriere informală a datelor. Probabilitatea ca unele interdependenţe între date să nu fie sesizate în procesul de proiectare este în aceste cazuri ridicat rezultând în exploatare anomalii care duc la reluări ale ciclului analiza cerinţelor → schema bazei de date → programe de aplicaţie. Pană la apariţia unor astfel de metodologii se pornea de la o colecţie de tabele şi de la dependenţele funcţionale şi multivalorice asociate şi se ajungea. păstrarea integrităţii. evitarea anomaliilor datorate unei proiectări nesistematice şi eliminarea subiectivismului proiectantului prin înlocuirea lui cu exactitatea metodei. Îmbunătăţirile sale ulterioare prin folosirea abstractizărilor şi generalizărilor au dus la crearea de variante ale modelului. au dus la găsirea unor căi algoritmizabile de proiectare optimă a bazelor de date. Modelul entitate-asociere este în acest moment cel mai popular model de comunicare a structurii bazelor de date datorită intuitivităţii şi simplităţii elementelor sale. Ele au fost influenţate de rezultatele obţinute în domenii care folosesc bazele de date: inteligenţa artificială. Acest capitol prezintă un model de date folosit în proiectarea conceptuală de nivel înalt numit modelul entitate asociere (EA) în varianta clasică (cu unele extensii). Etapele dezvoltării unei aplicaţii Proiectarea structurii bazelor de date relaţionale este un domeniu în care cercetările au evoluat spre elaborarea unor metodologii teoretice şi a unor instrumente software care asigură un grad ridicat de normalizare a schemelor de relaţie. prin aplicarea unor algoritmi sau metode de normalizare la schema dorită a bazei de date. şi anume modelul entitate-asociere (EA). Cercetările în domeniul proiectării schemei conceptuale s-au concentrat pe găsirea unor metodologii top-down pentru obţinerea unei structuri optime a BD. Extensiile modelului EA au apărut şi pentru alte necesităţi: . 2. proiectarea asistată de calculator.2. două dintre acestea fiind descrise în acest capitol. abordarea orientată pe obiecte. MODELAREA DATELOR Proiectarea corectă a structurii unei baze de date relaţionale este o premisă fundamentală în scrierea programelor de aplicaţie şi în funcţionarea lor fără anomaliile care pot apare în cazul unei structuri defectuoase.1.

machete ecran şi machete de rapoarte. Activităţile desfăşurate includ: • Analiza activităţii desfăşurate la momentul respectiv de beneficiarul aplicaţiei sau de o mulţime reprezentativă de beneficiari în cazul aplicaţiilor de uz general. 2. Avantajul principal al modelului EA este acela al simplităţii sale şi al caracterului său intuitiv.a prelucrărilor care se declanşează automat atât în cazul modificării bazei de date cat şi la momente prestabilite de timp (de exemplu sfârşit de lună. .care vor fi înlocuite de noua aplicaţie incluzând meniuri. de an.dacă există . etc. În general această etapă nu poate fi asistată prin programe de tip CASE dar există reguli care ajută proiectantul în realizarea sa. Cerinţe privind conţinutul bazei de date: categoriile de date care vor fi stocate şi interdependenţele dintre acestea. Cerinţe privind prelucrările efectuate de aplicaţie: prelucrările efectuate asupra datelor. machetele formatelor de introducere şi prezentare a datelor şi ale rapoartelor tipărite de aceasta. Rezultă o specificaţie neformalizată a cerinţelor constând din două componente: 1. arborele de meniuri al aplicaţiei. • Identificarea tuturor interdependenţelor dintre datele care vor fi stocate în baza de date şi a restricţiilor privind valorile pe care le pot lua anumite categorii de date. • Identificarea . Rezultatul proiectării constă într-o diagramă entitateasociere care poate fi apoi translatată în modelul de date folosit de sistemul de gestiune a bazelor de date ales pentru dezvoltarea aplicaţiei.dacă este cazul .Modelarea datelor 17 • • modelarea cerinţelor de secretizare a datelor. documentarea programelor de aplicaţie şi uşurarea comunicării între proiectantul de sistem şi utilizatorul obişnuit. • Analiza conţinutului de date şi a funcţionalităţii aplicaţiilor software . Analiza de sistem În această etapă se realizează analiza segmentului din lumea reală care va fi gestionat de aplicaţia respectivă. • proiectarea bazelor de date complexe pe porţiuni şi integrarea ulterioară a acestora (aşa numita integrare a vederilor). • Analiza formularelor tipizate şi a altor documente utilizate de beneficiar pentru realizarea activităţii respective.) • Identificarea operaţiilor care sunt necesare beneficiarului în activitatea curentă dar care în acest moment nu sunt realizate prin intermediul aplicaţiilor software folosite precum şi a operaţiilor care pot fi incluse în mod natural în noua aplicaţie.

eventualele erori putând fi corectate ulterior cu costuri semnificative. se realizează modelarea cerinţelor privind datele folosind un model de nivel înalt. Transformare în model relaţional În această etapă entităţile şi asocierile care formează diagrama EA se transformă pe baza unor reguli clare în structura relaţională a bazei de date. În cazul variantei specifice uneltelor CASE transformarea se face automat de către acestea. Rezultă schema preliminară a acesteia formată din tabele (relaţii în terminologia relaţională).evitându-se în acest fel reintroducerea manuală a acestora. • Proiectarea se poate face pe porţiuni. deci a posibilelor dezvoltări în timp ale aplicaţiei. Motivele pentru care a fost ales sunt următoarele: • Nu este legat direct de nici unul dintre modelele folosite de sistemele de gestiune a bazelor de date (relaţional sau orientat obiect) dar există algoritmi bine puşi la punct de transformare din model EA în celelalte modele de date. . Cel mai popular model folosit este modelul entitate-asociere (EA). Această etapă este efectuată de personal calificat având în vedere că rezultatele sale sunt baza de la care se pleacă în etapele următoare. Proiectarea conceptuală a bazei de date În această etapă. În capitolul 3 este descrisă o metodă de transformare din modelul EA clasic în modelul relaţional. rezultatul modelării fiind o diagramă care defineşte atât datele stocate în baza de date cât şi interdependenţele dintre acestea. Identificarea modalităţilor de transfer de date între noua aplicaţie şi alte aplicaţii care rulează deja la beneficiar şi care vor fi folosite şi în viitor de către acesta. Actualmente există pe piaţă numeroase instrumente CASE care folosesc diverse variante ale modelului. Identificarea necesităţilor privind datele şi prelucrările care pot fi în viitor necesare beneficiarului. Această caracteristică este foarte importantă în momentul în care se face punerea de acord cu beneficiarul asupra structurii bazei de date a aplicaţiei. coloanele acestora (atribute ale relaţiilor) şi constrângerile de integritate care pot fi deduse automat din diagrama incluzând unele interdependenţe între date numite şi dependenţe funcţionale. • Poate fi uşor de înţeles de nespecialişti. evitându-se în acest fel o proiectare neconformă cu realitatea sau cu cerinţele exprimate de acesta. • Este intuitiv. diagramele parţiale rezultate putând fi apoi integrate pe baza unor algoritmi şi metode bine puse la punct.18 • • • BAZE DE DATE ON-LINE Identificarea bazelor de date existente care pot fi folosite de noua aplicaţie direct sau printr-un import iniţial de date . pornind de la rezultatele analizei de sistem.

Definiţia lor informală este următoarea: . El se constituie într-o abordare de tip grafic a proiectării bazelor de date şi a fost adoptat de comunitatea ştiinţifică precum şi de producătorii de software în domeniu datorită simplităţii şi expresivităţii sale. Programul conţine atât definirea tabelelor cât şi definirea celorlalte obiecte ale bazei de date şi a interdependenţelor dintre acestea (de exemplu constrângerile de integritate intra-tabelă şi inter-tabele). Implementarea specifică sistemului de gestiune folosit În această etapă se realizează crearea structurii bazei de date obţinută în etapa precedentă pe baza facilităţilor oferite de sistemul de gestiune a bazelor de date ales. 2. P. Rezultatul ei este programul de creare scris în limbajul de definiţie a datelor acceptat de SGBD-ul utilizat. DataN Date). Modelul entitate-asociere clasic Acest model a fost introdus de P. Nume:Şir. DataN:Dată) Program de creare (SQL-Oracle): Create table Student( CodStud Number(5) Primary Key. În cazul folosirii unor unelte CASE programul de creare poate fi generat şi executat automat. Capitolul 3 conţine definiţia formelor normale uzuale şi descrierea unor algoritmi de normalizare care sunt folosiţi de uneltele CASE pentru efectuarea automată a operaţiei. Chen în 1976 ([Ch 76]). Pe baza structurii bazei de date şi a dependenţelor rezultate atât din transformarea în model relaţional cât şi a altor dependenţe identificate de proiectant în analiza de sistem se poate face o operaţie numită normalizare modificând structura bazei de date astfel încât toate tabelele din aceasta să fie în forma normală dorită. De asemenea aici se fac şi toate operaţiile privind proiectarea la nivel fizic a bazei de date. Elementele modelului Modelul entitate-asociere permite reprezentarea informaţiilor despre structura bazelor de date folosind trei elemente de construcţie: entităţi.2. Prezentăm în continuare elementele care definesc modelul entitate asociere în varianta clasică şi câteva elemente despre modelul utilizat în cazul instrumentelor CASE. Iată un exemplu: Schema conceptuală: Student(CodStud:Numeric. Nume Varchar(40).Modelarea datelor 19 Normalizare Există o serie de reguli care descriu ce înseamnă o structură corectă a unei tabele şi care definesc aşa numitele forme normale. atribute ale entităţilor şi asocieri între entităţi.

Oraşe. au existenţă independentă şi pot fi identificate în mod unic. amplasamente. Element al modelului Entitate Tip Tare Slabă Atribut De identificare Nume atribut De Descriere Asociere Asociază entităţi 1-2 Nume atribut Nume asociere Reprezentare Nume entitate Nume entitate . etc. Entităţile sunt de două categorii: • Entităţi independente (sau tari) sunt cele care au existenţă independentă de alte entităţi. De remarcat că întreaga literatură de specialitate defineşte întâi conceptul de mulţime de entităţi (sau tip de entităţi) pentru ca apoi să adopte pentru uşurinţa exprimării prescurtarea de entitate pentru acest concept. Ele definesc de obicei persoane. • Entităţi dependente (sau slabe) sunt formate din instanţe care îşi justifică încadrarea în clasa respectivă doar atâta timp cât într-o altă entitate (tată) există o anumită instanţă de care sunt dependente. obiecte sau evenimente cu importanţă informaţională. fiecare instanţă a entităţii COPII rămâne în clasa respectivă (copiii angajaţilor) atât timp cât în entitatea ANGAJAŢI există instanţa reprezentând pe tatăl/mama acelui copil. Angajaţi. Deci entitatea este un obiect generic care reprezintă mulţimea tuturor instanţelor sale. De exemplu în cazul unei baze de date de personal. Membrii unei clase care formează o astfel de entitate poartă numele de instanţe ale acelei entităţi. Exemple de entităţi: Studenţi.20 BAZE DE DATE ON-LINE Entităţile modelează clase de obiecte concrete sau abstracte despre care se colectează informaţii.

Pentru aceasta. Vârsta.Modelarea datelor 21 Asociază mai mult de 2 entităţi (exemplu: 3 entităţi) 3: . la modelul original au fost adăugate două noi concepte: ierarhia de generalizare şi ierarhia de incluziune. Grupa. 6: Fig. etc. În exemplul de mai sus Matricola este atribut de identificare (deoarece nu pot exista doi studenţi cu aceeaşi matricolă într-o facultate) pe când celelalte atribute sunt descriptori. Se observă că: Extensii ale modelului Modelul entitate-asociere clasic are unele lipsuri în ceea ce priveşte posibilitatea modelării caracteristicilor asociate unor subclase de obiecte modelate prin simple entităţi.1.1. în lumea reală putând exista între entităţile diagramei şi alte asocieri care nu sunt semnificative în contextul dat.. 2. . Atributele unei entităţi sunt de două feluri: 1. Asocierile modelează interdependenţele dintre clasele de obiecte reprezentate prin entităţi. În procesul de modelare vor fi luate în considerare doar acele proprietăţi ale entităţilor care sunt semnificative pentru aplicaţia respectivă.. la entitatea STUDENŢI nu vom lua în considerare caracteristici ca Talia sau Culoarea_părului acestea nefiind necesare pentru baza de date a universităţii (astfel de atribute ar putea exista de exemplu într-o bază de date privind personalul militar). Convenţia de reprezentare a elementelor modelului EA Atributele modelează proprietăţi atomice distincte ale entităţilor. Prenume. Din acest motiv. Anul. Definiţie (ierarhia de incluziune): O entitate E1 este o submulţime a entităţii E (sau este inclusă în entitatea E) dacă fiecare instanţă a lui E1 este de asemenea o instanţă a lui E. atributele de descriere (sau descriptori) sunt folosiţi pentru memorarea caracteristicilor suplimentare ale instanţelor. În crearea diagramei nu vor fi luate în consideraţie decât interdependenţele care sunt necesare aplicaţiei respective. atributele de identificare (formând împreună identificatorul entităţii) reprezintă acea mulţime de atribute care permit distincţia între instanţele aceleiaşi entităţi 2. Figura 2. De exemplu între entităţile STUDENŢI şi FACULTĂŢI se poate figura o asociere ÎNSCRIS_LA care descrie împărţirea studenţilor pe facultăţi. prezintă convenţia de reprezentare grafică a celor trei tipuri de construcţii care participă la formarea unei diagrame EA.. De exemplu entitatea STUDENŢI poate avea ca atribute Matricola. Nume.

E2. Un exemplu de generalizare este clasarea instanţelor entităţii ANGAJAŢI în subclasele BARBAŢI şi FEMEI. ECONOMIŞTI şi COLABORATORI... E1 ∪ E2 ∪ .22 BAZE DE DATE ON-LINE Un exemplu de incluziune este definirea în cadrul entităţii ANGAJAŢI a unor subclase modelate prin entităţile INGINERI. En.n Ierarhiile de incluziune şi generalizare se folosesc doar în cazul în care pentru subclasele unor clase modelate prin entităţi este nevoie de stocarea unor informaţii suplimentare specifice. En dacă orice instanţă a lui E este de asemenea instanţă în una şi numai una din entităţile E1. E2. Definiţie (ierarhia de generalizare): O entitate E este generalizarea entităţilor E1.. În cazul ierarhiei de incluziune entităţile fiu pot să nu fie disjuncte două câte două. ∪ En = E şi b... 2. Convenţia grafică de reprezentare a celor două tipuri de ierarhii se găseşte în fig. Caracteristica ierarhiei de generalizare este că din punct de vedere matematic entităţile fiu reprezintă o partiţie a entităţii tată: a.. nici economişti şi nici colaboratori.... Ei ∩ Ej = ∅ pentru orice i ≠ j din intervalul 1. . .2. Element Ierarhie de incluziune Reprezentare E E1 E2 E3 . De asemenea reuniunea lor poate să nu acopere în întregime entitatea tată: există angajaţi care nu sunt nici ingineri.

2. Tutor STUDENT Înscris_la Alocare FACULTATE PROIECT CALCULATOR Fig.3. şi asocierile au caracteristici care aduc informaţii suplimentare. 2. 2 şi 3 se mai numesc şi asocieri unare. Acestea sunt următoarele: Gradul asocierii Este o valoare numerică întreagă şi este dat de numărul de entităţi care participă la acea asociere. Convenţia grafică de reprezentare grafică a ierarhiilor Caracteristici ale elementelor modelului Aşa cum entităţile au atribute care specifică diversele proprietăţi ale clasei de obiecte modelate.2.Modelarea datelor 23 Ierarhie de generalizare E Crite riu E1 E2 Fig. Exemple de asocieri de grad 1. 2 şi 3 . Asocierile de grad 1. binare şi respectiv ternare.

fiecăreia dintre acestea i se poate asocia un rol. În figura 2. Convenţia de reprezentare grafica: ramurile 'unu' vor fi reprezentate sub forma de săgeată. Pentru exemplul din figura 2. aceasta se determină pentru fiecare ramură şi poate avea doar una din următoarele valori: obligatorie sau opţională. Determinarea ei pentru ramura spre o entitate E se face astfel: fixând arbitrar câte o instanţă pentru celelalte entităţi care participă la asociere se pune întrebarea: este obligatoriu să existe o instanţă a lui E asociată cu acestea? Dacă răspunsul este 'Da' ramura este obligatorie altfel este opţională. tutor Tutor STUDENT discipol Înscris_la FACULTATE . Atributele asocierilor În unele cazuri o anumită informaţie descriptivă nu este asociată cu o clasă de obiecte ci cu un ansamblu de clase diferite modelate fiecare prin entităţi. Determinarea ei pentru ramura spre o entitate E se face astfel: fixând arbitrar câte o instanţă pentru celelalte entităţi care participă la asociere se pune întrebarea: câte instanţe ale lui E pot fi conectate cu acestea? Dacă poate fi cel mult una. În acest caz aceasta va fi modelată ca un atribut al asocierii dintre entităţile respective. conectivitatea ramurii este unu. Rolul În cazul în care de la o asociere pornesc mai multe ramuri către aceeaşi entitate.24 BAZE DE DATE ON-LINE Conectivitatea asocierii Este specifică fiecărei ramuri a unei asocieri şi poate avea una din următoarele două valori: unu sau multi. putem avea: asocierea TUTOR de tip unu-unu sau multi-uni. Acesta arată semnificaţiile diferite pe care le are aceeaşi entitate în cadrul asocierii respective. altfel conectivitatea este multi. iar pentru asocierea ternară ALOCARE multi (STUDENT)-unu-unu.3. asocierea ÎNSCRIS_LA de tip multi-unu (multi spre STUDENT) sau multi-multi. Obligativitatea asocierii Ca şi conectivitatea.4 este prezentată diagrama anterioară având figurată şi obligativitatea. Convenţia de reprezentare grafică a clasei de apartenenţă folosită în continuare este următoarea: ramurile obligatorii vor fi reprezentate prin linie continuă iar cele opţionale prin linie întreruptă.

Atributele vor fi ataşate la entităţile pe care le descriu în mod nemijlocit. atribut. atunci ORAŞ va fi o entitate. Regula 1. Entităţile au informaţii descriptive. pe când atributele nu posedă astfel de informaţii. Folosirea identificatorilor compuşi va fi evitată. în practica modelării apar dificultăţi în clasificarea diverselor informaţii într-una din aceste categorii. 2. . POPULAŢIE. Reprezentarea obligativităţii. etc. există câteva reguli care trebuie respectate şi pe care le prezentăm în continuare. Regula 2. Regula 5. De exemplu dacă despre un ORAŞ este necesară stocarea în baza de date a unor informaţii ca JUDEŢ. Dacă singura informaţie necesară este numele său atunci NUME_ORAŞ va fi un atribut al altei entităţi. Atributele unei entităţi care au o asociere multi-unu cu o altă entitate vor fi reclasificate ca entităţi. Exemplu: Num e JUDEŢ BANCA LOCALITATE Regula 4. Exemplu: Are_Sediu_În BANCA LOCALITATE Num e Regula 3.Modelarea datelor 25 Alocare PROIECT CALCULATOR Fig. Clasificarea în entităţi şi atribute Deşi definiţia noţiunilor de entitate. Atributele multivalorice vor fi reclasificate ca entităţi. În model relaţional pentru atributele de acest fel se construiesc de regulă structuri de căutare rapidă (indecşi) care funcţionează cu atât mai lent cu cât complexitatea indecsului creşte. Roluri Criterii de modelare a.4. asociere este destul de simplă. Pentru a putea clasifica corect informaţiile.

obligativitatea şi dacă este cazul şi atributele asocierii precum şi rolurile ramurilor sale. Modelul entitate-asociere clasic Modelul clasic are o serie de dezavantaje.26 BAZE DE DATE ON-LINE b. c. 2. Tatăl şi fii unei ierarhii au acelaşi identificator. Pot exista entităţi (de exemplu entităţi intersecţie) care au identificatorul format numai din capete de asociere. Descriptorii care apar la toţi fii unei ierarhii de generalizare şi nu apar la tată se mută la tată. . Identificarea asocierilor În aceasta etapă se tratează informaţiile care nu au fost clasificate ca entităţi sau atribute ci reprezintă interdependenţe între clase de obiecte. Etichetarea nu este per asociere ci per capăt de asociere (deci 2 etichete pentru fiecare asociere) • Entităţile: Identificatorul unei entităţi poate fi format din atribute şi/sau capete de asocieri. Identificarea ierarhiilor de generalizare şi incluziune. după cum este cazul. Pentru fiecare asociere se specifică gradul. activitatea se desfăşoară uneori de către mai multe colective simultan. astfel: 1. d. Integrarea vederilor. clasa şi subclasele (care la pasul anterior au fost catalogate ca entităţi) sunt interconectate într-o ierarhie de incluziune sau generalizare. Marcajul este bararea capătului respectiv de asociere. Pentru uneltele CASE care utilizează EA s-a ales o variantă modificată: • Atributele unei entităţi sunt înscrise în caseta acesteia. conectivitatea. Se elimină de asemenea asocierile redundante. La acest pas se face şi o reataşare a atributelor pentru evitarea redundanţei.3. diagramele rezultate sunt apoi integrate eliminându-se redundanţele şi inconsistenţele. Descriptorii care apar şi la tată şi la fii se elimină de la fii. mai ales în ceea ce priveşte lizibilitatea diagramelor complexe. Este marcat tupul lor: # Identificare * NOT NULL o Poate fi NULL • Asocierile: Nu există decât asocieri de grad 1 sau 2 cu conectivitate 1-1 sau 1-M. 3. În cazul în care despre anumite subclase ale unei clase de obiecte există informaţii specifice. În cazul proiectării bazelor de date complexe. Toate asocierile de grad mai mare ca 2 sau cele de grad 1 sau 2 cu conectivitate M-M sunt modelate ca “entităţi intersecţie”. 2. Ele sunt modelate ca asocieri între entităţi.

Există în anumite variante doar ierarhiile de generalizare (fără cele de incluziune).Modelarea datelor 27 • Ierarhiile: Ierarhiile se numesc aici Subtipuri-Supertipuri. Exemplu de diagramă: ALOCARE o NrOre PentruUn Are Soţie PentruUn Are Soţ PeUn Are STUDENT #* Matr * Nume * Grupa PROIECT #* IdP * NumeP ÎnscrisLa Are CALCULATOR #* NrInv o Tip FACULT #* CodF * NumeF . Entităţile fiu sunt figurate ca incluse în caseta entităţii tată.

28 BAZE DE DATE ON-LINE .

ibm. . Modelul relaţional al datelor. relaţional Din punct de vedere istoric. 3.3. În cadrul acestuia înregistrările sunt structurate sub forma unui graf orientat. etc). Modele de date: ierarhic. în care datele sunt stocate sub formă tabelară are o serie de avantaje care au dus la înlăturarea celorlalte modele: • Datele sunt stocate doar ca valori. modul în care este calculat acesta fiind în sarcina sistemului de gestiune (exemplu de astfel de limbaj: SQL) • Furnizează o bază solidă pentru problemele de corectitudine a datelor (redundanţă. Dezavantajul principal al acestor două modele este că accesul la o înregistrare necesită navigarea prin arbore sau graf pentru a o localiza. Au existat mai multe sisteme de gestiune şi limbaje de programare dezvoltate pe baza acestui model (de exemplu limbajul COBOL). folosit în acest moment de majoritatea covârşitoare a sistemelor de gestiune aflate pe piaţă a fost introdus în anul 1970 prin articolul lui Edgar Frank Codd ”A Relational Model for Large Shared Databanks”. • Este extensibil. Acest model. fiecare nod putând avea mai multe înregistrări ‘tată’ şi mai mulţi fii. nu există pointeri sau navigare prin date.com/software/data/ims/ • Modelul reţea. anomalii. Din acest motiv apar o serie de probleme mai ales legate de timpul necesar scrierii de noi programe şi a detectării anomaliilor care pot să apară în proiectarea bazei de date. în anii ’60 au existat două modele de organizare a datelor care au fost apoi abandonate din cauza problemelor pe care le generau: • Modelul ierarhic.1. • Permite tratarea problemelor de independenţă a datelor (discutate în capitolul 1). în care organizarea este sub forma arborescentă: nodurile conţin date şi legături (‘pointeri’) către nodurile fiu (vezi http://www-306. folosit de IBM în sistemul IMS (care încă este unul dintre produsele furnizate de această firmă). putând fi utilizat şi pentru modelarea şi manipularea de date complexe. • Face posibilă dezvoltarea de limbaje de cereri de nivel înalt în care utilizatorul specifică ce date doreşte şi nu cum se ajunge la rezultat. reţea. MODELUL RELAŢIONAL O problemă fundamentală a unui SGBD este modul în care datele sunt organizate în vederea stocării şi exploatării lor de către aplicaţii.

‘Produs2’. n} În şirul de domenii care participă la un produs cartezian unele se pot găsi în mod repetat: PC = Număr × Şir40 × Număr × Număr × Şir40 × Şir40 Relaţie Definiţie: Relaţie (eng. D2. 20. Termenul de relaţie provine de asemenea din matematică. 2. O reprezentare intuitivă pentru o relaţie este o tabelă în care fiecare element al relaţiei devine o linie şi fiecare coloană corespunde unui domeniu: 10 Produs1 3 20 Firma1 Adresa1 1 0 10 Produs2 20 23 Firma2 Adresa2 5 12 Produs3 1 20 Firma1 Adresa1 4 0 În fapt deci o relaţie se reprezintă printr-o tabelă care conţine date. 6. Dn produsul lor cartezian este: D1 × D2 × … × Dn = { (v1. 10. Un exemplu de relaţie aparţinând produsului cartezian PC din paragraful următor este: Produse = { (101. fiecare coloană având asociat un anumit tip de date. Domain) = o mulţime de valori având asociat un nume. Exemple: • Nota = {1. Elementele de bază ale modelului relaţional Domeniu Definiţie: Domeniu (eng. ‘Produs3’. 20. ‘Firma1’. Relaţia de mai sus conţine doar 3 dintre elementele produsului cartezian din care provine (3 tupluri). dat de domeniul din care provine. tuple). ‘Firma1’. 20. …. ‘Firma1’.30 BAZE DE DATE ON-LINE 3. într-o tabelă coloanele au un nume. 23. ‘Adresa1’) . 3. ‘Adresa1’) } Elementele unei relaţii sunt denumite în literatura de specialitate tupluri (engl. Relation) = o submulţime a unui produs cartezian având asociat un nume. i = 1. 30. În mod obişnuit. vn) | vi ∈ Di . (124. ‘Adresa2’). 10} sau Nota = {n ∈ N* | n ≥ 1 şi n ≤ 10} • Şir40 = {Mulţimea şirurilor de maxim 40 de caractere} • Număr = {Mulţimea numerelor întregi pozitive din intervalul [0. ‘Produs1’. 100000]} Din teoria mulţimilor se cunoaşte noţiunea de produs cartezian al unor mulţimi: fiind date n domenii D1. 4. v2. 5. 7. 9. …. …. (105. Un domeniu se poate defini fie prin enumerarea elementelor sale fie prin specificarea unor caracteristici definitorii ale acestora. .2. Atribut Deoarece o relaţie are o reprezentare tabelară putem vorbi de ‘coloană a unei relaţii’. 8.

Definiţie: Cheia unei relaţii (eng. NumeF. IdF. AdresaF: Şir40) Produse = IdP. AdresaF În cazul prezentării unora dintre elementele de teorie a bazelor de date relaţionale se folosesc şi notaţii de forma: R = ABCDE.Modelul relaţional 31 Definiţie: Atribut (eng. Qty. În exemplele următoare prezentăm câteva dintre acestea cu referire la relaţia Produse: Produse(IdP. Rezultă că tuplurile pot fi deosebite între ele prin valorile aflate pe una sau mai multe coloane din relaţie. NumeP: Şir40. Pentru relaţia Produse putem fixa de exemplu următoarele nume de atribute: IdP – Codul produsului (nu există două produse având acelaşi cod) NumeP – numele produsului Qty – Cantitate IdF – Codul furnizorului (nu există doi furnizori având acelaşi cod) NumeF – Numele furnizorului AdresaF – Adresa furnizorului Produse Id NumeP Qty IdF NumeF AdresaF P 101 Produs1 30 20 Firma1 Adresa1 105 Produs2 20 23 Firma2 Adresa2 124 Produs3 10 20 Firma1 Adresa1 Schema unei relaţii În terminologia relaţională structura unei relaţiei este denumită şi schema relaţiei. Relation key) este o mulţime minimală de atribute ale căror valori identifică în mod unic un tuplu al relaţiei respective. IdF: Număr. AdresaF) Produse(IdP: Număr. D şi respectiv E. Qty. Relation scheme) = numele relaţiei urmat de lista atributelor sale şi (eventual) de domeniul din care acestea provin. NumeF: Şir40. NumeP. NumeF. Attribute) = coloană a unei relaţii având asociat un nume. Definiţie: Schema unei relaţii (eng. NumeP. B. Cheia unei relaţii O relaţie fiind o mulţime (de tupluri) nu poate conţine elemente duplicat – spre deosebire de exemplu de un tabel Excel unde putem avea dubluri. Există mai multe modalităţi prin care se poate specifica schema unei relaţii. C. IdF. . Cheia unei relaţii este o caracteristică a schemei acesteia şi nu este determinată prin inspectarea valorilor aflate la un moment dat în relaţie. cu semnificaţia: schema relaţiei R conţine 5 atribute notate cu A. Qty: Număr.

Aceste atribute care se adaugă sunt chei străine (externe) deoarece ele sunt cheie dar în altă schemă de relaţie. { CNP } şi {SerieCI. NumeP şi Qty) dar numai IdP este cheie: O relaţie poate avea mai multe chei. Null value) = o valoare diferită de oricare alta şi care modelează o informaţie necunoscută sau o informaţie inaplicabilă(=în poziţia respectivă nu trebuie să existe o valoare nenulă). NumărCI) În acest caz avem mai multe chei: { IdStud }. Valori nule Uneori. SerieCI.3. Definiţie: Valoare nulă (eng. Transformarea diagramelor EA în modelul relaţional Procesul de transformare are un algoritm foarte precis şi este din această cauză pasul care se pretează cel mai bine pentru crearea de instrumente software care să-l asiste. • În cazul asocierilor multi-unu. Nume. Observaţie: Orice relaţie are cel puţin o cheie: deoarece într-o relaţie nu pot exista două elemente identice. . Se spune că în acel loc există o valoare nulă. se adaugă identificatorul entităţii unu în schema rezultată din entitatea multi • În cazul asocierilor unu-unu. 3. NrMatricol. Transformarea entităţilor Fiecare entitate a diagramei se transformă într-o schemă de relaţie având: Numele relaţiei = Numele entităţii Atributele relaţiei = Atributele entităţii Cheia relaţiei = Identificatorul entităţii Transformarea asocierilor unare şi binare 1-1 şi 1-M Fiecare asociere din această categorie va avea ca rezultat îmbogăţirea mulţimii de atribute descriptive ale uneia dintre cele două scheme rezultate la pasul anterior din entităţile asociate.32 BAZE DE DATE ON-LINE În tabela Produse cele trei linii existente pot fi identificate unic de valorile de pe 3 atribute (IdP. { NrMatricol }. CNP. unele elemente ale unei relaţii (celule ale tabelei) nu au nici o valoare concretă. NumărCI}. Să ne imaginăm o relaţie Studenţi conţinând date despre studenţii români ai unei facultăţi: Studenţi (IdStud. se adaugă identificatorul unei entităţi în schema rezultată din transformarea celeilalte. cu cheia celeilalte scheme. rezultă că mulţimea tuturor atributelor relaţiei este cheie sau conţine cel puţin o cheie.

în cazul în care pe o tabelă din baza de date nu a fost definită o cheie primară. . Din acest motiv în acest subcapitol prezentăm următoarele variante de operatori: • Operatori ai algebrei relaţionale clasice în care pornind de la una sau mai multe relaţii obţinem o relaţie. Cum o relaţie este o mulţime de tupluri o parte dintre aceşti operatori provin direct din teoria mulţimilor.unu (E2) . E. După apariţia primelor sisteme de gestiune a bazelor de date relaţionale s-a constatat însă că această algebră nu înglobează o serie de situaţii care apar în practică: în cazul execuţiei unei cereri SQL pot să apară tabele rezultat în care există linii duplicat.multi (E) Cheie(E) + Redenumire(Cheie(E)) Binare multi (E1) .4.multi (E3) Cheie(E2)+Cheie(E3)+ Cheie(E1) Pentru asocierile de grad mai mare ca 3 se procedează analog.multi (E2) .multi (E2) . introduşi în această algebră pentru relaţii (numită în literatura de specialitate algebra relaţională) sunt specifici acesteia şi au la bază operaţii uzuale cu tabele – acestea fiind reprezentări intuitive pentru relaţii. putem să avem în aceasta mai multe linii identice.multi (E2) Cheie(E1) + Cheie(E2) Ternare unu (E1) . În plus. Algebra relaţională Încă din primul său articol în care introduce modelul relaţional. Ceilalţi operatori.Modelul relaţional 33 Transformarea asocierilor unare şi binare M-M şi a celor cu grad mai mare ca doi Fiecare asociere binară multi-multi şi fiecare asociere cu grad mai mare ca doi se transformă într-o schemă de relaţie astfel: Nume relaţie = Nume asociere Atribute relaţie = Reuniunea identificatorilor entităţilor asociate la care se adaugă atributele proprii ale asocierii Cheia relaţiei = Conform tabelului următor Grad Cheia relaţiei provenite din asociere Unare multi (E) .unu (E2) .multi (E3) Cheie(E2)+Cheie(E3) multi (E1) . Problema liniilor duplicat intră în contradicţie cu definiţia unei relaţii în care nu putem avea două tupluri identice.F.multi (E3) Cheie(E1)+Cheie(E3) sau Cheie(E2)+Cheie(E3) sau unu (E1) . Conectivitate 3. Codd propune şi un set de operatori pentru lucrul cu relaţii.unu (E3) Cheie(E1)+Cheie(E2) sau Cheie(E1)+Cheie(E3) sau Cheie(E2)+Cheie(E3) sau unu (E1) .

notata R ∪ S este o relaţie care conţine tuplurile care sunt fie în R. În rezultatul reuniunii nu apar tupluri duplicat. notată R . Pentru ca această operaţie să poată fi executată cele două relaţii care se reunesc trebuie să aibă scheme compatibile. Putem împarţi aceşti operatori în două categorii: • Operatori derivaţi din teoria mulţimilor.34 • • BAZE DE DATE ON-LINE Operatori ai algebrei pe multiseturi care lucrează pe aşa numitele multiseturi (în engleză bags) care sunt asemănătoare relaţiilor dar în care putem avea elemente duplicat. diferenţa lor.S este o relaţie care conţine tuplurile care sunt în R şi nu sunt în S. fie în S fie în ambele relaţii. Exemplu: A 1 2 1 B 1 1 3 C 2 3 2 Relaţia R A B C 4 1 2 2 1 3 1 3 2 5 1 7 Relaţia S A B C 1 1 2 Relaţia R .S . Operatori care lucrează atât pe relaţii cât şi pe multiseturi. Algebra relaţională clasică Există mai mulţi operatori în cadrul acestei algebre. unii dintre ei fiind derivaţi (se pot rescrie în funcţie de alţi operatori). Ei sunt o extensie a algebrei relaţionale şi pe multiseturi şi provin din necesitatea de a putea rescrie orice cerere SQL în termeni ai algebrei extinse. • Operatori specifici algebrei relaţionale Operatori derivaţi din teoria mulţimilor Reuniunea: Fiind date două relaţii R şi S. Exemplu: A 1 2 1 B 1 1 3 C 2 3 2 A 4 2 1 5 B 1 1 3 1 C 2 3 2 7 Relaţia R Relaţia S A B C 1 1 2 2 1 3 1 3 2 4 1 2 5 1 7 Relaţia R ∪ S Diferenţa: Fiind date două relaţii R şi S. reuniunea lor. Şi în cazul diferenţei cele două relaţii care se reunesc trebuie să aibă scheme compatibile.

A şi S. … An. E (R) Observăm că s-au eliminat două linii duplicat din rezultat (cele provenite din liniile 2 şi 6). C. notată R × S este o relaţie ale cărei tupluri sunt formate prin concatenarea fiecărei linii a relaţiei R cu fiecare linie a relaţiei S. … An (R) Exemplu: din relaţia R de mai jos dorim să calculăm π B.Modelul relaţional 35 Intersecţia: Fiind date două relaţii R şi S. Rezultă de aici următoarele: • Numărul de atribute (coloane) ale lui R × S este egal cu suma numerelor de atribute ale lui R şi S • Numărul de tupluri (linii) ale lui R × S este egal cu produsul numerelor de tupluri ale lui R şi S • Dacă în R şi S avem atribute (coloane) cu acelaşi nume. C. Notaţia pentru selecţie este următoarea: πX(R) sau π A1. De asemenea cele două relaţii care se reunesc trebuie să aibă scheme compatibile.: R. în produsul cartezian R × S vom avea atribute care au acelaşi nume. proiecţia lui R pe mulţimea de atribute X este o relaţie care se obţine din R luând doar coloanele din X (în aceasta ordine) şi eliminând eventualele tupluri duplicat. E (R) A 1 2 2 2 1 1 B 1 1 7 3 3 3 Relaţia R C 2 2 4 9 7 9 D 1 1 4 2 4 2 E 3 3 1 1 1 1 B 1 7 3 3 C 2 4 9 7 E 3 1 1 1 Rezultatul proiecţiei π B. . produsul lor cartezian. A2. A 1 2 1 B 1 1 3 C 2 3 2 Relaţia R A B C 4 1 2 2 1 3 1 3 2 5 1 7 Relaţia S A B C 2 1 3 1 3 2 Relaţia R ∩ S Produsul cartezian: Fiind date două relaţii R şi S. notată R ∩ S este o relaţie care conţine tuplurile care sunt şi în R şi în S. Pentru a le deosebi se prefixează numele atributului cu cel al relaţiei din care provine (ex. intersecţia lor.A. A2. ca în exemplul următor) Operatori specifici algebrei relaţionale Proiecţia: Fiind dată o relaţie R şi o mulţime de atribute ale acesteia X=A1.

În unele cazuri se doreşte însă ca aceste linii să apară în rezultat. Această operaţie poartă numele de join extern (în engleză outer join). linia respectivă nu are corespondent în rezultat. oricare ar fi concatenarea ei cu o altă linie din cealaltă tabelă. Cum la un join participă două tabele. Exemplu: A 1 2 1 B 1 1 3 C 2 3 2 Relaţia R A D E 4 1 2 2 1 3 1 3 2 5 1 7 Relaţia S A B C D E 1 1 2 3 2 1 3 2 3 2 2 1 3 1 3 Relaţia R ⋈ S Join extern: În cazul în care o linie a unei tabele.36 BAZE DE DATE ON-LINE Selecţia (numita uneori restricţia): Fiind dată o relaţie R şi o expresie logică F (o condiţie). în care în rezultat apar toate liniile tabelei din stânga operatorului. selecţia lui R în raport cu F este o relaţie care se obţine din R luând doar liniile care verifică expresia logică F. cu valori nule pe coloanele din cealaltă tabelă. simbolul θ fiind folosit iniţial pentru a desemna o condiţie. . în care în rezultat apar toate liniile tabelei din dreapta operatorului. nu îndeplineşte condiţia de join. Rezultă că: R⋈FS = σF(R × S) Join natural: Joinul natural pentru două relaţii R şi S (notat R ⋈S )se obţine făcând joinul celor două relaţii după condiţia “coloanele cu aceeaşi semnificaţie au valori egale” şi eliminând prin proiecţie coloanele duplicat (cele după care s-a făcut joinul). Denumirea de theta-join este folosită din motive istorice. joinul lor (notat R⋈FS) se obţine din produsul cartezian al relaţiilor R şi S urmat de o selecţie după condiţia F (numită şi condiţie de join). Notaţia pentru selecţie este următoarea: σF(R) Exemplu: din relaţia R de mai sus dorim să calculăm σB+1 > A+C(R) obţinem : A 2 B 7 C 4 D 4 E 1 Joinul general (numit şi theta-join sau θ-join): fiind date două relaţii R şi S. pot exista trei tipuri de join extern: • Join extern stânga (left outer join). Join extern dreapta (right outer join).

SUM. Proiecţia: Acelaşi mod de calcul ca şi în cazul relaţiilor dar la final nu eliminăm liniile duplicat. E→DataN (R) Eliminare duplicate: Acest operator se poate aplica doar pe multiseturi: fiind dat un multiset R. AVG. C→Prenume. în care în rezultat apar toate liniile tabelei din stânga şi din dreapta operatorului. joinul. în practica bazelor de date într-o tabelă sau un rezultat al unei cereri de regăsire de date pot să apară linii duplicat.Modelul relaţional • 37 Join extern complet (full outer join). Ele apar în rezultatul returnat de operator • Funcţiile statistice din listă (ex. Operatori folosiţi pentru multiseturi Aşa cum am spus anterior. selecţia. MAX. Intersecţia. δ(R) este un multiset fără duplicate (deci o relaţie) Grupare: Acest operator se poate aplica atât relaţiilor cat şi multiseturilor. Forma operatorului de grupare este următoarea: • γ Lista_atribute_şi_funcţii_statistice(R) Atributele din listă sunt criterii de grupare. Prezentăm pe scurt efectul unora dintre operatorii de mai sus aplicaţi multiseturilor: Reuniunea: Efectul este asemănător cu al reuniunii din algebra relaţională dar din rezultatul final nu se elimină duplicatele. COUNT) se calculează la nivelul fiecărui grup şi de asemenea apar în rezultatul operatorului Sortare: Efectul este sortarea relaţiei sau multisetului R în funcţie de atributele din listă. Forma operatorului de sortare este următoarea: . Operatori pentru relaţii şi multiseturi Redenumirea: Există constructorul → care permite redenumirea atributelor în rezultatul unei expresii relaţionale sau pe multiseturi: Putem redenumi într-un rezultat un atribut prin construcţia: Nume_vechi → Nume_nou Exemplu: π B→Nume. joinul extern: acelaşi mod de calcul ca şi în cazul relaţiilor dar: • Multiseturile operând pot să conţină linii duplicat • Din rezultat nu se elimină liniile duplicat Observaţie: în cazul acestor operaţii nu pot apărea linii duplicat decât dacă operanzii conţin linii duplicat. diferenţa. În acest caz nu mai putem vorbi de relaţii (care nu permit tupluri duplicat) ci de multiseturi (eng. bags). produsul cartezian. joinul natural.: MIN.

5. …. ik se poate scrie astfel: { t(k) | (∃ u)(R(u) ∧t[1] = u[i1] ∧t[2] = u[i2] ∧… ∧t[k] = u[ik]) } • Formula (∃ s)(R(s)) spune că relaţia R este nevidă Din păcate unele din expresiile scrise în calculul relaţional pe tupluri duc la rezultate infinite. • Expresia pentru proiecţia lui R pe atributele i1. … Expresie-n (R) π Nume. ele constituind elementele care formează tuplurile. În acest paragraf sunt prezentate pe scurt aceste două modalităţi de exprimare a cererilor. Forma sa este următoarea: Exemplu: τLista_atribute(R) π Expresie-1. Pentru a evita astfel de rezultate s-au introdus aşa numitele expresii sigure. i2. Calcul relaţional pe tupluri În calculul relaţional pe tupluri o cerere se exprimă printr-o expresie de forma: { t | ψ(t) } unde t este o variabilă tuplu iar ψ o formulă. Medie*2→Dublu (STUD) 3. Analog {t | R(t) ∧S(t) } reprezintă intersecţia a două relaţii. De exemplu: dacă R este o relaţie finită expresia {t | R(t) } este de asemenea finită dar expresia {t | ¬ R(t) } este infinită (există o infinitate de tupluri care nu aparţin lui R). Calcul relaţional Pe lângă algebra relaţională. Exemple de expresii care nu sunt sigure: {t | ¬ R(t) } sau {t | ¬R(t) ∧ ¬S(t) } Calcul relaţional pe domenii În calculul relaţional pe domenii nu avem variabile tuplu ci variabile de domeniu. Exemple: • Expresia {t | R(t) ∨ S(t) } este echivalentă reuniunii a două relaţii din algebra relaţională. Expresie-2. Exemplele de mai sus se pot rescrie astfel: . Acestea dau garanţia unui rezultat finit. Semnificaţia expresiei este “mulţimea tuturor tuplurilor t care verifică formula ψ”. cererile de regăsire a informaţiei într-o bază de date relaţională pot fi exprimate şi prin calcul relaţional pe tupluri (CRT) sau calcul relaţional pe domenii (CRD).38 BAZE DE DATE ON-LINE Proiecţie extinsă: Acest operator este analog proiecţiei obişnuite dar permite atribute (coloane) calculate pentru rezultatul unei expresii pe relaţii sau multiseturi.

Modelul relaţional xn) } 39 • • Reuniunea a două relaţii R şi S: {x1x2…xn | R(x1x2…xn) ∨S(x1x2… Intersecţia a două relaţii R şi S: {x1x2…xn | R(x1x2…xn) ∧S(x1x2… Selecţia după condiţia “valoarea pe prima coloană este mai mare decât xn) } • 100: {x1x2…xn | R(x1x2…xn) ∧x1 > 100 } Toate expresiile de mai sus sunt sigure. expresiile: {x1x2…xn | ¬R(x1x2…xn) } şi {x1x2…xn | ¬R(x1x2…xn) ∧¬S(x1x2…xn) } nu sunt sigure. În literatura de specialitate există demonstraţia faptului că expresiile sigure din CRT şi CRD sunt echivalente cu expresii din algebra relaţională şi reciproc. Analog cu CRT. .

Redundanţa: Redundanţa reprezintă stocarea în mod nejustificat a unei aceleiaşi informaţii de mai multe ori în baza de date. fiecare relaţie rezultată având o schemă corectă – aflată în forma normală dorită.1: Produse IdP 101 105 124 NumeP Produs1 Produs2 Produs3 Qty 30 20 10 IdF 20 23 20 NumeF Firma1 Firma2 Firma1 AdresaF Adresa1 Adresa2 Adresa1 1. Acestea modelează corelaţii care există între datele din lumea reală stocate în baza de date şi. ele reprezintă criterii de corectitudine ale datelor încărcate în baza de date. aşa cum am menţionat anterior. 4. PROIECTAREA BAZELOR DE DATE O categorie de probleme care pot să apară în dezvoltarea unei aplicaţii conţinând o bază de date este cea a proiectării incorecte a schemelor de relaţie. Testarea corectitudinii unei scheme de relaţie poate fi făcută cu ajutorul dependenţelor funcţionale (sau de alt tip) ataşate acelei scheme. În cazul în care o relaţie nu are o schemă corespunzătoare ea trebuie înlocuită cu două sau mai multe relaţii (operaţia este numită şi descompunerea unei scheme de relaţie). Observăm de exemplu că pentru fiecare produs este stocat numele şi adresa furnizorului.1. Anomalii care apar în cazul proiectării incorecte Exemplificarea anomaliilor rezultate din proiectarea defectuoasă a schemei unei relaţii va fi făcută folosind tabela Produse din paragraful 3.4. 2. . în cadrul teoriei bazelor de date relaţionale. Anomalia de actualizare: În cazul actualizării unei informaţii redundante. În cadrul acestui capitol vom prezenta elementele de proiectare a structurii unei baze de date subliniate mai sus. deşi ele sunt unic determinate de codul acestuia. se poate întâmpla ca operaţia să modifice unele apariţii ale acesteia iar altele să rămână cu vechea valoare. În acest caz pot să apară o serie de anomalii care pot complica procesul de programare.

S. s. NumeF.2. numite şi forme normale. …: insţante ale relaţiilor R respectiv S. Z.Proiectarea bazelor de date 41 3. C. • X. Procesul de ‘spargere’ a unei tabele care are o structură incorectă în două sau mai multe tabele se numeste descompunerea schemei de relaţie. Pentru detectarea relaţiilor care trebuiesc descompuse există o serie de reguli de corectitudine. Anomalia de inserare: Nu putem insera date despre un furnizor (numele şi adresa sa) decât dacă există în stoc un produs furnizat de acesta. Anomalia de ştergere: La ştergerea din relaţie a ultimului produs al unui furnizor se pierd automat şi datele despre acesta. întalnită în multe lucrări din literatura de specialitate a domeniului: • R. … (litere mari de la începutul alfabetului): atribute ale unei relaţii. În cazul proiectării cu ajutorul modelului entitateasociere diagrama corectă este următoarea: Id Nume Adresa F F FURNIZOR F Id P Nume P Qt y furnizează R PRODUSE Prin transformarea acestei diagrame se obţin următoarele scheme de relaţie: Furnizor(IdF. . …: scheme de relaţii. B. Definirea acestor forme normale se bazează pe noţiunea de dependenţă (funcţională sau multivalorică) prezentată în continuare. … (litere mari de la sfârşitul alfabetului): mulţimi de atribute dintr-o schema de relaţie. W. NumeP. AdresaF) Produse(IdP. Y. Aceste anomalii apar deoarece într-o aceeaşi tabelă au fost stocate date despre două clase diferite de obiecte. Qty. IdF) Rezultă că informaţia din relaţia Produse trebuie stocată de fapt în două relaţii. D. T. • A. 4. Dependenţe funcţionale Notaţii În paragrafele următoare vom folosi următoarea convenţie de notare. 4. • r. U.

În exemplul prezentat. sau. Notaţia pentru dependenţe funcţionale este o săgeată de la stanga spre dreapta: X →Y Exemplu: În relaţia Produse din paragraful anterior putem scrie următoarele dependenţe funcţionale: IdP → NumeP. AdresaF Aceste dependenţe arată că: • dacă două produse au acelaşi IdP. Există o multitudine de reguli de inferenţă. Spunem că X determina funcţional pe Y (sau Y este determinată funcţional de X) dacă şi numai dacă oricare ar fi două tupluri t1 şi t2 din orice instanţă a lui R atunci: t1[X] = t2[X] ⇒ t1[Y] = t2[Y]. IdF. NumeF. Qty. Pentru a se putea face o prezentare formală a acestora. Definiţia dependenţelor funcţionale Definiţie: Fie: • R o schema de relaţie • X. este vorba de fapt de acelaşi produs • dacă două produse au acelaşi IdF (Id furnizor) atunci şi valorile pentru numele şi adresa acestuia trebuie să fie aceleaşi. t1. în cuvinte. IdF → NumeF. …: mulţimi de dependenţe funcţionale ataşate unei scheme de relaţie În paragrafele următoare termenul generic de relaţie semnifică atât schema relaţiei (descrierea structurii acesteia) cât şi o instanţă a acesteia (conţinutul de date de la un moment dat al relaţiei). Y ⊆R doua mulţimi de atribute ale acesteia. G. Axiome şi reguli Pornind de la o mulţime de dependenţe funcţionale ataşate unei scheme de relaţie se pot deduce alte dependenţe funcţionale valide. • Y ⊆ X: Mulţimea de atribute Y este inclusă în mulţimea de atribute X • A ∈ X: Atributul A aparţine mulţimii de atribute X • t. • t[X]: valorile atributelor din X aflate în tuplul t. • F. AdresaF. a doua dependenţă funcţională arată că dacă la două produse apare acelaşi Id furnizor atunci numele şi adresa furnizorului sunt de asemenea aceleaşi (deoarece nu pot să existe doi furnizori diferiţi cu acelaşi Id). … tupluri ale unei relaţii. Observaţie: Dependenţele funcţionale nu se determina din inspectarea conţinutului de la un moment dat al relaţiei ci din semnificaţia atributelor acesteia. t2. trei . dacă două tupluri au aceleaşi valori pe atributele X atunci ele au aceleaşi valori şi pe atributele Y.42 BAZE DE DATE ON-LINE • X ⊆ R: Mulţimea de atribute X este inclusă în mulţimea atributelor relaţiei R.

Mulţimea F+ conţine foarte multe dependenţe. Z ⊆ R. . Definiţia formală a acestei închideri este următoarea: F+ = {X → Y | F ⇒ X → Y } Unde prin ⇒ am notat faptul că dependenţa respectivă se poate deduce din F folosind axiomele şi regulile. Y. Dacă X → Y şi YZ → W atunci şi XZ → W Închiderea unei mulţimi de DF Pornind de la un set de dependenţe funcţionale F şi utilizând axiomele şi regulile obţinem o multitudine de alte dependenţe. W ⊆ R. . Y. . triviale sau nu. Mulţimea tuturor dependenţelor funcţionale care se pot deduce din F se numeşte închiderea mulţimii de dependenţe F. Ele nu spun nimic în plus faţă de setul de dependenţe iniţial dar sunt dependenţe funcţionale valide. Descompunere: Fie R o schemă de relaţie şi X. Z ⊆ R. Augmentare: Fie R o schemă de relaţie şi X. R3. Y. Tranzitivitate: Fie R o schemă de relaţie şi X. Reflexivitate: Fie R o schemă de relaţie şi X ⊆ R. Daca X → Y şi X → Z atunci şi X → YZ Rezultă şi faptul că din cele n reguli obţinute prin descompunere se poate obţine dependenţa iniţială. X → A2. Dacă X → Y şi Y → Z atunci şi X → Z Pe baza acestor axiome se pot demonstra o serie de reguli de inferenţă pentru dependenţe funcţionale dintre care cele mai importante sunt următoarele: R1. Z ⊆ R. deci înlocuirea acesteia nu duce la pierderea vreunei corelaţii existente. Z. Z ⊆ R. A2. Dacă X → Y şi Z ⊆ Y atunci şi X → Z Regula descompunerii ne permite să rescriem un set de dependenţe funcţionale astfel încât să obţinem doar dependenţe care au în partea dreaptă doar un singur atribut. Pseudotranzitivitate: Fie R o schemă de relaţie şi X.Proiectarea bazelor de date 43 dintre ele au fost alese ca axiome iar restul se pot deduce pornind de la ele. Sa presupunem că avem o dependenţă funcţională de forma: X → A1A2A3…An Atunci ea poate fi înlocuită cu următoarele n dependenţe funcţionale: X → A1. notată cu F+.. X → An R2. inclusiv dependenţe triviale ca: . Cele trei axiome (numite în literatură şi Axiomele lui Armstrong) sunt următoarele: A1. Y. X → A3. Reuniune: Fie R o schemă de relaţie şi X. Y. Dacă Y ⊆ X atunci: X →Y Toate dependenţele funcţionale care rezultă din această axiomă sunt numite şi dependenţe triviale. Dacă X → Y atunci şi XZ → YZ A3.

în cazul descompunerii unei scheme de relaţie. C → E } Chei şi superchei În acest moment putem să dăm o definiţie echivalentă a cheii pe baza dependenţelor funcţionale: Definiţie: Fie R o schemă de relaţie.  Mulţimea de dependenţe este minimală. C → D. Introducerea acestei noţiuni s-a făcut pentru a explica. C → DE }: Aplicăm regula de descompunere. ABC → AC. ABC → BC sau ABC → ABC Ea nu se calculează.deci orice submulţime strictă a lui X nu mai îndeplineşte condiţia anterioară). . nici una dintre dependenţe neputând să fie dedusă din celelalte (altfel spus nu există dependenţe redundante). ABC → AB. ABC → C. AB → D.3) şi pentru a putea defini formal alte noţiuni: Acoperirea unei mulţimi de DF: Fie R o schemă de relaţie şi F. C → E } Mulţimea nu este însă minimală deoarece AB → D şi AB → E se pot deduce prin tranzitivitate din AB → C împreună cu C → D. În cazul în care această mulţime îndeplineşte condiţiile următoare se spune că este în formă canonică:  Orice dependenţă are în partea dreaptă un singur atribut. Echivalenţa a două mulţimi de dependenţe: Fie R o schemă de relaţie şi F. care sunt dependenţele moştenite de elementele descompunerii de la relaţia iniţială (paragraful 4. ABC → B. Acest lucru se poate obţine aplicând regula descompunerii prezentată anterior. Se spune că F acoperă pe G dacă şi numai dacă G ⊆ F+.44 BAZE DE DATE ON-LINE ABC → A. deci F+ = G+) Forma canonică a unei mulţimi de DF: Din definiţiile de mai sus rezultă că o mulţime de dependenţe poate fi înlocuită cu altă echivalenţă conţinând alte dependenţe. G două mulţimi de dependenţe pentru R. Atunci X este cheie pentru R dacă şi numai dacă: F ⇒ X → R (deci X → R se poate deduce din F) şi X este minimală (oricare ar fi Y ⊂ X. F mulţimea de dependenţe funcţionale asociată şi X ⊆ R. Obţinem: F = { AB → C. C → E. algoritmii care au nevoie de ea ocolind într-un fel sau altul calculul acesteia. G două mulţimi de dependenţe pentru R. Rezultă că forma canonică a lui F este: F = { AB → C. C → D. AB → E. cu F = { AB → CDE. Exemplu: Fie R = ABCDE o schemă de relaţie şi F mulţimea de dependenţe funcţionale asociată. Y ≠ X atunci ¬(F ⇒ Y → R) . Se spune că F e echivalentă cu G dacă şi numai dacă F acoperă pe G şi G acoperă pe F (deci G ⊆ F+ şi F ⊆ G+ .

În cazul în care doar prima condiţie este îndeplinită mulţimea X se numeşte supercheie. Qty. Se pune însă şi problema: ce dependenţe moştenesc cele două relaţii de la relaţia iniţiala? Soluţia este de a defini proiecţia unei mulţimi de dependenţe pe o mulţime de atribute. Formal putem scrie: πS(F) = {X → Y ∈ F+ | X. Proiecţia unei mulţimi de DF Aşa cum s-a menţionat în paragraful 4. Se observă faptul că aceasta definiţie este echivalentă cu cea din capitolul 3. C → D. Observaţie: Faptul că o supercheie nu este constrânsă de minimalitate nu înseamnă însă că ea nu poate fi minimală. IdF→AdresaF } Prin spargerea acestei relaţii în două obţinem relaţiile: Produse = IdP. Qty. În paragrafele următoare vom vedea cum se poate demonstra şi faptul că AB este minimală. AdresaF având asociată mulţimea de dependenţe: F = { IdP→NumeP. Atunci AB este cheie pentru R:  Din AB → C. NumeF.4. o mulţime asociată de dependenţe funcţionale F şi o submulţime de atribute S ⊆ R . IdF. Să luăm cazul relaţiei anterioare conţinând produsele dintr-un depozit: Produse = IdP. reciproca nefiind însă adevărată. NumeP. notată cu πS(F) este mulţimea dependenţelor din F+ care au şi partea stângă şi pe cea dreaptă incluse în S. Proiecţia mulţimii de dependenţe F pe S. IdF→NumeF. deci este nu numai supercheie ci chiar cheie pentru R.2. AdresaF Atributele relaţiei iniţiale se regăsesc fie doar într-una dintre schemele rezultate fie în amândouă. Rezultă că orice cheie este în acelaşi timp şi supercheie. Exemplu: Fie R = ABCDE şi F = { AB → C. NumeP. IdP→Qty. închiderea unei mulţimi de dependenţe funcţionale F+ a fost introdusă şi pentru a putea defini setul de dependenţe funcţionale moştenite de o schemă de relaţie obţinută prin descompunerea unei scheme incorect proiectată. NumeF. IdF Furnizori= IdF. Y ⊆ S } Pentru exemplul de mai sus proiecţiile sunt următoarele: . C → D şi C → E obţinem prin tranzitivitate AB → D şi AB → E  Din AB → C. C → E }. IdP→ IdF. Fie o relaţie R.Proiectarea bazelor de date 45 Deci o cheie determină funcţional toate atributele relaţiei şi este minimală: nici o submulţime strictă a sa nu determina funcţional pe R. deci AB → R Rezultă că AB este supercheie pentru R. AB → D şi AB → E obţinem prin reuniune AB → CDE  Din AB → CDE obţinem (augmentare cu AB) AB → ABCDE. Definiţie.

46

BAZE DE DATE ON-LINE
FPRODUSE = πPRODUSE(F) = { IdP→NumeP, IdP→Qty, IdP→ IdF} FFURNIZORI = πFURNIZORI (F) = { IdF→NumeF, IdF→AdresaF }

Observaţie: Atunci când descompunem o schemă se poate întâmpla ca unele dintre dependenţele schemei iniţiale să se piardă. Exemplu: Fie R = ABCD şi F = { A→B, B→C, C→D, D→A }. În cazul în care descompunem R în R1 = AB şi R2 = CD atunci: FR1 = πR2(F) ={ A→B, B→A } FR2 = πR1(F) = { C→D, D→C } A doua dependenţă din fiecare mulţime nu este în F dar este în F+ (obţinută prin tranzitivitate). Observăm însă că dependenţele B→C şi D→A nu mai pot fi obţinute nici din FR1 nici din FR2 nici din reuniunea lor. În subcapitolul 4.4. va fi prezentată o metodă prin care se poate testa dacă prin descompunere dependenţele iniţiale sunt păstrate sau nu.

Închiderea unei mulţimi de atribute
Fie R o schemă de relaţie, F mulţimea de dependenţe asociată şi X ⊆ R. Se poate defini închiderea mulţimii de atribute X în raport cu F (notată X+ ) astfel: X+ = { A | X → A ∈ F+ } X+ conţine deci toate atributele care apar în partea dreaptă a unei dependenţe din F sau care se poate deduce din F folosind regulile şi axiomele. Algoritm de calcul pentru X+ Intrare: R o schemă de relaţie, F mulţimea de dependenţe asociată şi X ⊆ R Ieşire: X+ Metoda: se procedează iterativ astfel: • Se porneşte cu X( 0 ) = X • Pentru i ≥ 1, X( i ) = X( i – 1) ∪ { A | (∃ ) Y → A ∈ F cu Y ⊆ X( i – 1) } • Oprirea se face atunci când X( i ) = X( i – 1) Exemplu: Fie R = ABCDE şi F = { A → B, A → C, D → E }. Pentru a calcula (AD)+ procedăm astfel: • X( 0 ) = {A, D} • Din A → B, A → C şi D → E rezultă că X( 1 ) = X( 0 ) ∪ { B, C, E } = { A, D } ∪ { B, C , E} = ABCDE • Oprire deoarece X( 1 ) = R deci oricâte iteraţii am face nu mai pot să apară noi atribute. Rezultă că (AD)+ = ABCDE Scopul introducerii acestei noţiuni este şi cel de a putea ocoli în alţi algoritmi şi definiţii calculul lui F+ . Avem următorul rezultat teoretic:

Proiectarea bazelor de date

47

Propoziţie: Fie R o schemă de relaţie, F mulţimea de dependenţe asociată şi X, Y ⊆ R. Atunci X → Y se poare deduce din F dacă şi numai dacă Y ∈ X+

O altă definiţie a cheii
Pe baza propoziţiei anterioare se poate da o altă definiţie pentru cheia sau supercheia unei relaţii, bazată nu pe F+ ca în paragraful 4.2.5 ci pe închiderea unei mulţimi de atribute. Definiţie: Fie R o schemă de relaţie, F mulţimea de dependenţe funcţionale asociată şi X ⊆ R. Atunci X este cheie pentru R dacă şi numai dacă X + = R şi X este minimală (oricare ar fi Y ⊂ X, Y ≠ X atunci Y+ ≠ R - deci orice submulţime strictă a lui X nu mai îndeplineşte condiţia anterioară). Dacă numai prima condiţie este îndeplinită atunci X este supercheie pentru R Echivalenţa acestei definiţii cu cea anterioară este evidentă: • X+ = R înseamnă cf. propoziţiei că X → R • minimalitatea este de asemenea definită echivalent: ¬(F ⇒ Y → R) este echivalentă cu ¬( Y+ = R) adică Y+ ≠ R Folosind această definiţie se poate defini o euristică de găsire a cheilor unei relaţii:

Euristica de găsire a cheilor unei relaţii
Pentru găsirea cheilor unei relaţii pornim de la observaţia că atributele care nu sunt în partea dreaptă a nici unei dependenţe nu pot să apară în procesul de închidere a unei mulţimi de atribute şi deci ele aparţin oricărei chei a relaţiei. Intrare: R o schemă de relaţie şi F mulţimea de dependenţe funcţionale asociată (F în formă canonică). Ieşire: Cheia unică sau cheile alternative ale lui R Metoda: 1. Se porneşte de la mulţimea de atribute X ⊆ R care nu apar în partea dreaptă a nici unei dependenţe 2. Se calculează X+. Daca X+ = R atunci X este cheia unică minimală a relaţiei R şi calculul se opreşte aici. Paşii următori se efectuează doar dacă X+ ≠ R 3. Se adaugă la X câte un atribut din R - X+ obţinându-se o mulţime de chei candidat. 4. Se calculează X+ pentru fiecare dintre candidate. Daca se obţin toate atributele lui R atunci acel X este o cheie a lui R. 5. Se repetă paşii 3 şi 4 pornind de la acele mulţimi candidat X care nu sunt găsite ca şi chei la pasul anterior. Între mulţimile candidat nu luăm niciodată în considerare pe cele care conţin o cheie găsită anterior. 6. Procesul se opreşte când nu se mai pot face augmentari. Exemplu: Fie R = ABCDE şi F = { A → B, B → A , A → C, D → E }. • Mulţimea atributelor care nu apar în partea dreaptă a nici unei dependenţe este X = D.

48

BAZE DE DATE ON-LINE • Calculăm (D)+. Obţinem (D)+ = DE. Rezultă că D nu este cheie unică

pentru R • Calculăm mulţimea de candidate: augmentăm D cu atribute din R – D + = ABCDE – DE = ABC. Obţinem AD, BD şi CD • Calculăm închiderile lor. Obţinem (AD)+ = R, (BD)+ = R şi (CD)+ = CDE ≠ R. Rezultă că AD şi BD sunt chei ale lui R dar CD nu e cheie. • Calculam o nouă mulţime de candidate pornind de la CD. Putem augmenta CD cu atribute din R – (CD)+ = ABCDE – CDE = AB. Nici una dintre augmentări nu este însă posibilă pentru că atât ACD cat şi BCD conţin o cheie găsită anterior (AD respectiv BD). • Procesul se opreşte. Singurele chei ale lui R rămân AD şi BD.

4.3. Forme normale
Există câteva seturi de condiţii care ne arată că o schemă de relaţie este corect proiectată în sensul că ea nu permite apariţia anomaliilor prezentate la începutul capitolului. Dacă schema îndeplineşte cerinţele unui anumit set de condiţii se spune că este în formă normală asociată acelui set. În continuare sunt prezentate formele normale Boyce-Codd şi forma normală3. În finalul acestui capitol va fi prezentată şi forma normală 4 care se defineşte în funcţie de alt tip de dependenţe, şi anume dependenţele multivalorice.

Forma normală Boyce-Codd (FNBC)
Definiţie: R o schemă de relaţie şi F mulţimea de dependenţe funcţionale asociată. Se spune că R este în forma normală Boyce-Codd dacă şi numai dacă oricare ar fi o dependenţă netrivială X → Y din F atunci X este supercheie pentru R Rezultă că o schemă de relaţie este în FNBC dacă şi numai dacă fiecare dependenţă din F are în partea stângă o supercheie. Nu este necesar ca F să fie în forma canonică dar nu trebuie să conţină dependenţe triviale (obţinute din prima axiomă - de reflexivitate, de tipul AB → A sau AB → AB) Exemple: 1. Relaţia R = ABCDE având F = { A → B, B → A , A → C, D → E } nu este în forma normală Boyce-Codd deoarece are cheile AD şi BD dar nici o dependenţă nu are în partea stângă o supercheie a lui R 2. Relaţia Produse = IdP, NumeP, Qty, IdF având asociată mulţimea de dependenţe funcţionale FPRODUSE = πPRODUSE(F) = { IdP→NumeP, IdP→Qty, IdP→ IdF} este în forma normală Boyce-Codd: cheia unica a relaţiei este IdP şi toate dependenţele au în partea stângă o supercheie (aşa cum s-a menţionat orice cheie este în acelaşi timp şi supercheie) 3. Relaţia Produse = IdP, NumeP, Qty, IdF, NumeF, AdresaF având dependenţele:

• Relaţia este în FN3 deoarece primele două dependenţe au în partea stângă o supercheie (AB) iar a treia dependenţă are în partea dreapta atributul prim A. Din acest motiv orice relaţie care este în FNBC este implicit şi în FN3. D → A } are cheia unică AB. Relaţia R = ABCD având F = { AB → C. De remarcat că dacă în F avem dependenţe care conţin mai multe atribute în partea dreaptă putem aplica regula de descompunere pentru a obţine dependenţe care în partea dreaptă au cate un singur atribut. IdF→AdresaF } nu este în forma normală Boyce-Codd: cheia unica este IdP dar există dependenţe care nu au în partea stângă o supercheie: IdF→NumeF. IdF→AdresaF Forma normală 3 (FN3) Pentru definiţia formei normale 3 este necesară definirea noţiunii de atribut prim: Definiţie. Exemple: 1. Reciproca nu este adevărată. B şi D. R o schemă de relaţie şi F mulţimea de dependenţe funcţionale asociată. AB → D. Exemplu: R = ABCDE având F = { A → B. IdP→Qty. Un atribut A ∈ R se numeşte atribut prim dacă el aparţine unei chei a lui R. Cum cheile relaţiei sunt AD şi BD rezultă că în R sunt trei atribute prime: A. D → E }.Proiectarea bazelor de date 49 F = { IdP→NumeP. Definiţie. . IdF→NumeF. A → C. Observaţie: Condiţia de FNBC este inclusă în definiţia FN3. • Relaţia nu este în FNBC deoarece a treia dependenţă violează definiţia pentru această formă normală (nu are în partea stângă o supercheie. R o schemă de relaţie şi F mulţimea de dependenţe funcţionale asociată. Se spune că R este în forma normală 3 dacă şi numai dacă oricare ar fi o dependenţă netrivială X → A din F atunci X este supercheie pentru R sau A este atribut prim. IdP→ IdF. FN3 FNBC Rezultă de asemenea că dacă o schemă de relaţie nu este în FN3 ea nu poate fi nici în FNBC. B → A .

A → C. Soluţia este înlocuirea relaţiei respective cu două sau mai multe relaţii care să conţină aceleaşi informaţii dar care. în cazul în care o relaţie din baza de date nu este într-o formă normală bună (FNBC. Nu este necesar ca schemele să fie disjuncte (în practică ele au aproape întotdeauna atribute comune). Definiţia descompunerii unei scheme de relaţie Procesul prin care se ‘sparge’ o relaţie în mai multe relaţii se numeşte descompunerea unei scheme de relaţie. DE) Exemplul 2. AdresaF) ) ρ2 = ( (IdP. Formal putem defini acest concept astfel: Definiţie: Fie R o schemă de relaţie. ρ3 = (AB. NumeF. NumeP). DE). Se spune că ρ = (R1. (NumeF. (IdF. Qty. NumeF. IdF). D → E }. Descompunerea schemelor de relaţii Aşa cum s-a menţionat anterior. Putem avea descompuneri ca: ρ1 = (ABC. Rn) este o descompunere a lui R dacă şi numai dacă R = R1 ∪ R2 ∪ …∪ Rn Schemele R1. IdF. C → D. B → C. IdP→ IdF. NumeP. Relaţia R = ABCD având F = { A → B. R = A1 A2 … Am . IdP→Qty. fiecare în parte. A → C. (Qty. R2. NumeP. R2. …. B → A . Qty. În exemplele de mai jos sunt prezentate câteva descompuneri valide ale unor scheme de relaţii (unele însă incorecte din punct de vedere al păstrării datelor şi/sau dependenţelor iniţiale): Exemplul 1: Fie relaţia R = ABCDE având F = { A → B. IdF). D → E } are cheile AD şi BD. este în forma normală dorită de proiectant. (NumeF. D → A } are cheile A. Qty. IdF→AdresaF } Putem avea o multitudine de descompuneri printre care: ρ1 = ( (IdP. Rn conţin deci atribute din R. B → A .50 BAZE DE DATE ON-LINE 2. …. FN3) pot să apară diverse anomalii. NumeP. Fie relaţia Produse = IdP. Relaţia R = ABCDE având F = { A → B. AdresaF având dependenţele funcţionale: F = { IdP→NumeP.4. AdresaF) ) . C şi D. ρ2 = (ABCD. B. DE). CD. IdF→NumeF. fiecare atribut Ai al schemei iniţiale trebuind să se regăsească în cel puţin una dintre ele. Rezultă că: • R este în FNBC deoarece în partea stângă a dependenţelor sunt numai superchei • R este în FN3 deoarece este în FNBC 4. AdresaF) ) ρ3 = ( (IdP. IdF). Rezultă că: • R nu este în FN3 deoarece dependenţele 3 şi 4 nu au nici supercheie în partea stângă nici atribut prim în partea dreaptă • R nu e în FNBC deoarece nu e în FN3 3.

p. …. Se parcurg dependenţele X → Y din F. R2. Rn) Ieşire: Verdictul dacă ρ are sau nu proprietatea j. Liniile sunt etichetate cu elementele descompunerii ρ iar coloanele cu atributele relaţiei R. Daca două (sau mai multe) linii din tabelă au aceiaşi simboli pe coloanele X aceste linii se egalează şi pe coloanele din Y astfel: • Dacă pe o coloană din Y apare un aj atunci toate elementele de pe acea coloană din liniile respective devin aj . lista atributelor relaţiilor din descompunere şi a mulţimii de dependenţe funcţionale asociată folosind următorul algoritm Algoritm de testare a proprietăţii de j.Proiectarea bazelor de date 51 Descompunerea acţionează deci la nivelul schemei relaţiei. Atunci instanţele pentru relaţiile din descompunerea ρ sunt: ri = π Ri (r) Descompuneri cu join fără pierderi Condiţia pentru a nu se pierde date prin descompunere este ca relaţia iniţială să poată fi reconstruită exact prin joinul natural al relaţiilor rezultate. Se spune că ρ este o descompunere cu join fără pierderi în raport cu F (prescurtat j. pentru o descompunere Intrare: Schema de relaţie R = A1 A2 … Am .) dacă şi numai dacă pentru orice instanţă r a lui R care satisface dependenţele F avem că: r1 ⋈ r2 ⋈ … ⋈ rn = r unde ri = π Ri (r) Faptul că o descompunere are sau nu această proprietate se poate testa pornind doar de la lista atributelor relaţiei iniţiale. R2. …. Să considerăm o instanţă r a relaţiei de schema R (instanţa unei relaţii este o încărcare cu date corecte a acesteia).f. Elementul (i. Ce se întâmplă însă cu conţinutul acesteia în cazul unei descompuneri? Fiecare relaţie rezultată va moşteni o parte dintre datele relaţiei descompuse şi anume proiecţia acesteia pe mulţimea de atribute a relaţiei rezultată din descompunere.f. definiţia este următoarea: Definiţie: Fie R o schemă de relaţie. Formal.f. F mulţimea de dependenţe funcţionale asociată şi o descompunere ρ = (R1. fără tupluri în minus sau în plus.j) al tabelei va fi egal cu aj dacă Aj ∈ Ri sau bij altfel. Metoda: Se construieşte o tabelă având n linii şi m coloane. Rn) a lui R.p.p. mulţimea de dependenţe funcţionale F şi o descompunere ρ = (R1.

f. F = { C → E (1).p. B → D (3). Observaţie: În cazul în care descompunerea are doar două elemente se poate testa dacă are proprietatea de join fără pierderi şi astfel: Fie R o schemă de relaţie. Exemplu: Fie R = ABCDE. În acest caz descompunerea ρ nu are proprietatea j. A → C (2).p. E → B (5) } (cu dependenţe numerotate între paranteze) şi ρ = (BCE. Descompunerea are proprietatea de j. ACD) A BCE AB ACD b11 a1 a1 B a2 a2 b32 a2 (5) C a3 b23 a3 (2) a3 D b14 b24 b14 (3) a4 E a5 b25 a5 (4) b35 a5 (1) Prima trecere: • Din C → E b35 devine a5 • Din A → C b23 devine a3 • Din B → D b24 devine b14 • Din D → E b25 devine a5 • Din E → B b32 devine a2 Am obţinut încă o linie doar cu a-uri.f. F mulţimea de dependenţe funcţionale asociată şi ρ = (R1.52 BAZE DE DATE ON-LINE • Dacă pe o coloană din Y nu apare nici un a j atunci se alege unul dintre elementele de tip bij şi toate elementele de pe acea coloană din liniile respective devin egale cu acel bij Procesul se opreşte: • Fie când s-a obţinut o linie în tabela care conţine doar a-uri.p. sau nu. Atunci ρ are proprietatea de join fără pierderi dacă una din dependenţele următoare se poate deduce din F: (R1 ∩ R2) → (R1 – R2) sau (R1 ∩ R2) → (R2 – R1) . AB.f. D → E (4).p. • Fie când la o parcurgere a dependenţelor nu mai apar schimbări în tabelă şi nu s-a obţinut o linie doar cu a-uri. R2) o descompunere a sa.f. În literatura de specialitate se poate găsi demonstraţia faptului că acest algoritm determină corect dacă o descompunere are proprietatea j. caz în care descompunerea ρ are proprietatea j.

F = { A → B. IdF) R2 = (IdF. Descompuneri care păstrează dependenţele O a doua problemă în cazul descompunerii unei scheme de relaţie R având dependenţele F în mai multe relaţii R1. Rn este aceea a păstrării corelaţiilor între date.. corelaţii date de dependenţele funcţionale din F. A → C. IdF. Avem R1 = ABCD. . D → E } şi ρ = (ABCD. NumeP. Qty. A → D. Rn) a lui R şi Fi = πRi(F) mulţimile de dependenţe funcţionale ale elementelor descompunerii. NumeP. DE). O definiţie formală a acestui concept este următoarea: Definiţie: Fie R o schema de relaţie. Se spune că ρ păstrează dependenţele din F dacă şi numai dacă orice dependenţa din F poate fi dedusă din ∪ i=1.Proiectarea bazelor de date 53 Pentru a testa dacă dependenţa se poate deduce din F este suficient să calculăm închiderea lui (R1 ∩ R2). o descompunere ρ = (R1. IdP→ IdF. F mulţimea de dependenţe funcţionale asociată. Daca ea conţine fie pe (R1 – R2) fie pe (R2 – R1) atunci descompunerea este cu join fără pierderi. R2) unde: R1 = (IdP. AdresaF având dependenţele funcţionale: F = { IdP→NumeP. R2. (R1 – R2) = ABCD – DE = ABC (R2 – R1) = DE – ABCD = E (R1 ∩ R2) = D Cele două dependenţe sunt: (R1 ∩ R2) → (R1 – R2) devine D → ABC (R1 ∩ R2) → (R2 – R1) devine D → E Ultima este chiar o dependenţă din F deci se poate deduce din F deci ρ are proprietatea de join fără pierderi. IdP→ IdF} FR2 = πR2 (F) = { IdF→NumeF. Există însă şi cazuri în care unele dependenţe din F nu mai pot fi regăsite în mulţimile de dependenţe asociate schemelor din descompunere şi nu se pot deduce din acestea. IdP→Qty. Fiecare relaţie Ri va moşteni o mulţime de dependenţe dată de proiecţia mulţimii de dependenţe funcţionale F pe Ri Fi = πRi(F) Exemplu: Fie relaţia Produse = IdP. R2 = DE. În primul caz se spune că descompunerea păstrează dependenţele iar în al doilea că descompunerea nu păstrează dependenţele. …. IdF→AdresaF } În cazul descompunerii ρ2 = (R1. NumeF. Exemplu: R= ABCDE. …. IdF→NumeF. NumeF.n (Fi ). IdF→AdresaF } După cum se observă toate dependenţele relaţiei iniţiale sunt păstrate fie în FR1 fie în FR2. AdresaF) cele două relaţii moştenesc următoarele dependenţe: FR1 = πR1(F) = { IdP→NumeP. IdP→Qty. R2. Qty.

…. mulţimea de dependenţe funcţionale asociată F şi o descompunere ρ = (R1. X2 → Y2. … Xn → Yn } Atunci descompunerea ρ = (X1Y1.n (Fi ) )+ Din păcate atât proiecţia unei mulţimi de dependenţe cât şi incluziunea de mai sus implică un calcul de închidere a unei mulţimi de dependenţe (F şi respectiv reuniunea mulţimilor Fi). Există şi în acest caz un algoritm pentru a testa dacă o dependenţă este sau nu păstrată după descompunere fără a fi necesar efectiv calculul mulţimilor Fi Algoritm de testare a păstrării dependenţelor Intrare: o schemă de relaţie R. pe baza experienţei pe care o are proiectantul bazei de date. Rn) Ieşire: verdictul dacă ρ păstrează sau nu dependenţele Metoda: Pentru fiecare dependenţă X → Y din F se procedează astfel: • Se porneşte cu o mulţime de atribute Z = X • Se parcurg repetat elementele descompunerii ρ. Există însă şi nişte algoritmi simpli care. Pentru fiecare Ri se calculează o nouă valoare a lui Z astfel: Z = Z ∪ ((Z ∩ Ri)+ ∩ Ri ) • Procesul se opreşte în momentul când Z rămâne neschimbat la o parcurgere a elementelor Ri. cu F = { X1 → Y1. pornind de la o schemă de relaţie şi mulţimea de dependenţe funcţionale asociată ne duc direct la o descompunere care este în FN3 sau FNBC şi în plus au proprietatea de join fără pierderi (deci nu se pierd date prin descompunere) şi/sau de păstrare a dependenţelor. Algoritmi de descompunere Algoritmii de testare al păstrării dependenţelor şi a joinului fără pierderi pot fi aplicaţi atunci când descompunerea unei scheme de relaţie se face ‘de mână’.54 BAZE DE DATE ON-LINE Rezultă că o descompunere păstrează dependenţele dacă şi numai dacă: F ⊆ ( ∪i=1. Se observă din definiţia de mai sus a descompunerii ρ că: . Dacă toate dependenţele din F sunt păstrate înseamnă că ρ păstrează dependenţele din F. X2Y2. Daca Y ⊆ Z atunci dependenţa X → Y este păstrată. Algoritm de descompunere în FN3 cu păstrarea dependenţelor Fie R o schemă de relaţie şi F mulţimea de dependenţe funcţionale asociată. R2. … XnYn) este o descompunere în FN3 cu păstrarea dependenţelor.. altfel nu e păstrată.

deşi o relaţie este în forma normală Boyce Codd. . DE) Algoritm de descompunere în FN3 cu păstrarea dependenţelor şi join fără pierderi Dacă la descompunerea obţinută prin algoritmul anterior adăugăm o cheie a relaţiei (ca element al descompunerii) vom obţine o descompunere care are atât proprietatea de join fără pierderi cat şi pe cea a păstrării dependenţelor. F = { A → B. D → E }. Forma normală 4 Există situaţii în care. Rezultă din algoritm descompunerea ρ = (ABCD. Exemplul 1: R = ABCDE. A → C. D → E }. • Dacă în descompunere există două elemente XiYi şi XjYj astfel încât XiYi ⊆ XjYj atunci XiYi se elimină. Schema respectivă este înlocuită în ρ prin T1 şi T2 unde T1 = XA şi T2 = T – {A} • Procesul se opreşte când în ρ nu mai există elemente care nu sunt în FNBC 4. X2 → A2. F în formă canonică: F = { X1 → A1. Algoritm de descompunere în FNBC cu join fără pierderi Fie R o schemă de relaţie şi F mulţimea de dependenţe funcţionale asociată. Observaţie: Dacă vreunul dintre elementele de forma XiYi conţin deja o cheie a lui R atunci nu este necesară adăugarea unui element suplimentar în descompunere. Acest fapt se datorează unei proiectări defectuoase în care în aceeaşi relaţie sunt stocate date care aparţin mai multor entităţi şi a cel puţin două asocieri multi-multi. Putem calcula descompunerea în FNBC cu join fără pierderi iterativ: • Iniţial ρ = (R) • La fiecare pas se alege o schemă T care conţine o dependenţă de forma X→A care violează condiţiile de FNBC. A → D.5. În literatura de specialitate există demonstraţia faptului că fiecare schemă din descompunere este în FN3. … Xn → An }. Rescriem prin reuniune mulţimea de dependenţe funcţionale: F = { A → BCD. instanţele sale conţin date redundante. Dependenţe multivalorice.Proiectarea bazelor de date 55 • Toate dependenţele sunt păstrate: dependenţa Xi → Yi este în proiecţia lui F pe XiYi • Pentru a minimiza numărul de elemente din descompunere se aplică regula reuniunii: dacă avem mai multe dependenţe care au aceeaşi parte stângă le reunim într-una singură.

Exemplul de mai sus sugerează faptul că seturile de atribute {Strada. Se spune că X multidetermină Y sau că există dependenţa multivalorică X →→Y dacă şi numai dacă ori de cate ori avem două tupluri ale relaţiei t1 şi t2 cu t1[X] = t2[X] atunci există în relaţie un tuplu t3 pentru care: • t3[X] = t1[X] = t2[X] • t3[Y] = t1[Y] şi t3[R-X-Y] = t2[R-X-Y] .Facultate.Localitate. în sensul că fiecare adresă apare cu fiecare facultate absolvită de un angajat şi reciproc.Strada. Astfel de situaţii sunt modelate cu un nou tip de dependenţe numite dependenţe multivalorice. Dependenţe multivalorice (DMV) Definitie: Fie o relaţie R şi două mulţimi de atribute X şi Y incluse în R.Localitate. Localitate} şi {Facultate.Strada.56 BAZE DE DATE ON-LINE Sa luăm exemplul tabelei următoare unde au fost stocate date referitoare la entităţile PERSOANA.Facultate. AnAbsolvire} sunt independente unele de altele.AnAbsolvire Deşi relaţia este în FNBC adresa şi facultatea absolvită de un angajat sunt prezente repetat în relaţie: adresa pentru fiecare facultate absolvită iar facultatea pentru fiecare adresă a angajatului. ADRESA şi FACULTATE precum şi asocierile dintre ele (multi-multi – o persoană poate avea mai multe adrese şi poate absolvi mai multe facultăţi): Nume Vasile Vasile Vasile Vasile Mariana Mariana Mariana Mariana Mariana Mariana Strada Viitorului Viitorului Dreapta Dreapta Revolutiei Revolutiei Revolutiei Calea Vitan Calea Vitan Calea Vitan Localitate Ploiesti Ploiesti Bucuresti Bucuresti Timisoara Timisoara Timisoara Bucuresti Bucuresti Bucuresti Facultate Automatica Comert Automatica Comert Constructii Drept Master ASE Constructii Drept Master ASE AnAbsolvire 2000 2004 2000 2004 1998 2003 2006 1998 2003 2006 Putem observa că nu există nici o dependenţă funcţională netrivială validă pentru aceasta relaţie.AnAbsolvire → Nume. Ca urmare relaţia este în FNBC având ca singură cheie posibilă mulţimea tuturor atributelor relaţiei: din axioma de reflexivitate (A1) putem obţine dependenţa: Nume. deci nu există dependenţe care să violeze condiţiile FNBC.

Forma normala 4 Pentru a preîntampina redundanţele prezentate la începutul paragrafului este bine ca schemele de relaţie să fie într-o formă normală superioară FNBC. Observatie importanta: Cheile relaţiei (care definesc şi supercheile sale) se determină doar pe baza dependenţelor funcţionale ale acesteia. FNBC şi FN4 este una de includere. Consecinţă importantă: orice dependenţă funcţională este în acelaşi timp şi o dependenţă multivalorică (se demonstrează folosind definiţia) însă reciproca nu este adevarată: există dependenţe multivalorice pentru care în schema relaţiei nu avem o dependenţă funcţională corespunzatoare.Proiectarea bazelor de date X AAA AAA AAA Y BBB DDD BBB R–X–Y CCC EEE EEE 57 t1 t2 t3 O consecinţă interesantă a acestei definiţii este că. Dependenţe de tipul X →→Y pentru care X ∪ Y = R Condiţia de FN4 spune deci că orice DMV care nu intră în una din categoriile de mai sus are în partea stangă o supercheie. rezultă că există şi un tuplu t4 pentru care • t4[X] = t1[X] = t2[X] • t4[Y] = t2[Y] şi t4[R-X-Y] = t1[R-X-Y] Tot din această definiţie rezultă că dacă în R există dependenţa multivalorică X →→Y atunci există şi dependenţa X →→R – X – Y. Orice relaţie în FN4 este în acelaşi timp şi în FNBC şi FN3: . Relatia dintre formele normale FN3. în această ordine. Această formă care consideră şi dependenţele multivalorice se numeşte forma normală 4 (FN4). Definiţia ei este similară cu cea pentru FNBC dar condiţia se pune pentru dependenţele multivalorice ale relaţiei respective: Definitie: O schemă de relaţie R este în forma normală 4 dacă orice dependenţă multivalorică netrivială X →→Y are în partea stangă o supercheie Dependenţele multivalorice triviale sunt de două feluri: 1. Dependenţe în care partea dreaptă este inclusă în partea stangă: X →→ Y unde Y ⊆ X 2. dacă inversăm tuplurile t1 şi t2.

58 BAZE DE DATE ON-LINE FN3 FNBC FN4 .

LIMBAJUL SQL SQL este unul dintre cele mai folosite limbaje în dezvoltarea de aplicaţii software. o Intersecţie .câmpuri . putând fi folosit pentru manipularea datelor. IBM a fost prima companie care a preluat şi dezvoltat acest concept.rânduri . .coloane .relaţii Modificarea datelor este realizată prin operaţiile relaţionale efectuate pe tabele. ulterior dezvoltând DB2 şi SQL/DS. Limbajul are la bază conceptul bazelor de date relaţionale. punând la punct primul limbaj SQL (SEQUEL2) în anul 1976.este rezultatul obţinut prin concatenarea rândurilor a două mulţimi de date. iar operatorii acţionează asupra tabelelor pentru a produce noi relaţii. conform condiţiilor specificate.este operaţia care afişează selectiv anumite coloane din una sau mai multe tabele (submulţime verticală) o Produs .operatori . Operatorii relaţionali pot fi definiţi astfel : o Restricţie . o Join . Inspirat din Algebra Relationala. sau doar rândurile care îndeplinesc una sau mai multe condiţii (submulţime orizontală). care a fost introdus pentru prima data de E.este rezultatul obţinut prin afişarea răndurilor comune şi necomune din una sau mai multe tabele.este rezultatul obţinut prin concatenarea coloanelor din una sau mai multe tabele. modelul bazelor de date relaţionale poate fi asemănat de utilizatori ca o colecţie de tabele bidimensionale definite de următoarele concepte : .este o operaţie care preia şi afişează toate rândurile din una sau mai multe tabele.5. o Reuniune . Codd în anii ’70 şi modelează bazele de date sub forma de tabele şi relaţii între acestea.F. dar şi pentru crearea şi administrarea obiectelor în baza de date.tabele . conform condiţiilor specificate.este rezultatul obţinut prin afişarea rândurilor comune din una sau mai multe tabele. conform condiţiilor specificate. conform condiţiilor specificate. o Proiecţie .

atât pe server.accesul la baza de date este gestionat exclusiv de sistem.o bază de date relaţională apare ca o colecţie de tabele.INTERSECT.să nu existe duplicare de rânduri şi coloane.valorile sunt atomice(nedecompozabile). cât şi a celor sistem. .DESC] [FOR UPDATE OF schema. definită de către utilizator. . cât şi pe maşina client.utilizatorul poate defini anumiţi parametri de sistem pentru optimizarea aplicaţiilor. . . conform condiţiilor specificate. este gestionată exclusiv de către sistem.table@dblink] table_alias [WHERE condition] [START WITH condition][CONNECT BY condition] [UNION.]expresion expr_alias FROM [schema.1. Structura unei tabele trebuie să respecte anumite reguli : . în cazul în care comanda găseşte rânduri duplicate. .table.MINUS][SELECT command] [GROUP BY expresion][ HAVING condition] [ORDER BY expresion(position)] [ASC. Parametrii comenzii au următoarea semnificaţie( cei din paranteze sunt opţionali): DISTINCT . 5. .UNION ALL.relaţiile între tabele se fac pe coloane de acelaşi tip. ALL – returnează toate înregistrările simple şi duplicate ( selectează de asemenea toate coloanele tabelelor din clauza FROM).column] [NOWAIT]. fiind utilizate atât pentru interogarea obiectelor create de utilizator.tipurile de coloane trebuie definite în concordanţă cu tipurile de date.este rezultatul obţinut prin afişarea rândurilor care aparţin numai unei singure tabele.nu trebuie respectată o anumită ordine a rândurilor şi coloanelor. .rularea aplicaţiilor. Interogarea datelor Cererile de interogare SQL folosesc în exclusivitate comanda SELECT. prin executarea de comenzi specifice.returnează numai o înregistrare. sau pentru diferite setări.table.60 BAZE DE DATE ON-LINE o Diferenţa .controlul asupra fişierelor de date este gestionat exclusiv de către sistem.ALL] [schema. Controlul asupra bazelor de date este gestionat de către SGBD(Sistemul de Gestiune a Bazei de Date) şi respectă anumite reguli : .utilizatorul nu controlează felul cum este organizată fizic informaţia. . . . Sintaxa comenzii este următoarea : SELECT [DISTINCT.

Limbajul SQL 61 schema. ORDER BY expresion(position) – ordonează înregistrările selectate după coloanele din expresie. sau anumite coloane şi pot conţine condiţii de filtrare pe clauza where. expresion – reprezintă un nume de coloană sau o expresie care poate folosi funcţii sistem. GROUP BY expresion – stabileşte criteriile de grupare a înregistrărilor(numele coloanelor folosite în criteriul de grupare).domain@connection_qualifier). dblink – reprezintă numele complet sau parţial de identificare a unei baze de date (database.table – reprezintă shema de identificare a tabelei(view-lui) specificată prin user. START WITH condition – stabileşte criteriul de selecţie pentru prima înregistrare.table_name. De exemplu. cererea următoare returnează toate coloanele şi toate înregistrările conţinute de tabela angajati: SQL>SELECT * FROM angajati .------------7902 17-DEC-80 7698 20-FEB-81 -------.UNION ALL. CONNECT BY condition – stabileşte o ierarhie de selecţie a înregistrărilor.----------------7369 POPA ION 7499 TACHE IONUT -------------TEHNICIAN PROGRAMATOR --------. HAVING condition–restricţionează înregistrările din grup la anumite condiţii. ID_ANG NUME FUNCTIE ID_SEF DATA_ANG SAL COM ID_DEP --------. dacă comanda aşteaptă eliberarea unei înregistrări blocată de un alt user. table_alias – este un nume alocat unei tabele(view) care poate fi folosit în cereri corelate. sau în ordinea coloanelor specificate prin poziţie. WHERE condition – reprezintă o clauză (înlănţuire de condiţii).2.MINUS – combină rândurile selectate de mai multe comenzi SELECT prin aplicarea anumitor restricţii. 5.INTERSECT. expr_alias – este un nume alocat unei expresii care va fi folosit în formatarea coloanei ( apare în antetul listei). UNION.--------800 1450 300 -------20 30 Interogările pot să returneaze calcule pe anumite coloane. ca în exemplul următor: . NOWAIT – returnează controlul userului. Cereri simple Sunt cereri care întorc toate coloanele. FOR UPDATE OF – face o blocare (lock) a înregistrărilor în vederea modificării anumitor coloane. care trebuie să fie îndeplinită în criteriul de selecţie a înregistrărilor.

3. salariu*12+nvl(comision.operator de comparaţie .operator de negaţie .AND..0) venit_anual FROM angajati. nume. IN( list ) LIKE IS NULL Semnificaţie ---------------------------------între două valori(inclusiv) compară cu o listă de valori compară cu un model de tip caracter este o valoare nulă Semnificaţie ---------------egal cu mai mare decât mai mare sau egal mai mic decât mai mic sau egal Operatorii de negaţie pot fi de două feluri: * operatori logici .. Cereri cu clauza WHERE Clauza WHERE poate compara valori de coloană. valori literale.62 BAZE DE DATE ON-LINE SQL>SELECT id_ang ecuson. ECUSON --------7369 7499 NUME ----------------POPA ION TACHE IONUT VENIT_ANUAL ------------------9600 17700 5.listă de valori Operatorii de comparaţie pot fi de două feluri: * operatori logici Operator -------= > >= < <= * operatori SQL Operator -------BETWEEN..nume de coloană . expresii aritmetice (sau funcţii ) şi poate avea patru tipuri de parametri : .

data_ang FROM angajati WHERE data_ang BETWEEN ‘1-MAY-1981’ AND ’31-DEC-1981’ ORDER BY data_ang. functie. WHERE functie=’DIRECTOR’ ORDER BY id_dep. nume. salariu. care au un anumit job. DEPART ------30 20 10 FUNCTIE --------------------DIRECTOR PROGRAMATOR TEHNICIAN NUME -------------------NEGRU GELU TANASE DOREL IONESCU VICTOR DATA_ANG ---------------01-MAY-81 08-SEP-81 03-DEC-81 . nume.Limbajul SQL Operator -----------------!= ^= <> NOT NUMECOL = NOT NUMECOL > * operatori SQL Operator -------NOT BETWEEN NOT IN NOT LIKE IS NOT NULL Semnificaţie ----------------------------------nu se află între două valori date nu se află într-o listă dată de valori diferit de un şir nu este o valoare nulă Semnificaţie -----------------------------diferit de(VAX.UNIX.functie.PC) diferit de(IBM) diferit de(toate OS) diferit de mai mic sau egal 63 Dacă vrem să facem o listă cu toţi angajaţii. data_ang FROM angajati. DEPART FUNCTIE ---------------------10 DIRECTOR 20 DIRECTOR 30 DIRECTOR NUME SALARIU DATA_ANG --------------------------------------AVRAM CALIN 2450 09-JUN-81 STOICA DAN 2975 02-APR-81 NEGRU GELU 2850 01-MAY-81 Următoarea cerere face o listă cu toate persoanele care s-au angajat într-o anumită perioadă de timp: SQL>SELECT id_dep depart. putem folosi următoarea cerere: SQL>SELECT id_dep depart.

7876) ORDER BY nume. rezultatul va fi întotdeauna FALSE (de exemplu expresia COMM != NULL este întotdeauna falsă). ECUSON -----------7876 7902 7499 NUME ----------------ADAM SORIN FLORESCU AUREL TACHE IONUT FUNCTIE ---------------TEHNICIAN ANALIST PROGRAMATOR VENIT --------1100 3000 1750 Folosind operatorul LIKE asociat cu doua simboluri. atunci operatorul de comparaţie trebuie să fie IS sau IS NOT NULL. sau expresie cu NULL.0) venit FROM angajati WHERE id_ang IN (7499. vor fi selectaţi toţi directorii care au salariul peste 1500 $ şi toţi tehnicienii(fără condiţia de salariu): . Predicatul AND este adevărat.7902. ECUSON ---------7369 7902 NUME FUNCTIE ----------------------------------POPA ION TEHNICIAN FLORESCU AUREL ANALIST DATA_ANG ----------------17-DEC-80 03-DEC-80 Dacă se compară o coloană. nume. este posibil să selectăm rândurile care se potrivesc cu un şir sau subşir de caractere. numai dacă ambele condiţii sunt TRUE. pot fi listaţi cu următoarea cerere: SQL>SELECT id_ang ecuson. iar predicatul OR este adevărat dacă cel puţin una din condiţii este TRUE. nume. Se pot combina AND sau OR în acceaşi expresie logică în clauza WHERE. care au ecusoane într-o listă. data_ang FROM angajati WHERE data_ang LIKE ‘%DEC-1980’. În exemplul următor. operatorii AND sunt evaluaţi primii şi apoi operatorii OR (deci operatorii AND au o precedenţă mai mare decat OR). Dacă se foloseşte orice alt operator.64 BAZE DE DATE ON-LINE Angajaţii. Operatorii AND şi OR pot fi utilizaţi pentru a compune expresii logice cu condiţii multiple. functie. Cele două simboluri sunt : Simbol Semnificaţie --------------------------------------------------% orice secvenţă de mai multe caractere un singur caracter Lista persoanelor angajate în luna decembrie 1980 se obţine cu următoarea cerere: SQL>SELECT id_ang ecuson.functie. iar în acest caz. salariu+nvl(comision.

AND 4.table2] table2_alias. OR Pentru a fi siguri de ordinea de execuţie a două operaţii. 2.. LIKE. Metode de JOIN Pentru extragerea datelor din mai multe tabele din baza de date. BETWEEN. NOT 3.column expr_alias FROM [schema. ECUSON -----7566 7698 7782 7369 7876 NUME ----------------STOICA DAN NEGRU GELU AVRAM CALIN POPA ION ADAM SORIN FUNCTIE SALARIU ------------------.returnează numai o înregistrare în cazul în care comanda gaseşte rânduri duplicate ALL – returnează toate înregistrările simple şi duplicate ( selectează de asemenea toate coloanele tabelelor din clauza FROM) . Operatorii de comparaţie şi operatorii SQL au precedenţa egală: =.4. Precedenţa operatorilor logici este următoarea: 1. [schema.ALL] [table].salariu.colum= table2_alias.id_dep depart FROM angajati WHERE salariu > 1500 AND functie = 'DIRECTOR' OR functie = 'TEHNICIAN’ ORDER BY functie. Sintaxa pentru un join simplu este următoarea: SELECT [DISTINCT. se recomandă folosirea parantezelor rotunde.. Parametrii comenzii au următoarea semnificaţie( cei dintre paranteze sunt opţionali): DISTINCT .Limbajul SQL SQL>SELECT id_ang ecuson. IS NULL.colum ORDER BY expresion(position)] [ASC.nume. >= . <>. cererea SELECT foloseşte una sau mai multe metode de JOIN. IN.DESC]. 5.--------DIRECTOR 2975 DIRECTOR 2850 DIRECTOR 2450 TEHNICIAN 800 TEHNICIAN 1100 DEPART --------20 30 10 20 20 65 Dacă operatorii au precedenţă egală.functie. atunci ei se evaluează de la stanga la dreapta.table1] table1_alias.AND. WHERE table1_alias.

nume.id_dep . Equi-join şi Non Equi-join Dacă în condiţia de join. pentru a nu crea ambiguitate când referim coloane cu aceeaşi denumire.a.salariu.table_name expr_alias – este un nume alocat unei expresei care va fi folosit în formatarea coloanei ( apare în antetul listei) table_alias – este un nume alocat unei tabele(view) care va fi folosit în cereri corelate WHERE condition – reprezintă o clauză (înlănţuire de condiţii) care trebuie să fie îndeplinită în criteriul de selecţie a înregistrărilor ORDER BY expresion(position) – ordonează înregistrările selectate după coloanele din expresie. deci se impune un join între cele două tabele. Sunt situaţii când trebuie să folosim şi equi-join şi non equi-join într-o cerere .id_dep=10. apar numai egaliţăti. folosim tabela angajati. dacă dorim să listăm numele angajaţilor. Să luăm un exemplu simplu pentru a arăta cum funcţionează un join. avem de-a face cu un equi-join. ID_DEP DEPARTAMENT NUME -----------------------------------------10 MARKETING AVRAM CALIN 10 MARKETING COSTESCU GEORGE 10 MARKETING MILESCU SILVIU FUNCTIE ----------------DIRECTOR PRESEDINTE TEHNICIAN Se observă că au fost folosite alias-uri pentru tabele. pentru ca în listă să apară şi denumirea departamentului. Pentru a putea să realizăm un join pe mai multe tablele. avem un non equi-join.id_dep and a. însă în această tabelă găsim asociat fiecărui angajat un id_dep. SQL>SELECT a. va trebui să facem join după trei tabele: SQL>SELECT c. b. sau în ordinea coloanelor specificate prin poziţie. Când două sau mai multe tabele nu au coloane comune şi trebuie totuşi relaţionate.66 BAZE DE DATE ON-LINE schema. iar denumirea departamentului respectiv o găsim în tabela departamente.b. gradul de salarizare şi denumirea departamentului 20 din care fac parte.id_dep=b. 5. este obligatoriu ca ele să conţină coloane de acelaşi tip cu date comune sau corelate.den_dep.nume.5. În exemplul anterior. a.a.grad .table – reprezintă shema de identificare a tabelei(view-lui) specificată prin user. departamente b WHERE a. Pentru a lista angajaţii dintr-un departament.a.functie FROM angajati a.den_dep departament.

grila_salar b. a. b.nume nume_sef. aşa cum se vede în exemplul următor. NUME_ANG ----------------MILESCU SILVIU AVRAM CALIN FUNCTIE_ANG NUME_SEF -----------------------------------------TEHNICIAN AVRAM CALIN DIRECTOR COSTESCU GEORGE FUNCTIE_SEF ------------------DIRECTOR PRESEDINTE 5.id_ang AND a. departamentul 40 care nu are niciun angajat şi folosind equi-join acesta nu apare în listă. b.nivel_inf AND b.nume. Pentru a depăşi situaţia.den_dep. Joinul unei tabele cu ea însăşi Sunt situaţii când avem nevoie să extragem date corelate din aceeaşi tabelă. SQL>SELECT a.id_sef=b. Există.nume nume_ang.id_dep.id_dep=b. De exemplu. trebuie să extragem din tabelă angajati şi numele şefului (id_sef).id_dep=20.a.Limbajul SQL FROM angajati a. .nivel_sup AND a. Un exemplu ar fi să construim structura organizatorică a firmei selectând toate departamentele şi angajaţii care fac parte din fiecare departament.id_dep=10.b.b. angajati b WHERE a. dacă dorim să afişăm care sunt şefii angajaţilor.functie FROM departamente a. SQL>SELECT a. Apar situaţii când cererea trebuie să selecteze şi înregistrări care nu îndeplinesc toate condiţiile din clauză.functie functie_ang. în tabela departamente. angajati b WHERE a. Join extern Folosind equi-join putem selecta toate înregistrările care îndeplinesc condiţiile din clauza WHERE.7.id_dep AND a.salariu BETWEEN b.6.id_dep=c.functie functie_sef FROM angajati a.id_dep(+). se foloseşte un join extern (+). DEN_DEP -----------------------------CONTABILITATE CONTABILITATE NUME SALARIU ---------------------------POPA ION 800 ADAM SORIN 1100 GRAD -------1 2 67 5. departamente c WHERE a.

se poate utiliza cererea următoare: SQL> SELECT id_dep. Să dăm câteva exemple. ID_DEP NUME ---------------------10 AVRAM CALIN 10 COSTESCU GEORGE FUNCTIE SALAR_COM SAL_COM ----------------------------. date). MINUS (diferenţă). Să construim o cerere care reuneşte pe aceeaşi coloană salariile angajaţilor din departamentul 10 şi cu comisioanele celor din departamentul 30. Dacă dorim lista angajaţilor din departamentele 10 si 30.functie. INTERSECT (intersecţie). join-ul se face după coloane de acelaşi tip. În acest caz. SQL>SELECT id_dep. Join vertical Join-ul vertical este folosit pentru concatenarea rezultatelor mai multor cereri SELECT şi foloseşte operatorii UNION (reuniune).8.salariu FROM angajati WHERE id_dep=30.nume. 'are salariu' salar_com. Trebuie reţinut că reuniunea se poate face pe coloane declarate de acelaşi tip (number. pentru a arăta modul de utilizare a acestor operatori în construcţia unei cereri de interogare.nume. chiar dacă au semnificaţii diferite. de aceea se mai numeşte şi vertical. nume. comision FROM angajati WHERE id_dep=30. varchar.--------DIRECTOR are salariu = 2450 PRESEDINTE are salariu = 5000 . nume. functie. salariu sal_com FROM angajati WHERE id_dep=10 UNION SELECT id_dep. 'are comision '.salariu FROM angajati WHERE id_dep=10 UNION SELECT id_dep. nu după rânduri.functie.68 BAZE DE DATE ON-LINE NUME FUNCTIE ------------------------------------------AVRAM CALIN DIRECTOR COSTESCU GEORGE PRESEDINTE POPA ION TEHNICIAN STOICA DAN DIRECTOR NEGRU GELU DIRECTOR ID_DEP DEN_DEP --------.-----------------------------10 MARKETING 10 MARKETING 20 CONTABILITATE 20 CONTABILITATE 30 PROIECTARE 40 VANZARI 5. functie.

Dacă dorim să aflăm care sunt funcţiile angajaţilor care au primit acelaşi comision şi care se regăsesc în toate departamentele. variabilă sau o referire de coloană ) şi întorc o valoare. Operatorul INTERSECT este folosit pentru a selecta înregistrările comune. FUNCTIE ------------------PRESEDINTE 5. scriem următoarea cerere: SQL> SELECT functie.) Rolul lor este de a face mai puternice cererile SQL şi se pot folosi pentru: .9.prelucrarea datei calendaristice . care întoarce un rezultat.Limbajul SQL 10 30 MILESCU SILVIU IONESCU VICTOR TEHNICIAN TEHNICIAN are salariu = are comision = 69 1300 500 Folosind operatorul UNION ALL se selectează şi înregistrările duplicate: SQL>SELECT functie FROM angajati WHERE id_dep=10 UNION ALL SELECT functie FROM angajati WHERE id_dep=20.schimbarea formatului datelor pentru afişare . arg2. folosim operatorul MINUS : SQL> SELECT functie FROM angajati WHERE id_dep = 10 MINUS SELECT functie FROM angajati WHERE id_dep = 30... Sintaxa pentru funcţie este următoarea: function_name(arg1. Funcţii în SQL Funcţia poate fi vazută ca un operator de manipulare a datelor. comision FROM angajati where id_dep=10 INTERSECT SELECT functie.. care nu se regăsesc în departamentul 30.comision FROM angajati where id_dep=20 INTERSECT SELECT functie.prelucrare de şiruri de caractere .comision FROM angajati where id_dep=30 Pentru a afla care sunt funcţiile din departamentul 10.efectuarea calculelor numerice . Funcţiile acceptă unul sau mai multe argumente (constantă .

n) – returnează restul împărţirii lui m la n SQL> SELECT mod(14.returnează 0.returnează valoarea 15 COS (n) – returnează cosinus (n) unde n este în radiani SQL> SELECT cos(180 * 3.5538 LOG (m. -1) FROM dual.2 SQL> SELECT round(15.returnează valoarea 4.193.5) FROM dual. -.70 BAZE DE DATE ON-LINE . -. -. -.m]) – returnează n rotunjit la : m zecimale dacă m>0 0 zecimale dacă m este omis m cifre înainte de virgulă dacă m<0 SQL> SELECT round(15. -.returnează 15.conversia tipurilor de date În funcţie de specificul lor.returnează valoarea 11 LN (n) – returnează logaritmul natural al lui n (n>0) SQL> SELECT ln(95) FROM dual.returnează valoarea 54. -.returnează valoarea 1 EXP (n) – returnează e la puterea n (e=2.returnează 20 SIGN (n) – returnează -1 dacă n<0.14/180) FROM dual. -.193. unde n este în radiani SQL> SELECT sin(30 * 3.) SQL> SELECT exp(4) FROM dual. -. -.returnează -1 COSH (n) – returnează cosinus hiperbolic SQL> SELECT cosh(0) FROM dual.n) – returnează logaritmul în baza m al lui n SQL> SELECT log(10. ABS (n) – returnează valoarea absolută a lui n SQL> SELECT abs(-12) FROM dual.7182.returnează valoarea 12 CEIL (n) – returnează cel mai mic întreg >= n SQL> SELECT ceil(14.5 . -.14/180) FROM dual.returnează 15 SQL> SELECT round(15.returnează valoarea 2 MOD (m. 0 dacă n=0 şi 1 dacă n>0 SQL> SELECT sign(-17.193) FROM dual.returnează valoarea -1 SIN (n) – returnează sinus (n). -. -.7) FROM dual.100) FROM dual.2) FROM dual.5) FROM dual. -..6) FROM dual.returnează valoarea 9 ROUND (n[. -.n) – returnează m la puterea n SQL> SELECT power(3. 1) FROM dual. -.5981 FLOOR (n) – returnează cel mai mare întreg <= n SQL> SELECT floor(11. se pot împărţi în următoarele tipuri: * * * * * * Funcţii numerice Funcţii pentru şiruri Funcţii pentru data calendaristică Funcţii de conversie Funcţii diverse ( care acceptă orice tip de argumente) Funcţii de grup Funcţii numerice Aceste funcţii acceptă la intrare valori numerice şi returnează tot o valoare numerică.returnează valoarea 4 POWER (m.

5) FROM dual. -.193) FROM dual.’BL’) FROM dual. -. dacă m<0 SQL> SELECT trunc(15.099 TAN (n) – returnează tangenta lui n .returnează valoarea BLACK si BLUE RPAD (char1.char2) – returnează concatenarea lui char1 cu char2 SQL> SELECT concat(concat(nume. unde n>0 SQL> SELECT sqrt(26) FROM dual.n.20.193.string1. 1) FROM dual. -.returnează 0. -.returnează valoarea 5. iar cele de tip CHAR pot avea lungimea maximă de 255 caractere.functie) nume_functie FROM angajati WHERE id_ang=7839. pot avea lungimea maximă 2000 caractere. CHR (n) – returnează caracterul care are reprezentarea binară n SQL> SELECT chr( 75) FROM dual.'*') completare_nume FROM angajati WHERE id_dep=10.m]) – returnează n trunchiat la : m zecimale dacă m>0 0 zecimale dacă m este omis m cifre înainte de virgula.returnează 10 71 Funcţii pentru şiruri Aceste funcţii acceptă la intrare valori alfanumerice şi returnează o valoare numerică.4621 TRUNC (n[. -. NUME_FUNCTIE -------------------------------------------------------COSTESCU GEORGE este PRESEDINTE INITCAP (char) – returnează char cu majuscule SQL> SELECT initcap(’popescu mihai’) FROM dual.193.[string2]) – înlocuieşte în string caracterele din string1 cu caracterele din string2 SQL> SELECT replace(’JACK si JUE’.14/180) FROM dual. Cele care returnează valori de tip VARCHAR2.returnează valoarea K CONCAT (char1.returnează 15.1752 SQRT (n) – returnează rădăcina pătrată a lui n. -1) FROM dual.’ este ’).1 SQL> SELECT trunc(15. sau tot o valoare alfanumerică. -.returnează -1 TAN (n) – returnează tangenta hiberbolică a lui n . -. -.returnează valoarea 1. -.returnează 15 SQL> SELECT trunc(15. COMPLETARE_NUME ---------------------------------- . -.’J’. unde n este în radiani SQL> SELECT tanh( 0.[char2]) – adaugă la dreapta lui char1 caracterele char2 până la lungimea n SQL> SELECT rpad(nume.returnează Popescu Mihai REPLACE (string. unde n este în radiani SQL> SELECT tan(135 * 3.Limbajul SQL SINH (n) – returnează cosinus hiperbolic SQL> SELECT sinh(1) FROM dual.

e.'scu') FROM dual.data_ang. --returnează 7 LENGTH (char) – returnează lungimea lui char ca număr de caractere SQL> SELECT length(’analyst’) FROM dual. care întoarce o valoare numerică.last_day(data_ang) ultima_zi FROM angajati WHERE id_dep=10.n]) – returnează n caractere din char.data_ang. NUME DATA_ANG ----------------------------------------AVRAM CALIN 09-JUN-81 COSTESCU GEORGE 17-NOV-81 ULTIMA_ZI ----------------30-JUN-81 30-NOV-81 .’op’.n) – returnează o dată prin adaugarea a n luni la date. SQL>SELECT nume.n şi ’31-DEC4712’ e.n. Plaja datei calendaristice este între ’1-JAN-4712’ i.set]) şterge din char ultimele caractere dacă sunt în set SQL> SELECT rtrim('Popescu'.3) FROM dual. începând cu poziţia m SQL> SELECT substr (’Popescu ’. -. Toate funcţiile de tip dată calendaristică întorc o valoare de tip DATE cu excepţia lui MONTHS_BETWEEN.m]]) – returnează poziţia lui char2.char2[. începând cu poziţia n la a m-a apariţie SQL> SELECT instr(’Protopopescu’. ADD_MONTHS (date.72 AVRAM CALIN* * * * ***** COSTESCU GEORGE***** MILESCU SILVIU* * * * * * BAZE DE DATE ON-LINE RTRIM (char[.2. SQL>SELECT nume.returnează Pope SUBSTR (char. -.add_months(data_ang. .3) data_mod FROM angajati WHERE id_dep=10.n[.returnează 7 Funcţii pentru dată calendaristică Datele calendaristice pot fi stocate în următorul format intern: Secol / An / Luna / Ziua / Ora / Minut / Secunda Formatul implicit de afişare sau intrare pentru o dată calendaristică este DDMON-YY.2) FROM dual.returnează ope INSTR (char1.m[.3. NUME DATA_ANG ----------------------------------------AVRAM CALIN 09-JUN-81 COSTESCU GEORGE 17-NOV-81 DATA_MOD ----------------09-SEP-81 17-FEB-82 LAST_DAY (date) – returnează data ultimei zile din luna cuprinsă în date.

data_ang) luni_vechime FROM angajati WHERE id_dep=10.30665 COSTESCU GEORGE 18-NOV-06 17-NOV-81 300. SQL>SELECT to_date(sysdate.date2) – returnează numărul de luni (şi fracţiuni de lună ) cuprinse între date1 şi date2.sysdate.’DD-MM-YYYY hh:MI:SS AM’) data_crt FROM dual. SQL>SELECT round(to_date(’17-NOV-2010’). SQL>SELECTnume.data_ang.Limbajul SQL 73 MONTHS_BETWEEN(date1. ’YEAR’) rot_an FROM dual.fmt) – returnează data prin trunchierea lui date la formatul fmt. SQL>SELECT trunc(to_date(’17-NOV-2010’). ’YEAR’) trunc_an FROM dual. ROT_AN --------------01-JAN-2010 TRUNC(date. altfel va fi negativ. DATA_CRT --------------18-APR-2011 . NUME SYSDATE DATA_ANG LUNI_VECHIME -----------------------------.---------------------AVRAM CALIN 18-NOV-06 09-JUN-81 305.-------------. Dacă date1>date2 rezultatul va fi pozitiv. TRUNC_AN -------------01-JAN-2010 SYSDATE – returnează data curentă(data sistem) în diferite formate.04858 ROUND(date.fmt) – returnează data prin rotunjirea lui date la formatul fmt. months_between(sysdate.

7 Formatul pentru numere poate fi : Format Semnificaţie Exemple ----------.YYYY’) data FROM dual.------------------------- . functie. SQL> SELECT to_date(’15112010’ . SQL> SELECT nume.-----------SAVESCU OVIDIU ANALIST 3000 ADAM SORIN TEHNICIAN 1100 PRIMA ---------3198. Pentru calculul primei în funcţie de anul angajării. 1987 TO_DATE(char[. YYYY') data_ang FROM angajati WHERE to_char(data_ang. NUME ----------------SAVESCU OVIDIU ADAM SORIN DATA_ANG -----------------April 19. salariu.'yyyy'))/10 prima FROM angajati WHERE to_number(to_char(data_ang .’nlsparams’]]) – face conversia unei date de tip DATE în format VARCHAR2. TO_CHAR(date[.fmt[.----------------------------------------------------. DATA ----------15-NOV-2010 TO_NUMBER(char[.’nlsparams’]]) – face conversia unei variabile de tip CHAR sau VARCHAR2 în format DATE. to_char(data_ang. folosim comanda: SQL> SELECT nume.'YYYY') LIKE '1987'. NUME FUNCTIE SALARIU ----------------------------------.74 BAZE DE DATE ON-LINE Funcţii de conversie Aceste funcţii fac conversia unui tip de dată în alt tip de dată.’DD-MON. 1987 May 23.'YYYY'))=1987.fmt[.fmt[.’nlsparams’]]) – face conversia unei variabile de tip CHAR sau VARCHAR2 în format NUMBER. 'Month DD.7 1298. salariu+to_number(to_char(data_ang.

99 1234.'ANALIST'.) – returnează cea mai mica valoare din lista de argumente. GREATEST(12.salariu*1. SQL> SELECT greatest(12.expr2].result1..salariu/4) prima FROM angajati WHERE id_dep=20 . Funcţia DECODE este considerată cea mai puternică funcţie SQL. decode(functie. DECODE(expr.expr2]. iar dacă nu găseşte nicio egalitate.999 1.34.expr este comparată cu fiecare valoare search şi întoarce rezult dacă expr este egală cu valoarea search.234 semnele minus la dreapta(valori negative) 999999MI 1234paranteze pentru numere negative 999999PR <112> notaţie ştiinţifică 99. GREATEST(expr1 [.Limbajul SQL 9 0 $ .de 9 determină lungimea de afişare) 999999 1234 afişează zerourile de la început 099999 001234 semnul dolar $999999 $1234 punct zecimal 99999. salariu*1.77..functie.15.89) -------------------------------89 LEAST(expr1 [..23E+03 înmulţire cu 10 (n=număr de 9 după V) 9999V99 123400 afişează valori zero ca blancuri nu 0 B9999.00 virgula 999.999EEEE 1.search1.77.) – returnează cea mai mare valoare din lista de argumente.salariu.'DIRECTOR'..25.89) from dual. MI PR EEEE V B 75 numere(nr... întoarce valoarea default.00 Funcţii diverse Aceste funcţii acceptă orice tip de argumente. Tipurile de parametri pot fi : * expression poate fi orice tip de dată * search este de acelaşi tip ca expression * result este valoarea întoarsă şi poate fi orice tip de dată * default este de acelaşi tip ca expression În exemplul următor. se calculează prima în raport de funcţia angajatului: SQL> SELECT nume.. deoarece are efectul unui case sau a unei construcţii if-then-else.34. .99 1234.default) .

5 550 Dacă dorim să aflăm valorile medii pe fiecare departament.avg(salariu).comision.76 ORDER BY functie. AVG([DISTINCT/ALL] expr) – returnează valoarea medie a lui expr.avg(comision) FROM angajati. ignorând valorile nule.nvl(comision. dar nu pot fi apelate în clauza WHERE. nu pe o singură înregistrare. folosim următoarea cerere: SQL> SELECT avg(salariu). NUME ----------------------------IONESCU VICTOR MARINESCU MIHAI DATA_ANG COMISION ---------------.0) nvl_com FROM angajati WHERE id_dep=30 ORDER BY nume.75 NVL(expr1 .------------.data_ang. Se poate folosi operatorul DISTINCT pentru a sorta numai elementele distincte din lista. dar se poate folosi şi operatorul ALL pentru a considera şi înregistrările duplicate. ca cele prezentate la punctele anterioare.---------------03-DEC-1981 22-FEB-1981 500 NVL_COM --------------0 500 Funcţii de grup Aceste funcţii returnează rezultate bazate pe grupuri de înregistrări. . BAZE DE DATE ON-LINE NUME FUNCTIE SALARIU PRIMA ---------------------------------.--------SAVESCU OVIDIU ANALIST 3000 3450 FLORESCU AUREL ANALIST 3000 3450 STOICA DAN DIRECTOR 2975 3718. Funcţiile de grup pot fi apelate şi în clauza HAVING. trebuie să folosim obligatoriu clauza GROUP BY: SQL>SELECT id_dep. Gruparea se face folosind clauza GROUP BY într-o cerere SELECT şi în acest caz toate elementele listei trebuie cuprinse în clauza de grupare. AVG(SALARIU) AVG(COMISION) -------------------------------------------2062. Pentru a afla valoarea medie a salariului şi comisionului pe toate departamentele.expr2) – returnează expr2 dacă expr1 este null SQL>SELECT nume.avg(comision) FROM angajati GROUP BY id_dep.

6667 550 77 COUNT(* | [DISTINCT/ALL] expr) – returnează numărul de înregistrări întoarse de interogare. ID_DEP COUNT(*) COUNT(COMISION) COUNT(ALLCOMISION) COUNT(DISTINCTCOMISION) -----------------------------------10 3 0 20 5 0 30 6 4 --------------0 0 4 -----------------0 0 4 MAX([DISTINCT/ALL] expr) – returnează valoarea maxima pentru expresie. iar dacă se foloseşte expr.departamente b WHERE a.id_dep GROUP BY a. min(salariu + nvl(comision.b. folosim următoarea cerere: SQL> SELECT id_dep.returnează valoarea minimă pentru expresie Pentru a afla care este venitul minim pe fiecare departament. Pentru a afla numărul angajaţilor care au primit comision pe fiecare departament. folosim cererea: SQL> SELECT a. inclusiv cele nule. Dacă se foseşte *.count(distinct comision) FROM angajati GROUP BY id_dep.id_dep.den_dep. count(all comision). folosim cererea: SQL> SELECT id_dep.6667 30 1541.0)) venit_minim . Pentru a afla salariul maxim pe fiecare departament.id_dep=b.count(*).id_dep. se numără toate înregistrările. ID_DEP DEN_DEP -----------------------------------10 MARKETING 20 CONTABILITATE MAX(SALARIU) ----------------------5000 3000 MIN([DISTINCT/ALL] expr) .count(comision).b. se numără numai înregistrările not null.max(salariu) FROM angajati a.den_dep.Limbajul SQL ID_DEP AVG(SALARIU) AVG(COMISION) ----------------------------------------10 2916.

subcererile pot fi împărţite în : * Subcereri ascunse * Subcereri corelate * Subcereri pe tabela temporară * Subcereri pe clauza HAVING . sum(distinct salariu). UPDATE. INSERT şi CREATE TABLE.în furnizarea valorilor pentru condiţii puse în comenzile SELECT. sum(comision) FROM angajati GROUP BY id_dep.78 FROM angajati GROUP BY id_dep.sum(salariu). . Subcereri SQL Subcererile sunt cereri SQL incluse în clauzele SELECT. FROM. ID_DEP SUM(SALARIU) SUM(DISTINCTSALARIU) SUM(COMISION) -------------------------------------.10. SUM([DISTINCT/ALL] expr) – returnează suma valorilor pentru expresie Pentru a calcula suma salariilor şi comisioanelor pe fiecare departament. DELETE. ID_DEP VENIT_MINIM -------------------------10 1300 20 800 30 950 BAZE DE DATE ON-LINE Trebuie menţionat că operatorii DISTINCT şi ALL nu au niciun efect pentru funcţiile MIN şi MAX.inserarea. Rezultatele întoarse de o subcerere sunt folosite de o altă subcerere sau de cererea principală în situaţii cum ar fi: . modificarea şi ştergerea înregistrărilor din tabele. . Din punct de vedere al rolului pe care îl au într-o cerere SQL şi a modului de a face construcţia comenzii. folosim cererea: SQL> SELECT id_dep. WHERE. HAVING sau ORDER BY ale altei cereri numite şi cerere principală.------------10 8750 8750 20 10875 7875 30 9250 8000 2200 5.crearea de tabele sau view-uri.

subcererea se execută de mai multe ori.expr y [AND.salariu FROM angajati WHERE functie IN (SELECT DISTINCT functie FROM angajati WHERE id_dep=20).. NUME ----------------SAVESCU OVIDIU STOICA DAN FUNCTIE SALARIU -----------------------ANALIST 3000 DIRECTOR 2975 Subcereri corelate Subcererile corelate se execută o dată pentru fiecare linie candidat.expr x = table 1.. .functie.. 79 Subcereri ascunse Subcererile ascunse pot fi împărţite în mai multe categorii... cererea SELECT din subcerere rulează prima şi se execută o singură dată..OR] .. în funcţie de numărul de coloane sau linii pe care le returnează: * Subcereri care întorc o valoare * Subcereri care întorc o coloană * Subcereri care întorc o linie * Subcereri care întorc mai multe linii Dacă vrem să aflăm salariile angajaţilor. O subcerere corelată se join-ează cu cererea exterioară prin folosirea unei coloane a cererii exterioare..Limbajul SQL * Subcereri pe clauza SELECT * Subcereri pe clauza ORDER BY Sintaxa unei subcereri este: SELECT expr 1. expr n FROM table 1 WHERE (expr 1. câte o dată pentru fiecare linie prelucrată de cererea principală. întorcând valori ce vor fi folosite de cererea principală. deci cererea interioară este condusă de cererea exterioară. folosim următoarea cerere : SQL>SELECT nume. În cazul unei subcereri ascunse. ).. Pentru o cerere corelată. care au funcţii similare funcţiilor aferente departamentului 20.expr k) IN [NOT IN] ( SELECT expr 1. în clauza predicatului cererii interioare. .expr k FROM table 2 WHERE table 2. prelucrată de cererea principală şi la execuţie folosesc cel puţin o valoare dintr-o coloană din cererea principală.

.salariu FROM angajati a WHERE a. deci nu conţin clauza ORDER BY.expresiile din lista de expresii a subcererii trebuie să fie în aceeaşi ordine ca cele din lista din clauza WHERE a cererii principale( având acelaşi tip şi număr de expresii ).id_dep. trebuie respectate câteva reguli.id_dep=a.se folosesc valorile rezultate din cererea interioară pentru a prelucra linia candidat.se obţine linia candidat prin procesarea cererii exterioare. .în subcereri se pot folosi operatori de mulţimi. .clauza ORDER BY apare la sfârşitul cererii principale. folosim cererea următoare: SQL> SELECT a.80 BAZE DE DATE ON-LINE Paşii de execuţie ai unei subcereri corelate sunt: .salariu > (SELECT avg(salariu) salariu_mediu FROM angajati b WHERE b.se repetă până nu mai rămâne nicio linie candidat. cum ar fi: . care se corelează cu cererea principală prin condiţia din clauza WHERE. . .nume. . deşi subcererea corelată se execută repetat. . .subcererile sunt executate de la cea mai adâncă imbricare pâna la nivelul principal de imbricare(cu excepţia cererilor corelate). Când folosim subcereri.a. Dacă vrem să aflăm persoanele care au salariul peste valoarea medie salariului pe departamentul din care fac parte.se execută cererea interioară corelată cu valoarea liniei candidat.subcererile pot folosi funcţii de grup şi clauza GROUP BY . .a. . Trebuie specificat că.subcererile pot fi imbricate până la nivelul 255.functie.a.cererea interioară trebuie să fie inclusă între paranteze şi trebuie să fie în partea dreaptă a condiţiei. În acest caz. . aceasta nu înseamnă că subcererile corelate sunt mai puţin eficiente decât subcererile ascunse.id_dep ) ORDER By id_dep. se foloseşte un join pe aceeaşi tabelă.subcererile nu pot fi ordonate. .subcererile pot fi înlănţuite cu predicate multiple AND sau OR în aceeaşi cerere externă. ID_DEP NUME ---------------------10 COSTESCU GEORGE 20 STOICA DAN 30 NEGRU GELU FUNCTIE SALARIU --------------------------PRESEDINTE 5000 DIRECTOR 2975 DIRECTOR 2850 Cererea principală procesează fiecare linie din tabela angajaţi şi păstrează toţi angajaţii care au salariul peste salariul mediu pe departamentul respectiv returnat de subcerere.

departamente d WHERE a. Structura unei tabele este dată de urmatoarele specificaţii de definire: * definirea coloanelor * definirea constrângerilor de integritate * definirea tablespace-lui unde se creează * definirea parametrilor . DEN_DEP -----------------------------PROIECTARE FUNCTIE NR_ANG -------------------------------PROGRAMATOR 4 81 5. expr n FROM table 1 WHERE conditions HAVING expr..functie.id_ang) = (SELECT max(count(id_ang)) FROM angajati GROUP BY id_dep. functie) GROUP BY d.. a.den_dep. Crearea şi definirea stucturilor tabelare Comenzile pentru crearea şi definirea de structuri tabelare sunt comenzi de definire a datelor (Data Definition Language – DDL) şi permit crearea dar şi relaţionarea lor intr-o bază de date.11.count(a.den_dep.Limbajul SQL Subcereri pe clauza HAVING Aceste subcereri sunt prinse în clauza HAVING într-o construcţie ca cea de mai jos : SELECT expr 1.id_dep = d... (operator) ( SELECT expr 1. folosim următoarea cerere: SQL>SELECT d. .functie. Pentru a afla ce departamente au cei mai mulţi angajaţi pe aceeaşi funcţie. a. Trebuie reţinut că o clauză HAVING se foloseşte întotdeauna împreună cu clauza GROUP BY şi într-o clauză HAVING se pot folosi funcţii de grup..expr k FROM table 2 WHERE conditions ) GROUP BY expresion.id_dep HAVING count(a.id_ang) nr_ang FROM angajati a.

numarul maxim de tranzacţii concurente (1-255) CLUSTER – specifică daca tabela face parte dintr-un cluster ENABLE/DISABLE clause – activare/dezactivare de constrângeri AS subquery – inserare de date dintr-o alta tabela obtinute printr-o interogare Tipurile de date care pot fi asociate coloanelor unei tabele pot fi : * tipuri numerice * tipuri alfanumerice * tipuri pentru data calendaristică şi timp * tipuri compuse ( matrice sau tabela) Cateva dintre cele mai uzuale tipuri sunt: NUMBER – număr real de dimensiune variabilă (maxim 38 cifre) NUMBER(n) – număr intreg de n cifre NUMBER(n.m) – număr real de n cifre din care m zecimale CHAR(n) – şir de caractere de lungime fixă n ( 1.4000) NVARCHAR2(n) – analog cu VARCHAR dar poate stoca şiruri de caractere LONG – sir de caractere de maxim 2 la puterea 31 octeti .82 BAZE DE DATE ON-LINE Crearea unei tabele Sintaxa comenzii de creare este urmatoarea (parametrii din paranteze sunt optionali): CREATE TABLE [schema.] table_name [table_constraint] column datatype [ DEFAULT expr ][ column_constraints] [ table_constraints ][ TABLESPACE tablespace] [ storage parameters ] [ ENABLE/DISABLE clause] [ AS subquery ] unde : schema – este schema unde se creează tabela (specifică userul şi baza de date) table_name – este numele tabelei column – este numele coloanei datatype – reprezinta tipul coloanei DEFAULT expr – specifică valoarea implicită a coloanei column_constraints – defineste constrângerile de integritate pentru coloana table_constraints .2000 ) NCHAR(n) – analog cu CHAR dar poate stoca şiruri de caractere nationale VARCHAR2(n) – sir de caractere de lungime variabilă n ( 1.defineşte constrângerile de integritate la nivel de tabela tablespace – specifica în ce tablespace al bazei de date se creează tabela storage parameters – defineşte parametrii de creare şi pot fi: PCTFREE – procentaj de spaţiu rezervat pentru update PCTUSED – procentaj minim folosit pentru un bloc de date INITRANS – numarul initial de tranzactii pentru fiecare bloc(1-255) MAXTRANS.

. discip_oblig varchar2(20) DEFAULT 'Matematica'. . e. . .dacă dimensiunea iniţială este insuficientă şi se aloca automat mai mult spaţiu în limita tablespace-lui ( care la randul lui poate fi extins cu un nou data_file). sa inceapă cu o litera şi să nu fie cuvant rezervat .c. operator DEFAULT user.clauza DEFAULT poate conţine constante numerice. constrângeri. .t.numele trebuie să aibă maxim 30 caractere continue.structurile tabelelor pot fi modificate şi ulterior (prin adaugare sau ştergere de coloane. cum ar fi : .Limbajul SQL LONG RAW – similar cu LONG dar conţine date binare ROWID – poate stoca identificatorul unei linii din tabelă DATE – data calendaristică TIMESTAMP(n) – extensie pentru tipul DATE şi conţine şi fracţiuni de secunda pe n zecimale 83 Când se creează o tabela trebuie respectate anumite reguli.valoarea DEFAULT este luată în considerare în cazul inserării unei linii în care nu se specifică nimic în legătura cu coloana respectivă. şir de caractere . indecşi. .2) .). catedra char(20). functii (inclusiv sysdate şi user) dar nu poate contine numele unei alte coloane sau pseudocoloane).la creare nu este necesar sa se specifice dimensiunea tabelei dar trebuie estimat ce spaţiu va ocupa în tablespace. data_op DEFAULT sysdate ). cnp number(13). data_nastere date.o tabela poate fi creată oricând dar nu poate fi alterată când este accesată de un alt user.userul trebuie să aibă drept de creare de tabele ( privilegiul CREATE TABLE).numele tabelei trebuie să fie unic în contul în care se creează şi nu este case sensitive. nume varchar2(30). Să creăm o tabela pentru evidenţa admiterii la facultate : SQL>CREATE TABLE studenti (facultate char(30) DEFAULT 'Automatica si Calculatoare'. discip_opt varchar2(20) DEFAULT 'Fizica' . . an_univ number(4) DEFAULT 2011. . . media_admitere number(5.

.constrângerile pot fi activate sau dezactivate cu comanda ALTER TABLE. Constrângerea NOT NULL Se aplica numai la nivel de coloane şi verifică dacă inregistrările au valori nule pe coloanele respective. Sintaxa la nivel de coloana este : column [ CONSTRAINT constraint_name ] NOT NULL Să creăm o tabelă pentru tipuri de funcţii: SQL>CREATE TABLE functii ( cod_functie number(2) CONSTRAINT NL NOT NULL. Constrângeri de integritate Constrângerile de integritate sunt anumite reguli care trebuie respectate la nivel de tabela sau în relaţiile cu alte tabele. Când se creează constrângeri pe o cheie primară se creează automat şi o costrangere NOT NULL pe coloanele respective ( o cheie primară nu trebuie să conţină valori nule pe coloanele care o definesc). Constrângerile de integritate pot fi : * NOT NULL – inregistrarile nu pot conţine valori nule * UNIQUE – defineşte o cheie unică pe una sau mai multe coloane ( nu pot fi mai multe inregistrări cu aceleaşi valori pe coloanele respective) * PRIMARY KEY – defineşte o cheie primară la nivel de coloană sau tabela ( nu pot fi mai multe inregistrări cu aceeaşi cheie primară). forţand un cod de eroare care anulează tranzacţia. ştergere si modificare şi în cazul în care nu se validează se generează o eroare şi tranzacţia nu se efectuează.informaţiile legate de constrângeri se pastrează în dicţionarul de date. * FOREIGN KEY – defineste o cheie externă ( tabela se relaţionează cu altă tabela pe o cheie unică sau cheie primară) * CHECK – forţează o condiţie pe coloană Trebuie specificate cateva caracteristici ale constrângerilor de integritate : . Aceste reguli sunt verificate automat în cazul operaţiilor de inserare. . .constrângerile pot fi adăugate sau sterse si ulterior creării tabelei.84 BAZE DE DATE ON-LINE În cazul inserării unei linii. .fiecare constrângere va avea un nume dat de user sau generat de sistem. 5. valorile campurilor operator şi data operare nu trebuie specificate deoarece sunt preluate cu funcţiile de sistem user şi sysdate.12.

Constrângerea PRIMARY KEY Se foloseşte pentru definirea cheii primare la nivel de coloana (când cheia conţine o singură coloană) sau la nivel de tabelă ( când cheia este compusă pe mai multe coloane). 85 Funcţionalitatea coloanelor cod_functie şi den_functie este aceeaşi (nu acceptă valori nule) dar consţructia constrângerii pentru cod_functie permite activarea sau dezactivarea lui NL. Verificarea se face numai pentru inregistrari cu valori nenule deoarece constrângerea permite inserarea de valori nule în coloanele respective. Constrângerea UNIQUE Se foloseşte când vrem ca o coloană sau perechi de coloane să nu conţină valori duplicate. data_vigoare date ) . data_vigoare date ). Sintaxa la nivel de coloană este: column [ CONSTRAINT constraint_name ] UNIQUE iar la nivel de tabela este: [. ceea ce duce la marirea vitezei de interogare pe tabelă. col 2. În prima consţructie putem insera oricate inregistrari cu valori nule pe coloanele definite unice dar în construcţia a doua nu putem sa inseram inregistrari cu una din coloane nulă şi cealaltă sa nu respecte unicitatea.Limbajul SQL den_functie varchar2(20) NOT NULL. data_vigoare date. den_functie varchar2(20). În mod automat se creează şi un index pe coloanele definite chei unice. Putem să facem şi urmatoarea construcţie la nivel de tabelă: SQL>CREATE TABLE functii ( cod_functie number(2).. den_functie varchar2(20) UNIQUE. CONSTRAINT UK_FUN UNIQUE (cod_functie.) Sa cream tabela funcţii definind unicitate pe anumite coloane: SQL>CREATE TABLE functii ( cod_functie number(2) CONSTRAINT UK_FUN UNIQUE.den_functie) ). CONSTRAINT constraint_name ] UNIQUE (col1.. Când se creeaza o cheie primară se creează în mod automat şi un index pentru a scurta timpul de răspuns în cazul unei interogări. . O tabelă poate avea o singură cheie primară şi nu accepta valori nule pentru nicio coloană care o definesc.

de exemplu pe codul funcţiei şi data la care intră în vigoare codificarea.) [ ON DELETE CASCADE|ON DELETE SET NULL ] .. ... CONSTRAINT constraint_name ] PRIMARY KEY (col1. col2. den_functie varchar2(20). col2. den_functie varchar2(20). o relaţionare pe cheie externă se poate face numai pe o cheie primară sau unică . Mai exact.data_vigoare)). data_vigoare date ). SQL>CREATE TABLE functii ( cod_functie number(2) . Constrângerea FOREIGN KEY Acest tip de constrângere se foloseste pentru relaţionarea unei tabele cu una sau mai multe tabele. Dacă dorim ca un cod de funcţie să poată fi utilizat de mai multe ori trebuie să definim cheia pe mai multe coloane. .. col 2. data_vigoare date. verificând dacă valorile conţinute în coloanele definite de FOREIGN KEY ( cheie straină sau cheie externă) sunt cuprinse în valorile coloanelor altei tabele care trebuie să fie definite UNIQUE sau PRIMARY KEY. CONSTRAINT PK_FUN PRIMARY KEY (cod_functie. Sintaxa la nivel de coloană este: column [ CONSTRAINT constraint_name ] REFERENCES table(column) [ ON DELETE CASCADE|ON DELETE SET NULL ] iar la nivel de tabelă este: column [ CONSTRAINT constraint_name ] FOREIGN KEY ( col1.) Dacă vrem să creăm un nomenclator de funcţii în care fiecare funcţie sa aibă cod unic folosim urmatoarea construcţie: SQL>CREATE TABLE functii ( cod_functie number(2) CONSTRAINT PK PRIMARY KEY..86 BAZE DE DATE ON-LINE Sintaxa la nivel de coloană este column [ CONSTRAINT constraint_name ] PRIMARY KEY iar la nivel de tabelă [.) REFERENCES table(col1.

Se observă că tabela este relaţionată cu ea insăşi după coloanele id_sef si id_ang. toate coloanele devin nule în liniile relaţionate. dacă se foloseşte opţiunea ON DELETE CASCADE.ştergerea unei linii din tabela de referinţă nu se poate face atâta timp cat există linii relaţionate pe linia respectivă în tabela relaţionată. salariu number(7.inserarea unei linii intr-o tabelă relaţionată (pe care am definit FOREIGN KEY) nu se poate face dacă nu există decat o singură linie. se poate folosi optiunea ON DELETE CASCADE şi în acest caz atunci când se şterge o linie în tabelă de referinţă se vor şterge toate liniile din tabelele relaţionate care sunt în relaţie cu linia respectivă. CONSTRAINT FK_ANG FOREIGN KEY (id_dep) REFERENCES departamente(id_dep) ). .2).2). atunci când se şterge o linie din tabela de referinţa toate coloanele de relaţie din tabela relaţionată vor deveni nule. Pentru a putea sa ştergem totuşi linii în tabela de referinţă. când se şterge o linie care este referită. De exemplu. deci nu vor fi şterse liniile relaţionate. O constructie la nivel de tabelă arată astfel: SQL>CREATE TABLE angajati ( id_ang number(4) PRIMARY KEY. .în tabela de referinţă ( în care am definit PRIMARY KEY sau UNIQUE) corespunzator coloanelor de relaţionare. id_sef number(4) REFERENCES angajati(id_ang). comision number(7. În cazul unei tabele relaţionată cu ea insăşi. la toţi angajaţii care au şeful respectiv se va face nulă coloana id_sef. nume varchar2(30). Când se foloseşte opţiunea ON DELETE SET NULL. când se şterge o linie aferentă unui şef.Limbajul SQL 87 Pentru a se putea face relaţionarea trebuie ca tabela funcţii să aibă cheie primară sau unică pe coloana den_functie iar tabela departamente sa aibă cheie primară sau unică pe coloana id_dep. id_dep number(2) . data_ang date. . . chiar daca sunt relaţionate din alte tabele.regulile de mai sus sunt valabile şi în cazul relaţionării pe coloane. Când se face relaţionarea intre doua tabele trebuie avute în vedere urmatoarele reguli de functionare : . functie varchar2(20) REFERENCES functii(den_functie). în tabela angajaţi.

13.88 BAZE DE DATE ON-LINE 5.c.M] DATAFILE ’filename’ INSTANCE integer [ storage parameters ] unde : schema – este schema unde este creată tabela (specifică userul şi baza de date) table_name – este numele tabelei column – este numele coloanei datatype – reprezintă tipul coloanei DEFAULT expr – specifică valoarea implicita a coloanei column_constraints – defineşte constrângerile de integritate pentru coloana table_constraints . de multe ori. e. renunţarea la anumite constrângeri de integritate sau adaugarea altora noi.t. . Sintaxa comenzii este următoarea : ALTER TABLE [schema.numarul maxim de tranzacţii concurente (1-255) CLUSTER – specifică daca tabela face parte dintr-un cluster Adăugarea unei noi coloane intr-o tabelă: SQL>ALTER TABLE departamente ADD ( interfon number(3) NOT NULL).defineste constrângerile de integritate la nivel de tabela tablespace – specifica în ce tablespace al bazei de date se creează tabela drop_clause – defineşte o constrângere care va fi ştearsă enable_clause – defineşte o constrângere care va fi activată disable_clause – defineşte o constrângere care va fi dezactivată storage parameters – defineşte parametrii care vor fi modificaţi si pot fi: PCTFREE – procentaj de spaţiu rezervat pentru update PCTUSED – procentaj minim folosit pentru un bloc de date INITRANS – numarul initial de tranzacţii pentru fiecare bloc(1-255) MAXTRANS. modificarea dimensiunilor coloanelor. Comanda ALTER TABLE Este una dintre cele mai folosite comenzi deoarece. structura unei tabele trebuie modificată pentru adăugarea sau ştergerea de coloane.] table_name ADD( column datatype ) [DEFAULT expr] ( column_constraints ) ( table_constraints ) MODIFY( column datatype ) [DEFAULT expr] ( column_constraints ) DROP drop_clause ENABLE enable_clause DISABLE disable_clause ALLOCATE EXTENT SIZE integer [K.

Comanda INSERT Această comandă este folosită pentru inserarea de linii într-o tabelă şi are următoarea sintaxă: INSERT INTO [schema.. .] VALUES (expr1.... Adăugarea unei noi constrângeri: SQL>ALTER TABLE departamente ADD CONSTRAINT UK_DEN UNIQUE (den_dep). . Marcarea unei coloane ca neutilizabilă: SQL>ALTER TABLE departamente SET UNUSED (interfon).) subquery unde : schema – este schema unde este creată tabela (specifica userul si baza de date) table_name – este numele tabelei view_name – este numele unui view creat pe tabela column – este numele coloanei expr – reprezintă valoarea aferentă coloanei subquery – este o subcerere care returnează linii cu date din una sau mai multe tabele ..] table_name[view_name][@dblink] [column 1. 89 Modificarea dimensiunii unei coloane (pentru descreşterea dimensiunilor tabela trebuie sa fie goală sau coloanele de modificat să conţină valori nule): SQL> ALTER TABLE departamente MODIFY ( telefon varchar2(12) ). Stergerea unei constrângeri: SQL>ALTER TABLE departamente DROP CONSTRAINT UK_DEN. column 2. 5.Limbajul SQL Stergerea unei coloane dintr-o tabelă: SQL>ALTER TABLE departamente DROP COLUMN interfon..14. expr2. Dezactivarea unei constrângeri: SQL>ALTER TABLE departamente DISABLE CONSTRAINT UK_DEN.

COD_UM) VALUES(777.1. Comanda DELETE Este folosită pentru stergerea liniilor dintr-o tabelă sau view şi are următoarea sintaxă: DELETE FROM [schema. .'12-DEC-2010'.33.333. 5.50).90 BAZE DE DATE ON-LINE Să facem o inserare completă (toate coloanele au valori nenule) în tabela intrari_gestiune.) IN [ NOT IN] subquery unde : schema – este schema unde este creată tabela (specifică userul şi baza de date) table_name – este numele tabelei condition – condiţia care trebuie indeplinită pentru liniile şterse column – este numele coloanei subquery – este o subcerere care returnează linii cu date din una sau mai multe tabele Pentru a şterge toate liniile din tabelă de stocuri folosim comanda: SQL>DELETE FROM stocuri_gestiune.. Dacă facem inserări numai în anumite coloane comanda arată astfel: SQL>INSERT INTO iesiri_gestiune (NR_DOC_OUT.COD_PRODUS.10.] table_name[view_name][@dblink] WHERE condition (column1.124. .2. În acest caz nu trebuie să specificăm numele coloanelor dar valorile trebuie specificate în clauza VALUES în ordinea de creare a coloanelor în tabelă.2). SQL> INSERT INTO intrari_gestiune VALUES(999.15. CANT_OUT. Pentru a sterge toate stocurile calculate în luna noiembrie folosim comanda: SQL>DELETE FROM stocuri_gestiune WHERE data_stoc LIKE '%NOV%'.'15-DEC-2010'.DATA_DOC_OUT.column2.

1.column2. Dacă dorim actualizarea preţurilor numai pentru anumite produse.noile valori fac duplicare de cheie primară sau unică. aşa cum se vede în exemplul următor în care toate preţurile unitare vor fi indexate cu 10%. .] table_name[view_name][@dblink] SET column=expr column=subquery (column1.. SQL>UPDATE intrari_gestiune SET pret_unitar=pret_unitar*1. Situaţiile în care pot apărea erori sunt: .subcererea returnează mai multe înregistrări. altfel comanda generează un cod de eroare şi tranzacţia eşuează.1 WHERE cod_produs IN (11.valorile noi nu respectă o constrângere FOREIGN KEY...Limbajul SQL 91 5.valorile vechi erau referite de alte tabele printr-o constrângere FOREIGN KEY. vom folosi comanda următoare: SQL>UPDATE intrari_gestiune SET pret_unitar=pret_unitar*1.12).actualizarea valorii cu o valoare nulă când coloana este NOT NULL.16. .valorile noi nu respectă o constrângere CHECK.) IN [NOT IN] subquery WHERE condition unde : schema – este schema unde este creată tabela (specifica userul şi baza de date) table_name – este numele tabelei column – este numele coloanei condition – condiţia care trebuie indeplinită pentru modificarea liniilor subquery – este o subcerere care returnează linii cu date din una sau mai multe tabele În absenţa clauzei WHERE toate liniile vor fi actualizate. . Comanda UPDATE Este folosită pentru actualizarea datelor în baza de date şi are următoarea sintaxă: UPDATE [schema. . . Când se face actualizarea datelor într-o tabelă se verifica automat şi constrângerile de integritate definite pe tabela respectivă. .

6. TRANZACŢII ŞI ACCES CONCURENT
Aşa cum s-a exemplificat în primul capitol, atunci când mai multe programe operează simultan pe aceleasi date pot să apară situaţii în care conţinutul bazei de date devine inconsistent: dacă paşii aceluiaşi program de rezervare de locuri rulat de la două agenţii de voiaj diferite sunt ca în tabelul de mai jos, deşi se rezervă două locuri numarul de locuri disponibile scade cu doar o unitate: Moment de timp Agentia 1 Agentia 2 A în BD t1 READ A 10 t2 READ A 10 t3 A=A–1 10 t4 A=A-1 10 t5 WRITE A 9 t6 WRITE A 9 În cazul accesului la aceleaşi date se spune că execuţiile programelor respective sunt concurente sau că există un acces concurent la date. Scopul acestui capitol este de a studia modalităţile de evitare a inconsistenţelor precum şi a problemelor ridicate de mecanismele folosite pentru aceasta.

6.1. Prezentarea problematicii. Terminologie
a. Tranzacţie Noţiunea de tranzacţie va fi rafinată în paragrafele următoare. Definiţia următoare este doar una de lucru pentru înţelegerea celorlalţi termeni din acest paragraf. Definiţie: O tranzacţie este o singură execuţie a unui program. În exemplul anterior există două tranzacţii, T1 şi T2, care sunt două execuţii ale aceluiaşi program. În general pot fi 2 sau mai multe tranzacţii care rulează simultan şi fiecare poate fi execuţia unui alt program. b. Articol (al unei baze de date) Definiţie: Un articol este o porţiune a bazei de date care se poate citi sau scrie sau bloca/debloca printr-o singură operaţie de READ, WRITE, LOCK respectiv UNLOCK. În exemplul anterior am folosit articolele simbolice (articolul era A). În cazurile reale un articol poate fi: • O întreagă tabelă

Tranzacţii şi acces concurent

93

Orice altă porţiune a bazei de date care îndeplineşte condiţia din definiţie în concordanţă cu facilităţile puse la dispoziţie de SGBD-ul respectiv. De exemplu sistemul Oracle blochează automat orice linie afectată de o comanda de tip UPDATE, INSERT şi DELETE până când tranzacţia care a efectuat operaţia fie comite modificările (le face permanente în baza de date) fie le revocă. În acest caz articolele sunt deci linii ale tabelei actualizate. c. Planificare Definiţie: O planificare reprezintă ordinea în care sunt executaţi de SGBD paşii elementari ai unui set de tranzacţii. Tabela de la inceputul acestui capitol este o vizualizare a unei planificari. Planificarea este deci o lista de paşi pentru un set de tranzacţii care se execută concurent şi arată că SGBD-ul execută aceşti paşi în exact acea ordine. În acest capitol vom reprezenta doar paşii care semnifică o interacţiune a tranzacţiei cu datele din baza de date: READ (citirea unui articol), WRITE (scrierea unui articol), LOCK (în diversele sale forme – blocarea unui articol) şi UNLOCK (deblocarea unui articol). Pentru cazurile în care operaţiile de scriere nu devin permanente în baza de date decât după comitere putem avea şi paşi de tip COMMIT (comiterea modificărilor efectuate de o tranzacţie) sau ROLLBACK (revocarea modificărilor efectuate de o tranzacţie). d. Planificare serială Definiţie: O planificare în care paşii fiecarei tranzacţii sunt succesivi, fără să fie intercalaţi paşi ai altor tranzacţii se numeşte planificare serială. e. Blocarea articolelor Definiţie: Blocarea unui articol de catre o tranzacţie semnifică faptul că acea tranzacţie obţine din partea sistemului (SGBD) anumite drepturi speciale de acces care împiedică alte tranzacţii să efectueze anumite operaţii asupra acelui articol. Există două categorii de blocări: • Blocări exclusive: celelalte tranzacţii nu pot să execute operaţii asupra articolului blocat. Aceste blocări sunt denumite în literatura de specialitate şi Exclusive Locks sau Write Locks. • Blocări partajate: celelalte tranzacţii pot să execute doar anumite tipuri de operaţii asupra articolului blocat. Aceste blocări sunt denumite în literatura de specialitate şi Shared Locks sau Read Locks.

• O linie (sau o multime de linii) dintr-o tabelă • O celulă dintr-o tabelă (valoarea pe o linie şi o coloană a tabelei)

6.2. Gestiunea tranzacţiilor
În paragraful anterior tranzacţia era definită ca o execuţie a unui program. În fapt un program care interacţionează cu o bază de date conţine de obicei nu o singura tranzacţie ci o succesiune de tranzacţii care nu se intersectează, fiecare

94

BAZE DE DATE ON-LINE

dintre ele fiind finalizata fie prin comiterea modificărilor efectuate (ele devin definitive în baza de date) fie prin revocarea lor (modificările sunt anulate). După terminarea unei tranzacţii celelalte operaţii asupra bazei de date aparţin tranzacţiilor urmatoare. Cum singurele operaţii care sunt importante din punct de vedere al interacţiunii dintre program şi sistemul de gestiune sunt cele de citire/scriere şi cele conexe (blocare, deblocare, comitere şi revocare) putem defini o tranzacţie şi ca o succesiune de operaţii de acest tip.

ACID
Pentru ca o tranzacţie să fie bine definită ea trebuie să indeplineasca nişte criterii de corectitudine care au fost sintetizate prin abrevierea ACID. Aceasta semnifică: • A – Atomicitate • C – Consistenţă • I – Izolare • D – Durabilitate. Atomicitate O tranzacţie trebuie să fie atomică în sensul că fie toate modificările efectuate de ea în baza de date sunt comise fie sunt toate revocate. Exemplu: Sa luam o tranzacţier care este o succesiune de actualizari în SQL care inserează, actualizează şi sterg linii din două tabele STUD şi SPEC:
INSERT INTO STUD … UPDATE SPEC … DELETE FROM STUD …

Aceste modificări trebuie ori comise ori revocate impreuna. Faptul că de exemplu doar inserarea şi stergerea sunt comise şi nu şi actualizarea este o încalcare a acestei reguli. Sistemul de gestiune este cel care trebuie să pună la dispoziţie mecanismele prin care să se asigura atomicitatea tranzacţiilor inclusiv în cazul unor incidente hardware şi software care pot interveni în timpul execuţiei unei tranzacţii. Consistenţa O tranzacţie care începe să lucreze pe o baza de date consistentă trebuie să o lase la final tot într-o stare consistentă. În acest sens o tranzacţie nu poate încalca restricţiile existente la nivelul bazei de date. În cele mai multe cazuri aceste restricţii sunt modelate sub forma constrângerilor de integritate (NOT NULL, PRIMARY KEY, etc). Dacă o tranzacţie conţine o operaţie care violează o constrângere de integritate atunci toate modificările efectuate de tranzacţie vor fi revocate. Mecanismele de păstrare a consistenţei trebuie asigurate de SGBD.

Din punct de vedere al modului de asigurare a izolarii tranzacţiilor tot sistemul de gestiune trebuie să asigure mecanismele necesare. Inconsistenţele prezentate în paragraful anterior erau datorate încălcării acestui criteriu de corectitudine. În practică însă în cazul unor sisteme încărcate planificările conţin paşi intercalaţi ai diverselor tranzacţii. independente de operaţiile efectuate de altă tranzacţie. Durabilitate O dată comise cu succes modificările efectuate de o tranzacţie ele vor persista şi nu mai pot fi revocate.3.scrie valoarea noua a lui A:6 -.citeste valoarea veche a lui B:10 -.Tranzacţii şi acces concurent 95 Izolare O tranzacţie trebuie să se comporte ca şi când operaţiile efectuate de ea sunt izolate. Din acest punct de vedere fiecare sistem de gestiune trebuie să conţina mecanisme prin care efectele tuturor tranzacţiilor comise să fie înregistrate şi în jurnalele sistemului pentru a fi restaurate în caz de incident. Izolarea este obiectul controlului accesului concurent. O astfel de planificare se numeste planificare serializabilă.citeste valoarea veche a lui A: 5 -. De exemplu dacă o tranzacţie contine succesiunea de operaţii: READ (A) A = A + 1 WRITE (A) READ (B) B = B . Inclusiv în cazul unui incident hardware şi software efectele tranzacţiilor comise sunt regăsite la recuperarea după incident. prezentat în paragrafele urmatoare. Rezultatul va fi totusi corect dacă efectul execuţiei planificării respective este acelaşi cu al uneia dintre planificările seriale posibile ale acelorasi tranzacţii. 6. Nici o altă tranzacţie nu trebuie să citeasca date intermediare scrise de tranzacţia respectivă. Planificări serializabile Definiţie: O planificare este serializabilă dacă produce aceleaşi efecte în baza de date cu o planificare serială.scrie valoarea noua a lui B:9 Atunci nici o altă tranzacţie nu poate citi pentru A şi B două valori dintre care una este actualizată şi cealaltă nu (adica 6 pentru A şi 10 pentru B). Exemplu: O planificare serializabilă şi planificarea serială echivalentă: .1 WRITE (B) -. Serializabilitate Aşa cum s-a specificat planificările seriale nu duc la inconsistenţe.

Observaţie: Reformulând putem spune că o planificare este conflictserializabilă dacă poate fi transformată într-o planificare serială prin interschimbări ale operaţiilor consecutive care nu sunt în conflict din două tranzacţii. Aceasta definiţie nu spune că nu pot să apară anomalii în execuţia celor două planificari ci că apar aceleaşi anomalii în ambele. Rezultă că exista 3 tipuri de situaţii conflictuale: Fiind date două tranzacţii T1 şi T2 pot exista conflicte de tipurile R1-W2. Definiţie: Între două operaţii aparţinând unei planificări există un conflict dacă: • Aparţin unor tranzacţii diferite • Sunt pe acelaşi obiect • Una dintre operaţii este o scriere • Cele două operaţii sunt succesive în sensul că între ele nu există o operaţie cu care vreuna dintre ele este în conflict.96 BAZE DE DATE ON-LINE Planificare serializabilă: T1 READ A READ B READ C READ D WRITE A WRITE C READ A WRITE A T2 T3 Planificare serială echivalentă (se putea şi T1. Definiţie: O planificare este conflict-serializabilă dacă este conflictechivalentă cu o planificare serială. Planificari v-serializabile (view-serializability) Exista de asemenea o a treia abordare (mai slaba) a serializabilităţii: . T3): T1 T2 T3 READ C READ D WRITE C READ A READ B WRITE A READ A WRITE A Planificări conflict-serializabile Exista şi o altă abordare a serializabilităţii bazată pe conflictele care pot să apară între paşii a două tranzacţii dintr-o planificare. Definiţie: Doua planificări sunt conflict-echivalente dacă: • Conţin aceleaşi operaţii ale aceloraşi tranzacţii • Fiecare pereche de operaţii conflictuale apare în aceeaşi ordine în cele două planificări. T2. W1-W2 şi W1-R2.

Dacă Ti citeşte valoarea iniţiala a lui A în S1 atunci ea face acelaşi lucru şi în S2. 3. Acesta implementează mecanisme care îi permit fiecărui utilizator (uman sau aplicaţie care utilizează baza de date) să aibă în orice moment o viziune consistentă a datelor. Consistenţa la citire şi blocări implicite În mod curent pe aceeaşi bază de date operează simultan mai mulţi utilizatori care pot efectua două tipuri de operaţii: • Operaţii de citire. atunci face acelaşi lucru şi în S2. Incluziunea între diverse tipuri de planificari este urmatoarea: Serializabile v-serializabile ConflictPlanificari Seriale serializabile Fara rollback în cascada 6. În această categorie intră în principal regăsirile de date prin cereri SELECT. Daca Ti scrie valoarea finală a lui A în S1 atunci ea face acelaşi lucru şi în S2 Definiţie: O Planificare este v-serializabilă dacă este v-echivalentă cu o planificare serială. Asigurarea consistentei la citire Pentru exemplificarea consistenţei la citire vom considera cazul sistemului de gestiune Oracle. .Tranzacţii şi acces concurent 97 Definiţie: Doua planificări S1 şi S2 sunt v-echivalente dacă pentru orice articol A: 1. 2.4. Dacă Ti citeşte o valoare a lui A scrisa de Tj în S1.

• Până nu au fost comise. Execuţia simultană a unei operaţii de scriere cu o altă operaţie (de citire sau de scriere) poate duce la inconsistenţe în utilizarea bazei de date. În acest fel operaţiile de citire şi modificare a datelor se pot executa simultan fără să interfereze unele cu celelalte. operaţiile de citire efectuate de alţi utilizatori returnează conţinutul de date anterior modificării lor. 6. • Aceleaşi date nu pot fi modificate simultan de doi utilizatori. UPDATE. De asemenea se poate demonstra că dacă o tranzacţie nu respectă protocolul pot exista execuţii neserializabile ale acelei tranzacţii în conjuncţie cu alte tranzacţii: Pentru o tranzacţie care conţine secvenţa: . • Până la comiterea modificărilor. Protocolul de blocare în două faze Pentru a putea asigura serializabilitatea tranzacţiilor sistemele de gestiune pun la dispoziţie posibilitatea de blocare a articolelor.5. sistemul efectuează o blocare implicită a liniei care o conţine blocând accesul pentru scriere al altor utilizatori. modificările pot fi revocate.98 BAZE DE DATE ON-LINE • Operaţii de scriere. Protocolul de blocare în două faze Definiţie: O tranzacţie respectă protocolul de blocare în două faze dacă toate blocările preced toate deblocările Acest protocol garantează serializabilitatea: dacă toate tranzacţiile respectă cerinţele protocolului se poate demonstra că orice planificare a lor e serializabilă. celelalte tranzacţii care vor şi ele să aibă acces la acel articol pot fi puse în aşteptare până la deblocarea acestuia. De asemenea sunt prevenite inconsistenţele care pot apare la modificarea simultană a aceloraşi date. În momentul în care unul din ei modifică o valoare. anulându-se efectul cererilor care le-au efectuat. • În momentul comiterii sau revocării modificărilor se ridică toate blocările aferente acestora. O astfel de situaţie este evitată în Oracle prin mecanismele de consistenţă la citire: • Aceleaşi date pot fi citite simultan de oricâţi utilizatori. Dacă o tranzacţie blochează un articol. şi DELETE. • Aceleaşi date pot fi modificate la un moment dat de un utilizator şi citite de oricâţi alţii. Dacă blocările şi deblocările sunt făcute întro anumită ordine se poate determina serializabilitatea planificărilor construite din tranzacţiile respective. • Modificările făcute de un utilizator în conţinutul tabelelor nu sunt vizibile pentru ceilalţi utilizatori până în momentul în care se execută implicit sau explicit înscrierea lor permanentă în baza de date (până la comitere). În această categorie sunt operaţiile de INSERT.

ceea ce înseamnă că nu e serializabila.Tranzacţii şi acces concurent 99 UNLOCK A LOCK B putem avea o planificare care o combină cu o altă tranzacţie T2 astfel: T1 T2 UNLOCK A LOCK A LOCK B UNLOCK A UNLOCK B LOCK B Aceasta planificare are are un graf de precedenţă care conţine un ciclu. . O astfel de planificare se numeste planificare cu rollback în cascada (eng.: cascading aborts) Există pentru a evita şi astfel de cazuri varianta protocolului de blocare strictă în 2 faze care implica eliberarea tuturor articolelor blocate la sfârşitul tranzacţiei. Protocolul de blocare în 2 faze implica însă uneori operaţii de roll-back în cascadă: T1 LOCK A LOCK B READ A WRITE A UNLOCK A T2 LOCK A READ A WRITE A UNLOCK A READ B WRITE B ROLLBACK În momentul Rollback pentru T1 este necesar Rollback şi pentru T2 deoarece T2 a citit date scrise de T1. În acest caz tranzacţia T2 din exemplul anterior porneşte abia după terminarea completă a tranzacţiei T1. date care prin operaţia de Rollback se pierd. Graful se construieşte având ca noduri tranzacţiile şi arce de la tranzacţia care face UNLOCK pe un articol către cea care face urmatorul LOCK pe acel articol.

100 BAZE DE DATE ON-LINE .

Sign up to vote on this title
UsefulNot useful