Documente Academic
Documente Profesional
Documente Cultură
Istoria bazelor de date relaionale 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 relaii (termen matematic, reprezentarea intuitiv a unei relaii fiind o tabel) i operaiile de baz cu acestea. A durat aproape 10 ani pn la apariia 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 operaiile cu tabele. O serie de firme prestigioase au investit n cercetri privind modelul relaional al datelor, printre acestea numrndu-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 interaciona 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 tatl sistemului DB2 pe care IBM l comercializeaz i n momentul actual. Lucrarea de fa i propune s prezinte att fundamentele teoretice ale modelului relaional (capitolele 1-4 i 6) ct 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 urmtoarele convenii 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 ncepnd cu o nou linie. S-a folosit indentarea n cazul expresiilor lungi i a subcererilor.
2011
Autorii
CUPRINS
1. Concepte i problematic ..................................................................9 1.1. Baz de date i Sistem de gestiune a bazelor de date ...............9 1.2. Funciile 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 relaional ...........................................................................27 3.1. Modele de date: ierarhic, reea, relaional ..............................27 3.2. Elementele de baza ale modelului relational ..........................28 3.3. Transformarea diagramelor EA in modelul relational ............30 3.4. Algebra relaional ..................................................................31 3.5. Calcul relational ......................................................................36 4. Proiectarea bazelor de date .............................................................37 4.1. Anomalii care apar n cazul proiectrii incorecte ...................37 4.2. Dependene funcionale ..........................................................38 4.3. Forme normale ........................................................................45 4.4. Descompunerea schemelor de relaie .....................................47 4.5. Dependene 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 insi .................................................63 5.7. Join extern ...............................................................................63 5.8. Join vertical .............................................................................64 5.9. Funcii n SQL .........................................................................65
Subcereri SQL ........................................................................74 Crearea i definirea structurilor tabelare ................................77 Constrngeri de integritate .....................................................80 Comanda ALTER TABLE ....................................................83 Comanda INSERT .................................................................85 Comanda DELETE ................................................................86 Comanda UPDATE ...............................................................86
6. Tranzacii i acces concurent ..........................................................88 6.1. Prezentarea problematicii. Terminologie ................................88 6.2. Gestiunea tranzaciilor ............................................................89 6.3. Serializabilitate .......................................................................91 6.4. Asigurarea consistentei la citire ..............................................93 6.5. Protocolul de blocare in doua faze .........................................94
Concepte i problematic
1. CONCEPTE I PROBLEMATIC
n acest moment termenul de baz de date a intrat n limbajul curent fiind folosit uneori i n alte accepiuni dect cea de provenien. 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 coninute n aceste definiii. Sunt prezentate apoi funciile pe care trebuie s le asigure un SGBD i categoriile de utilizatori ale unui astfel de sistem. Capitolul se incheie cu prezentarea celor trei nivele de descriere ale unei baze de date i a conceptului de independen dateprogram.
Concepte i problematic
11
descrierea structurii unei baze de date const n principal din descrierea tabelelor componente: denumire, list de coloane i tipul datelor din acestea.
12
Descrierea datelor
Un SGBD trebuie s includ posibilitatea descrierii stucturii obiectelor care formeaz baza de date. n cazul bazelor de date relaionale aceasta const n principal n posibilitatea crerii i modificrii structurii tabelelor i constrngerilor de integritate asociate acestora. Limbajul prin care se realizeaz aceste operaii se numeste Limbaj de Descriere a Datelor (LDD) i n cazul primelor sisteme de gestiune el era implementat sub forma unor module separate. n sistemele relaionale bazate pe SQL aceste operaii au fost incluse n limbaj sub forma comenzilor de tip CREATE (pentru creare) sau ALTER (modificare).
Utilizarea datelor
Aceast funcie include operaiile de lucru cu datele nregistrate ntr-o baz de date. Cele patru categorii de operaii principale sunt urmtoarele:
Inserarea de noi date. Aceasta se concretizeaz prin adugarea de noi linii n tabelele care formeaz baza de date. tergerea de linii din tabele. Actualizarea datelor, nsemnnd modificarea coninutului unor linii existente n tabele. Regsirea datelor dup anumite criterii de cutare
Concepte i problematic
13
Pentru implementarea acestei funcii 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.
Integritatea datelor
Majoritatea sistemelor de gestiune permit definirea unor reguli pe care datele stocate trebuie s verifice numite constrngeri de integritate. n cazul n care o operaie are ca rezultat violarea acestor restricii aceasta este automat rejectat i nu are efect n baza de date. n felul acesta este asigurat o mai mare siguran n ceea ce privete corectitudinea datelor. Definirea de constrngeri de integritate nu previne ns total erorile accidentale de operare: de exemplu introducerea din greeal a unei note de 4 n loc de 5 nu va fi semnalat, ambele valori fiind n intervalul admisibil.
Confidenialitatea datelor
n cazul unui SGBD accesul la date este permis doar utilizatorilor nregistrai i doar n msura drepturilor de acces alocate. Un utilizator este identificat uzual printr-un nume-utilizator i o parol. Fiecrui utilizator i se permite accesul doar la o poriune a bazei de date i doar pentru a efectua anumite tipuri de operaii. n cazul bazelor de date accesate n reea se pot defini de asemenea locaiile de la care utilizatorul poate interaciona cu baza de date. O alt posibilitate de asigurare a confidenialitii este aceea a accesului la datele din baza de date doar prin intermediul unor programe de aplicaie. Utilizatorii acestor programe nu sunt n acelasi timp i utilizatori nregistrai ai SGBD-ului care gestioneaz datele iar poriunea din baza de date la care au acces este cablat n program.
Sigurana n funcionare
Desi nu este legat direct de cele prezentate pn acum, sigurana n funcionare este o caracteristica esenial pentru un SGBD i conine acele
14
elemente care exclud sau minimizeaz posibilitatea de pierdere a datelor datorat incidentelor software sau hardware. Prncipalele faciliti pe care un sistem de gestiune a bazelor de date trebuie s le asigure din acest punct de vedere sunt urmtoarele: Salvarea datelor. n cazul sistemelor mai vechi aceste faciliti erau suplinite de opiunile de copiere sau arhivare a fiierelor bazei de date oferite de sistemul de operare pe care rula SGBD-ul. Actualmente implementarea operaiilor de salvare este mult mai sofisticat avnd n vedere dificultatea teoretic i practic a efecturii de copii de siguran consistente ale bazei de date n condiiile n care aplicaia ruleaz non-stop i operarea nu poate fi oprit pentru efectuarea salvrii. Restaurarea dup incident. n cazul apariiei de incidente hardware sau software care au ca efect distrugerea bazei de date este necesar efectuarea operaiei de restaurare care s minimizeze volumul de operaii al caror efect se pierde.
Utilizatori privilegiai
Acetia sunt utilizatori care au dreptul de a afectua toate tipurile de operaii puse la dispoziie de sistem. 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 rspund de buna funcionare a SGBD-ului.
Utilizatori neprivilegiai
Acetia sunt utilizatorii obinuiti ai SGBD-ului i dispun de drepturile de acces care le-au fost alocate de administratorul bazei de date. Majoritatea sistemelor de gestiune permit definirea de categorii generice de utilizatori (numite roluri) iar fiecare utilizator individual are asociat unul sau mai multe roluri, motenind drepturile de acces ale acestora. Este uurat astfel operaia de creare a unui nou utilizator.
Concepte i problematic
15
este acela de schema. n literatura de specialitate exist o clasificare pe trei nivele a acestor descrieri: fizic, conceptual i extern.
Nivelul fizic
Schema fizic este descrierea bazei de date din perspectiva stocrii sale pe dispozitivele fizice: identificarea discurilor i a cilor unde este stocat, numele fiierelor care formeaz baza de date, structura fizic a acestora, etc.
Nivelul conceptual
Descrierea bazei de date la acest nivel poart numele de schema conceptual (numita uneori i schema logic) a bazei de date. Ea const ntr-o descriere abstract dar exact a structurii acesteia, lasnd la o parte detaliile fizice de implementare.
Nivelul extern
Diferitele categorii de utilizatori ai unei baze de date au nevoie n activitatea lor doar de poriuni specifice ale acesteia. Descrierea acestor poriuni poart numele de scheme externe. O baz de date are deci asociate o singur schem fizic i o singur schem conceptual dar mai multe scheme externe.
Independena datelor
Existena celor trei nivele de descriere permite definirea conceptului de independen ntre datele stocate n baza de date i aplicaiile care utilizeaz aceste date. Conceptul de independen a datelor a aprut o dat cu dezvoltarea sistemelor complexe de aplicaii pentru care cablarea informaiilor structurale n program constituie o bariera n calea dezvoltrii i modificrii acestora. n lumea reala orice operaie de modificare a bazei de date a unei aplicaii se msoar i prin prisma costurilor materiale necesare modificrii programelor care o folosesc. Exist dou tipuri de independen: Independena logic reprezint posibilitatea de schimbare a schemei conceptuale a bazei de date fr modificarea schemelor externe. Condiia este ca modificarea s nu elimine nici unul dintre elementele necesare translaiei de la schema extern la schema conceptual.
Independena fizic reprezint posibilitatea de schimbare a schemei fizice a bazei de date fr modificarea schemei conceptuale i implicit a schemelor externe. Aceasta d posibilitatea reorganizrii fizice a bazei de date fr afectarea aplicaiilor care o folosesc.
2. MODELAREA DATELOR
Proiectarea corect a structurii unei baze de date relaionale este o premis fundamental n scrierea programelor de aplicaie i n funcionarea lor fr anomaliile care pot apare n cazul unei structuri defectuoase. 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). n capitolul urmtor vor fi prezentate regulile de transformare din modelul entitate-asociere n modelul relaional.
Modelarea datelor
17
modelarea cerinelor de secretizare a datelor, documentarea programelor de aplicaie i uurarea comunicrii ntre proiectantul de sistem i utilizatorul obinuit, proiectarea bazelor de date complexe pe poriuni i integrarea ulterioar a acestora (aa numita integrare a vederilor). Avantajul principal al modelului EA este acela al simplitii sale i al caracterului su intuitiv. Rezultatul proiectrii 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 aplicaiei.
Analiza de sistem
n aceast etap se realizeaz analiza segmentului din lumea real care va fi gestionat de aplicaia respectiv. Rezult o specificaie neformalizat a cerinelor constnd din dou componente:
18
Identificarea bazelor de date existente care pot fi folosite de noua aplicaie direct sau printr-un import iniial de date - evitndu-se n acest fel reintroducerea manual a acestora. Identificarea modalitilor de transfer de date ntre noua aplicaie i alte aplicaii care ruleaz deja la beneficiar i care vor fi folosite i n viitor de ctre acesta. Identificarea necesitilor privind datele i prelucrrile care pot fi n viitor necesare beneficiarului, deci a posibilelor dezvoltri n timp ale aplicaiei.
Aceast etap este efectuat de personal calificat avnd n vedere c rezultatele sale sunt baza de la care se pleac n etapele urmtoare, eventualele erori putnd fi corectate ulterior cu costuri semnificative.
Modelarea datelor
19
Normalizare
Exist o serie de reguli care descriu ce nseamn o structur corect a unei tabele i care definesc aa numitele forme normale. Pe baza structurii bazei de date i a dependenelor rezultate att din transformarea n model relaional ct i a altor dependene identificate de proiectant n analiza de sistem se poate face o operaie numit normalizare modificnd structura bazei de date astfel nct toate tabelele din aceasta s fie n forma normal dorit. Capitolul 3 conine definiia formelor normale uzuale i descrierea unor algoritmi de normalizare care sunt folosii de uneltele CASE pentru efectuarea automat a operaiei.
2.2.
Acest model a fost introdus de P. P. Chen n 1976 ([Ch 76]). El se constituie ntr-o abordare de tip grafic a proiectrii bazelor de date i a fost adoptat de comunitatea tiinific precum i de productorii de software n domeniu datorit simplitii i expresivitii sale.
Elementele modelului
Modelul entitate-asociere permite reprezentarea informaiilor despre structura bazelor de date folosind trei elemente de construcie: entiti, atribute ale entitilor i asocieri ntre entiti. Definiia lor informal este urmtoarea:
20
Entitile modeleaz clase de obiecte concrete sau abstracte despre care se colecteaz informaii, au existen independent i pot fi identificate n mod unic. Exemple de entiti: Studeni, Orae, Angajai, etc. Ele definesc de obicei persoane, amplasamente, obiecte sau evenimente cu importan informaional. Membrii unei clase care formeaz o astfel de entitate poart numele de instane ale acelei entiti. De remarcat c ntreaga literatur de specialitate definete nti conceptul de mulime de entiti (sau tip de entiti) pentru ca apoi s adopte pentru uurina exprimrii prescurtarea de entitate pentru acest concept. Deci entitatea este un obiect generic care reprezint mulimea tuturor instanelor sale. Entitile sunt de dou categorii: Entiti independente (sau tari) sunt cele care au existen independent de alte entiti, Entiti dependente (sau slabe) sunt formate din instane care i justific ncadrarea n clasa respectiv doar atta timp ct ntr-o alt entitate (tat) exist o anumit instan de care sunt dependente. De exemplu n cazul unei baze de date de personal, fiecare instan a entitii COPII rmne n clasa respectiv (copiii angajailor) att timp ct n entitatea ANGAJAI exist instana reprezentnd pe tatl/mama acelui copil. Element al modelului Entitate Tip Tare Slab Atribut De identificare Nume atribut De Descriere Asociere Asociaz entiti 1-2 Nume atribut Nume asociere Reprezentare Nume entitate Nume entitate
Modelarea datelor
Atributele modeleaz proprieti atomice distincte ale entitilor. De exemplu entitatea STUDENI poate avea ca atribute Matricola, Nume, Prenume, Vrsta, Anul, Grupa, etc. n procesul de modelare vor fi luate n considerare doar acele proprieti ale entitilor care sunt semnificative pentru aplicaia respectiv. Din acest motiv, la entitatea STUDENI nu vom lua n considerare caracteristici ca Talia sau Culoarea_prului acestea nefiind necesare pentru baza de date a universitii (astfel de atribute ar putea exista de exemplu ntr-o baz de date privind personalul militar). Atributele unei entiti sunt de dou feluri: 1. atributele de identificare (formnd mpreun identificatorul entitii) reprezint acea mulime de atribute care permit distincia ntre instanele aceleiai entiti 2. atributele de descriere (sau descriptori) sunt folosii pentru memorarea caracteristicilor suplimentare ale instanelor. n exemplul de mai sus Matricola este atribut de identificare (deoarece nu pot exista doi studeni cu aceeai matricol ntr-o facultate) pe cnd celelalte atribute sunt descriptori. Asocierile modeleaz interdependenele dintre clasele de obiecte reprezentate prin entiti. De exemplu ntre entitile STUDENI i FACULTI se poate figura o asociere NSCRIS_LA care descrie mprirea studenilor pe faculti. n crearea diagramei nu vor fi luate n consideraie dect interdependenele care sunt necesare aplicaiei respective, n lumea real putnd exista ntre entitile diagramei i alte asocieri care nu sunt semnificative n contextul dat. Figura 2.1. prezint convenia de reprezentare grafic a celor trei tipuri de construcii care particip la formarea unei diagrame EA. Se observ c:
22
Un exemplu de incluziune este definirea n cadrul entitii ANGAJAI a unor subclase modelate prin entitile INGINERI, ECONOMITI i COLABORATORI. n cazul ierarhiei de incluziune entitile fiu pot s nu fie disjuncte dou cte dou. De asemenea reuniunea lor poate s nu acopere n ntregime entitatea tat: exist angajai care nu sunt nici ingineri, nici economiti i nici colaboratori. Definiie (ierarhia de generalizare): O entitate E este generalizarea entitilor E1, E2, ..., En dac orice instan a lui E este de asemenea instan n una i numai una din entitile E1, E2, ..., En. Un exemplu de generalizare este clasarea instanelor entitii ANGAJAI n subclasele BARBAI i FEMEI. Caracteristica ierarhiei de generalizare este c din punct de vedere matematic entitile fiu reprezint o partiie a entitii tat: a. E1 E2 ... En = E i b. Ei Ej = pentru orice i j din intervalul 1..n Ierarhiile de incluziune i generalizare se folosesc doar n cazul n care pentru subclasele unor clase modelate prin entiti este nevoie de stocarea unor informaii suplimentare specifice. Convenia grafic de reprezentare a celor dou tipuri de ierarhii se gsete n fig. 2.2. Element Ierarhie de incluziune Reprezentare
E1
E2
E3
Modelarea datelor
23
Ierarhie de generalizare
Crite riu
E1
E2
Gradul asocierii
Este o valoare numeric ntreag i este dat de numrul de entiti care particip la acea asociere. Asocierile de grad 1, 2 i 3 se mai numesc i asocieri unare, binare i respectiv ternare.
Tutor STUDENT
nscris_la
Alocare
FACULTATE
PROIECT
CALCULATOR
24
Conectivitatea asocierii
Este specific fiecrei ramuri a unei asocieri i poate avea una din urmtoarele dou valori: unu sau multi. Determinarea ei pentru ramura spre o entitate E se face astfel: fixnd arbitrar cte o instan pentru celelalte entiti care particip la asociere se pune ntrebarea: cte instane ale lui E pot fi conectate cu acestea? Dac poate fi cel mult una, conectivitatea ramurii este unu, altfel conectivitatea este multi. Pentru exemplul din figura 2.3. putem avea: asocierea TUTOR de tip unu-unu sau multi-uni, asocierea NSCRIS_LA de tip multi-unu (multi spre STUDENT) sau multi-multi, iar pentru asocierea ternar ALOCARE multi (STUDENT)-unu-unu. Convenia de reprezentare grafica: ramurile 'unu' vor fi reprezentate sub forma de sgeat.
Obligativitatea asocierii
Ca i conectivitatea, aceasta se determin pentru fiecare ramur i poate avea doar una din urmtoarele valori: obligatorie sau opional. Determinarea ei pentru ramura spre o entitate E se face astfel: fixnd arbitrar cte o instan pentru celelalte entiti care particip la asociere se pune ntrebarea: este obligatoriu s existe o instan a lui E asociat cu acestea? Dac rspunsul este 'Da' ramura este obligatorie altfel este opional. Convenia de reprezentare grafic a clasei de apartenen folosit n continuare este urmtoarea: ramurile obligatorii vor fi reprezentate prin linie continu iar cele opionale prin linie ntrerupt. n figura 2.4 este prezentat diagrama anterioar avnd figurat i obligativitatea.
Atributele asocierilor
n unele cazuri o anumit informaie descriptiv nu este asociat cu o clas de obiecte ci cu un ansamblu de clase diferite modelate fiecare prin entiti. n acest caz aceasta va fi modelat ca un atribut al asocierii dintre entitile respective.
Rolul
n cazul n care de la o asociere pornesc mai multe ramuri ctre aceeai entitate, fiecreia dintre acestea i se poate asocia un rol. Acesta arat semnificaiile diferite pe care le are aceeai entitate n cadrul asocierii respective. tutor Tutor STUDENT discipol nscris_la FACULTATE
Modelarea datelor
25 Alocare
PROIECT
CALCULATOR
Criterii de modelare
a. Clasificarea n entiti i atribute Dei definiia noiunilor de entitate, atribut, asociere este destul de simpl, n practica modelrii apar dificulti n clasificarea diverselor informaii ntr-una din aceste categorii. Pentru a putea clasifica corect informaiile, exist cteva reguli care trebuie respectate i pe care le prezentm n continuare. Regula 1. Entitile au informaii descriptive, pe cnd atributele nu posed astfel de informaii. De exemplu dac despre un ORA este necesar stocarea n baza de date a unor informaii ca JUDE, POPULAIE, etc. atunci ORA va fi o entitate. Dac singura informaie necesar este numele su atunci NUME_ORA va fi un atribut al altei entiti. Regula 2. Atributele multivalorice vor fi reclasificate ca entiti. Exemplu: Are_Sediu_n BANCA LOCALITATE
Num e
Regula 3. Atributele unei entiti care au o asociere multi-unu cu o alt entitate vor fi reclasificate ca entiti. Exemplu:
Num e
JUDE
BANCA
LOCALITATE
Regula 4. Atributele vor fi ataate la entitile pe care le descriu n mod nemijlocit. Regula 5. Folosirea identificatorilor compui va fi evitat. n model relaional pentru atributele de acest fel se construiesc de regul structuri de cutare rapid (indeci) care funcioneaz cu att mai lent cu ct complexitatea indecsului crete.
26
b. Identificarea ierarhiilor de generalizare i incluziune. n cazul n care despre anumite subclase ale unei clase de obiecte exist informaii specifice, clasa i subclasele (care la pasul anterior au fost catalogate ca entiti) sunt interconectate ntr-o ierarhie de incluziune sau generalizare, dup cum este cazul. La acest pas se face i o reataare a atributelor pentru evitarea redundanei, astfel: 1. Tatl i fii unei ierarhii au acelai identificator. 2. Descriptorii care apar i la tat i la fii se elimin de la fii. 3. Descriptorii care apar la toi fii unei ierarhii de generalizare i nu apar la tat se mut la tat. c. Identificarea asocierilor n aceasta etap se trateaz informaiile care nu au fost clasificate ca entiti sau atribute ci reprezint interdependene ntre clase de obiecte. Ele sunt modelate ca asocieri ntre entiti. Pentru fiecare asociere se specific gradul, conectivitatea, obligativitatea i dac este cazul i atributele asocierii precum i rolurile ramurilor sale. Se elimin de asemenea asocierile redundante. d. Integrarea vederilor. n cazul proiectrii bazelor de date complexe, activitatea se desfoar uneori de ctre mai multe colective simultan, diagramele rezultate sunt apoi integrate eliminndu-se redundanele i inconsistenele.
2.3.
Modelul clasic are o serie de dezavantaje, mai ales n ceea ce privete lizibilitatea diagramelor complexe. Pentru uneltele CASE care utilizeaz EA s-a ales o variant modificat: Atributele unei entiti sunt nscrise n caseta acesteia. Este marcat tupul lor: # Identificare * NOT NULL o Poate fi NULL Asocierile: Nu exist dect asocieri de grad 1 sau 2 cu conectivitate 1-1 sau 1-M. Toate asocierile de grad mai mare ca 2 sau cele de grad 1 sau 2 cu conectivitate M-M sunt modelate ca entiti intersecie. Etichetarea nu este per asociere ci per capt de asociere (deci 2 etichete pentru fiecare asociere) Entitile: Identificatorul unei entiti poate fi format din atribute i/sau capete de asocieri. Pot exista entiti (de exemplu entiti intersecie) care au identificatorul format numai din capete de asociere. Marcajul este bararea captului respectiv de asociere.
Modelarea datelor
27
Ierarhiile: Ierarhiile se numesc aici Subtipuri-Supertipuri. Entitile fiu sunt figurate ca incluse n caseta entitii tat. Exist n anumite variante doar ierarhiile de generalizare (fr cele de incluziune). Exemplu de diagram:
ALOCARE o NrOre
PentruUn Are Soie PentruUn Are So PeUn Are
nscrisLa Are
28
3. MODELUL RELAIONAL
O problem fundamental a unui SGBD este modul n care datele sunt organizate n vederea stocrii i exploatrii lor de ctre aplicaii.
30
Relaie
Definiie: Relaie (eng. Relation) = o submulime a unui produs cartezian avnd asociat un nume. Termenul de relaie provine de asemenea din matematic. Un exemplu de relaie aparinnd produsului cartezian PC din paragraful urmtor este: Produse = { (101, Produs1, 30, 20, Firma1, Adresa1) , (105, Produs2, 20, 23, Firma1, Adresa2), (124, Produs3, 10, 20, Firma1, Adresa1) } Elementele unei relaii sunt denumite n literatura de specialitate tupluri (engl. tuple). Relaia de mai sus conine doar 3 dintre elementele produsului cartezian din care provine (3 tupluri). O reprezentare intuitiv pentru o relaie este o tabel n care fiecare element al relaiei 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 relaie se reprezint printr-o tabel care conine date, fiecare coloan avnd asociat un anumit tip de date, dat de domeniul din care provine.
Atribut
Deoarece o relaie are o reprezentare tabelar putem vorbi de coloan a unei relaii. n mod obinuit, ntr-o tabel coloanele au un nume.
Modelul relaional
31
Definiie: Atribut (eng. Attribute) = coloan a unei relaii avnd asociat un nume. Pentru relaia Produse putem fixa de exemplu urmtoarele nume de atribute: IdP Codul produsului (nu exist dou produse avnd acelai cod) NumeP numele produsului Qty Cantitate IdF Codul furnizorului (nu exist doi furnizori avnd acelai 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
Produse(IdP, NumeP, Qty, IdF, NumeF, AdresaF) Produse(IdP: Numr, NumeP: ir40, Qty: Numr, IdF: Numr, NumeF: ir40, AdresaF: ir40) Produse = IdP, NumeP, Qty, IdF, NumeF, AdresaF
n cazul prezentrii unora dintre elementele de teorie a bazelor de date relaionale se folosesc i notaii de forma: R = ABCDE, cu semnificaia: schema relaiei R conine 5 atribute notate cu A, B, C, D i respectiv E.
32
n tabela Produse cele trei linii existente pot fi identificate unic de valorile de pe 3 atribute (IdP, NumeP i Qty) dar numai IdP este cheie: O relaie poate avea mai multe chei. S ne imaginm o relaie Studeni coninnd date despre studenii romni ai unei faculti: Studeni (IdStud, NrMatricol, Nume, CNP, SerieCI, NumrCI) n acest caz avem mai multe chei: { IdStud }, { NrMatricol }, { CNP } i {SerieCI, NumrCI}. Observaie: Orice relaie are cel puin o cheie: deoarece ntr-o relaie nu pot exista dou elemente identice, rezult c mulimea tuturor atributelor relaiei este cheie sau conine cel puin o cheie.
Valori nule
Uneori, unele elemente ale unei relaii (celule ale tabelei) nu au nici o valoare concret. Se spune c n acel loc exist o valoare nul. Definiie: Valoare nul (eng. Null value) = o valoare diferit de oricare alta i care modeleaz o informaie necunoscut sau o informaie inaplicabil(=n poziia respectiv nu trebuie s existe o valoare nenul).
Transformarea entitilor
Fiecare entitate a diagramei se transform ntr-o schem de relaie avnd: Numele relaiei = Numele entitii Atributele relaiei = Atributele entitii Cheia relaiei = Identificatorul entitii
Modelul relaional
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 relaie astfel: Nume relaie = Nume asociere Atribute relaie = Reuniunea identificatorilor entitilor asociate la care se adaug atributele proprii ale asocierii Cheia relaiei = Conform tabelului urmtor Grad Cheia relaiei provenite din asociere Unare multi (E) - multi (E) Cheie(E) + Redenumire(Cheie(E)) Binare multi (E1) - multi (E2) Cheie(E1) + Cheie(E2) Ternare unu (E1) - unu (E2) - unu (E3) Cheie(E1)+Cheie(E2) sau Cheie(E1)+Cheie(E3) sau Cheie(E2)+Cheie(E3) sau unu (E1) - unu (E2) - multi (E3) Cheie(E1)+Cheie(E3) sau Cheie(E2)+Cheie(E3) sau unu (E1) - multi (E2) - multi (E3) Cheie(E2)+Cheie(E3) multi (E1) - multi (E2) - multi (E3) Cheie(E2)+Cheie(E3)+ Cheie(E1) Pentru asocierile de grad mai mare ca 3 se procedeaz analog. Conectivitate
34
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
Relaia R
Relaia S
A B C 1 1 2 2 1 3 1 3 2 4 1 2 5 1 7 Relaia R S
Diferena: Fiind date dou relaii R i S, diferena lor, notat R - S este o relaie care conine tuplurile care sunt n R i nu sunt n S. i n cazul diferenei cele dou relaii care se reunesc trebuie s aib scheme compatibile. Exemplu:
A 1 2 1
B 1 1 3
C 2 3 2
Relaia R
A B C 4 1 2 2 1 3 1 3 2 5 1 7 Relaia S
A B C 1 1 2
Relaia R - S
Modelul relaional
35
Intersecia: Fiind date dou relaii R i S, intersecia lor, notat R S este o relaie care conine tuplurile care sunt i n R i n S. De asemenea cele dou relaii care se reunesc trebuie s aib scheme compatibile.
A 1 2 1
B 1 1 3
C 2 3 2
Relaia R
A B C 4 1 2 2 1 3 1 3 2 5 1 7 Relaia S
A B C 2 1 3 1 3 2 Relaia R S
Produsul cartezian: Fiind date dou relaii R i S, produsul lor cartezian, notat R S este o relaie ale crei tupluri sunt formate prin concatenarea fiecrei linii a relaiei R cu fiecare linie a relaiei S. Rezult de aici urmtoarele: Numrul de atribute (coloane) ale lui R S este egal cu suma numerelor de atribute ale lui R i S Numrul 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 acelai nume, n produsul cartezian R S vom avea atribute care au acelai nume. Pentru a le deosebi se prefixeaz numele atributului cu cel al relaiei din care provine (ex.: R.A i S.A, ca n exemplul urmtor)
A 1 2 2 2 1 1
B 1 1 7 3 3 3
Relaia 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 proieciei B, C, E (R) Observm c s-au eliminat dou linii duplicat din rezultat (cele provenite din liniile 2 i 6).
36
Selecia (numita uneori restricia): Fiind dat o relaie R i o expresie logic F (o condiie), selecia lui R n raport cu F este o relaie care se obine din R lund doar liniile care verific expresia logic F. Notaia pentru selecie este urmtoarea: F(R) Exemplu: din relaia R de mai sus dorim s calculm B+1 > A+C(R) obinem :
A 2
B 7
C 4
D 4
E 1
Joinul general (numit i theta-join sau -join): fiind date dou relaii R i S, joinul lor (notat RFS) se obine din produsul cartezian al relaiilor R i S urmat de o selecie dup condiia F (numit i condiie de join). Denumirea de theta-join este folosit din motive istorice, simbolul fiind folosit iniial pentru a desemna o condiie. Rezult c: RFS = F(R S) Join natural: Joinul natural pentru dou relaii R i S (notat R S )se obine fcnd joinul celor dou relaii dup condiia coloanele cu aceeai semnificaie au valori egale i eliminnd prin proiecie coloanele duplicat (cele dup care s-a fcut joinul). Exemplu:
A 1 2 1
B 1 1 3
C 2 3 2
Relaia R
A D E 4 1 2 2 1 3 1 3 2 5 1 7 Relaia S
A B C D E 1 1 2 3 2 1 3 2 3 2 2 1 3 1 3 Relaia R S
Join extern: n cazul n care o linie a unei tabele, oricare ar fi concatenarea ei cu o alt linie din cealalt tabel, nu ndeplinete condiia de join, linia respectiv nu are corespondent n rezultat. n unele cazuri se dorete ns ca aceste linii s apar n rezultat, cu valori nule pe coloanele din cealalt tabel. Aceast operaie poart numele de join extern (n englez outer join). Cum la un join particip dou tabele, pot exista trei tipuri de join extern:
Join extern stnga (left outer join), n care n rezultat apar toate liniile tabelei din stnga operatorului. Join extern dreapta (right outer join), n care n rezultat apar toate liniile tabelei din dreapta operatorului.
Modelul relaional
37
Join extern complet (full outer join), n care n rezultat apar toate liniile tabelei din stnga i din dreapta operatorului.
Lista_atribute_i_funcii_statistice(R)
Atributele din list sunt criterii de grupare. Ele apar n rezultatul returnat de operator Funciile statistice din list (ex.: MIN, MAX, SUM, AVG, COUNT) se calculeaz la nivelul fiecrui grup i de asemenea apar n rezultatul operatorului Sortare: Efectul este sortarea relaiei sau multisetului R n funcie de atributele din list. Forma operatorului de sortare este urmtoarea:
38
Proiecie extins: Acest operator este analog proieciei obinuite dar permite atribute (coloane) calculate pentru rezultatul unei expresii pe relaii sau multiseturi. Forma sa este urmtoarea: Exemplu:
Lista_atribute(R)
Modelul relaional
xn) }
39
Reuniunea a dou relaii R i S: {x1x2xn | R(x1x2xn) S(x1x2 Intersecia a dou relaii R i S: {x1x2xn | R(x1x2xn) S(x1x2 Selecia dup condiia valoarea pe prima coloan este mai mare dect
xn) } 100:
{x1x2xn | R(x1x2xn) x1 > 100 } Toate expresiile de mai sus sunt sigure. Analog cu CRT, expresiile: {x1x2xn | R(x1x2xn) } i {x1x2xn | R(x1x2xn) S(x1x2xn) } nu sunt sigure. n literatura de specialitate exist demonstraia faptului c expresiile sigure din CRT i CRD sunt echivalente cu expresii din algebra relaional i reciproc.
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. Redundana: Redundana reprezint stocarea n mod nejustificat a unei aceleiai informaii de mai multe ori n baza de date. Observm de exemplu c pentru fiecare produs este stocat numele i adresa furnizorului, dei ele sunt unic determinate de codul acestuia. 2. Anomalia de actualizare: n cazul actualizrii unei informaii redundante, se poate ntmpla ca operaia s modifice unele apariii ale acesteia iar altele s rmn cu vechea valoare.
41
3. Anomalia de inserare: Nu putem insera date despre un furnizor (numele i adresa sa) dect dac exist n stoc un produs furnizat de acesta. 4. Anomalia de tergere: La tergerea din relaie a ultimului produs al
unui furnizor se pierd automat i datele despre acesta. Aceste anomalii apar deoarece ntr-o aceeai tabel au fost stocate date despre dou clase diferite de obiecte. n cazul proiectrii cu ajutorul modelului entitateasociere diagrama corect este urmtoarea:
Id Nume Adresa
F
FURNIZOR
Id P
Nume P
Qt y
furnizeaz R
PRODUSE
Prin transformarea acestei diagrame se obin urmtoarele scheme de relaie: Furnizor(IdF, NumeF, AdresaF) Produse(IdP, NumeP, Qty, IdF) Rezult c informaia din relaia Produse trebuie stocat de fapt n dou relaii. Procesul de spargere a unei tabele care are o structur incorect n dou sau mai multe tabele se numeste descompunerea schemei de relaie. Pentru detectarea relaiilor care trebuiesc descompuse exist o serie de reguli de corectitudine, numite i forme normale. Definirea acestor forme normale se bazeaz pe noiunea de dependen (funcional sau multivaloric) prezentat n continuare.
42
X R: Mulimea de atribute X este inclus n mulimea atributelor relaiei R. Y X: Mulimea de atribute Y este inclus n mulimea de atribute X A X: Atributul A aparine mulimii de atribute X
t, t1, t2, tupluri ale unei relaii, t[X]: valorile atributelor din X aflate n tuplul t, F, G, : mulimi de dependene funcionale ataate unei scheme de relaie
n paragrafele urmtoare termenul generic de relaie semnific att schema relaiei (descrierea structurii acesteia) ct i o instan a acesteia (coninutul de date de la un moment dat al relaiei).
Axiome i reguli
Pornind de la o mulime de dependene funcionale ataate unei scheme de relaie se pot deduce alte dependene funcionale valide. Exist o multitudine de reguli de inferen. Pentru a se putea face o prezentare formal a acestora, trei
43
dintre ele au fost alese ca axiome iar restul se pot deduce pornind de la ele. Cele trei axiome (numite n literatur i Axiomele lui Armstrong) sunt urmtoarele: A1. Reflexivitate: Fie R o schem de relaie i X R. Dac Y X atunci: X Y Toate dependenele funcionale care rezult din aceast axiom sunt numite i dependene triviale. Ele nu spun nimic n plus fa de setul de dependene iniial dar sunt dependene funcionale valide. A2. Augmentare: Fie R o schem de relaie i X, Y, Z R. Dac X Y atunci i XZ YZ A3. Tranzitivitate: Fie R o schem de relaie i X, Y, Z R. Dac X Y i Y Z atunci i X Z Pe baza acestor axiome se pot demonstra o serie de reguli de inferen pentru dependene funcionale dintre care cele mai importante sunt urmtoarele: R1. Descompunere: Fie R o schem de relaie i X, Y, Z R. Dac X Y i Z Y atunci i X Z Regula descompunerii ne permite s rescriem un set de dependene funcionale astfel nct s obinem doar dependene care au n partea dreapt doar un singur atribut. Sa presupunem c avem o dependen funcional de forma: X A1A2A3An Atunci ea poate fi nlocuit cu urmtoarele n dependene funcionale: X A1, X A2, X A3, . . ., X An R2. Reuniune: Fie R o schem de relaie i X, Y, Z R. Daca X Y i X Z atunci i X YZ Rezult i faptul c din cele n reguli obinute prin descompunere se poate obine dependena iniial, deci nlocuirea acesteia nu duce la pierderea vreunei corelaii existente. R3. Pseudotranzitivitate: Fie R o schem de relaie i X, Y, Z, W R. Dac X Y i YZ W atunci i XZ W
44
ABC A, ABC B, ABC C, ABC AB, ABC AC, ABC BC sau ABC ABC Ea nu se calculeaz, algoritmii care au nevoie de ea ocolind ntr-un fel sau altul calculul acesteia. Introducerea acestei noiuni s-a fcut pentru a explica, n cazul descompunerii unei scheme de relaie, care sunt dependenele motenite de elementele descompunerii de la relaia iniial (paragraful 4.3) i pentru a putea defini formal alte noiuni: Acoperirea unei mulimi de DF: Fie R o schem de relaie i F, G dou mulimi de dependene pentru R. Se spune c F acoper pe G dac i numai dac G F+. Echivalena a dou mulimi de dependene: Fie R o schem de relaie i F, G dou mulimi de dependene pentru 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+ , deci F+ = G+) Forma canonic a unei mulimi de DF: Din definiiile de mai sus rezult c o mulime de dependene poate fi nlocuit cu alt echivalen coninnd alte dependene. n cazul n care aceast mulime ndeplinete condiiile urmtoare se spune c este n form canonic: Orice dependen are n partea dreapt un singur atribut. Acest lucru se poate obine aplicnd regula descompunerii prezentat anterior. Mulimea de dependene este minimal, nici una dintre dependene neputnd s fie dedus din celelalte (altfel spus nu exist dependene redundante). Exemplu: Fie R = ABCDE o schem de relaie i F mulimea de dependene funcionale asociat, cu F = { AB CDE, C DE }: Aplicm regula de descompunere. Obinem: F = { AB C, AB D, AB E, C D, C E } Mulimea nu este ns minimal deoarece AB D i AB E se pot deduce prin tranzitivitate din AB C mpreun cu C D, C E. Rezult c forma canonic a lui F este: F = { AB C, C D, C E }
Chei i superchei
n acest moment putem s dm o definiie echivalent a cheii pe baza dependenelor funcionale: Definiie: Fie R o schem de relaie, F mulimea de dependene funcionale asociat i X 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, Y X atunci (F Y R) - deci orice submulime strict a lui X nu mai ndeplinete condiia anterioar).
45
Deci o cheie determin funcional toate atributele relaiei i este minimal: nici o submulime strict a sa nu determina funcional pe R. Se observ faptul c aceasta definiie este echivalent cu cea din capitolul 3. n cazul n care doar prima condiie este ndeplinit mulimea X se numete supercheie. Observaie: Faptul c o supercheie nu este constrns de minimalitate nu nseamn ns c ea nu poate fi minimal. Rezult c orice cheie este n acelai timp i supercheie, reciproca nefiind ns adevrat. Exemplu: Fie R = ABCDE i F = { AB C, C D, C E }. Atunci AB este cheie pentru R: Din AB C, C D i C E obinem prin tranzitivitate AB D i AB E Din AB C, AB D i AB E obinem prin reuniune AB CDE Din AB CDE obinem (augmentare cu AB) AB ABCDE, deci AB R Rezult c AB este supercheie pentru R. n paragrafele urmtoare vom vedea cum se poate demonstra i faptul c AB este minimal, deci este nu numai supercheie ci chiar cheie pentru R.
46
Observaie: Atunci cnd descompunem o schem se poate ntmpla ca unele dintre dependenele schemei iniiale s se piard. Exemplu: Fie R = ABCD i F = { AB, BC, CD, DA }. n cazul n care descompunem R n R1 = AB i R2 = CD atunci: FR1 = R2(F) ={ AB, BA } FR2 = R1(F) = { CD, DC } A doua dependen din fiecare mulime nu este n F dar este n F+ (obinut prin tranzitivitate). Observm ns c dependenele BC i DA nu mai pot fi obinute 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 dependenele iniiale sunt pstrate sau nu.
47
Propoziie: Fie R o schem de relaie, F mulimea de dependene asociat i X, Y R. Atunci X Y se poare deduce din F dac i numai dac Y X+
48
BAZE DE DATE ON-LINE Calculm (D)+. Obinem (D)+ = DE. Rezult c D nu este cheie unic
pentru R Calculm mulimea de candidate: augmentm D cu atribute din R D + = ABCDE DE = ABC. Obinem AD, BD i CD Calculm nchiderile lor. Obinem (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 mulime de candidate pornind de la CD. Putem augmenta CD cu atribute din R (CD)+ = ABCDE CDE = AB. Nici una dintre augmentri nu este ns posibil pentru c att ACD cat i BCD conin o cheie gsit anterior (AD respectiv BD). Procesul se oprete. Singurele chei ale lui R rmn AD i BD.
49
F = { IdPNumeP, IdPQty, IdP IdF, IdFNumeF, IdFAdresaF } nu este n forma normal Boyce-Codd: cheia unica este IdP dar exist dependene care nu au n partea stng o supercheie: IdFNumeF, IdFAdresaF
FN3 FNBC
Rezult de asemenea c dac o schem de relaie nu este n FN3 ea nu poate fi nici n FNBC. Exemple: 1. Relaia R = ABCD avnd F = { AB C, AB D, D A } are cheia unic AB. Relaia este n FN3 deoarece primele dou dependene au n partea stng o supercheie (AB) iar a treia dependen are n partea dreapta atributul prim A. Relaia nu este n FNBC deoarece a treia dependen violeaz definiia pentru aceast form normal (nu are n partea stng o supercheie.
50
2. Relaia R = ABCDE avnd F = { A B, B A , A C, D E } are cheile AD i BD. Rezult c: R nu este n FN3 deoarece dependenele 3 i 4 nu au nici supercheie n partea stng nici atribut prim n partea dreapt R nu e n FNBC deoarece nu e n FN3 3. Relaia R = ABCD avnd F = { A B, B C, C D, D A } are cheile A, B, C i D. Rezult c: R este n FNBC deoarece n partea stng a dependenelor sunt numai superchei R este n FN3 deoarece este n FNBC
51
Descompunerea acioneaz deci la nivelul schemei relaiei. Ce se ntmpl ns cu coninutul acesteia n cazul unei descompuneri? Fiecare relaie rezultat va moteni o parte dintre datele relaiei descompuse i anume proiecia acesteia pe mulimea de atribute a relaiei rezultat din descompunere. S considerm o instan r a relaiei de schema R (instana unei relaii este o ncrcare cu date corecte a acesteia). Atunci instanele pentru relaiile din descompunerea sunt: ri = Ri (r)
52
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 oprete: Fie cnd s-a obinut o linie n tabela care conine doar a-uri, caz n care descompunerea are proprietatea j.f.p. Fie cnd la o parcurgere a dependenelor nu mai apar schimbri n tabel i nu s-a obinut o linie doar cu a-uri. n acest caz descompunerea nu are proprietatea j.f.p.
n literatura de specialitate se poate gsi demonstraia faptului c acest algoritm determin corect dac o descompunere are proprietatea j.f.p. sau nu. Exemplu: Fie R = ABCDE, F = { C E (1), A C (2), B D (3), D E (4), E B (5) } (cu dependene numerotate ntre paranteze) i = (BCE, AB, 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 obinut nc o linie doar cu a-uri. Descompunerea are proprietatea de j.f.p. Observaie: n cazul n care descompunerea are doar dou elemente se poate testa dac are proprietatea de join fr pierderi i astfel: Fie R o schem de relaie, F mulimea de dependene funcionale asociat i = (R1, R2) o descompunere a sa. Atunci are proprietatea de join fr pierderi dac una din dependenele urmtoare se poate deduce din F: (R1 R2) (R1 R2) sau (R1 R2) (R2 R1)
53
Pentru a testa dac dependena se poate deduce din F este suficient s calculm nchiderea lui (R1 R2). Daca ea conine fie pe (R1 R2) fie pe (R2 R1) atunci descompunerea este cu join fr pierderi. Exemplu: R= ABCDE, F = { A B, A C, A D, D E } i = (ABCD, DE). Avem R1 = ABCD, R2 = DE, (R1 R2) = ABCD DE = ABC (R2 R1) = DE ABCD = E (R1 R2) = D Cele dou dependene 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 fr pierderi.
54
Rezult c o descompunere pstreaz dependenele dac i numai dac: F ( i=1..n (Fi ) )+ Din pcate att proiecia unei mulimi de dependene ct i incluziunea de mai sus implic un calcul de nchidere a unei mulimi de dependene (F i respectiv reuniunea mulimilor Fi). Exist i n acest caz un algoritm pentru a testa dac o dependen este sau nu pstrat dup descompunere fr a fi necesar efectiv calculul mulimilor Fi
Algoritmi de descompunere
Algoritmii de testare al pstrrii dependenelor i a joinului fr pierderi pot fi aplicai atunci cnd descompunerea unei scheme de relaie se face de mn, pe baza experienei pe care o are proiectantul bazei de date. Exist ns i nite algoritmi simpli care, pornind de la o schem de relaie i mulimea de dependene funcionale asociat ne duc direct la o descompunere care este n FN3 sau FNBC i n plus au proprietatea de join fr pierderi (deci nu se pierd date prin descompunere) i/sau de pstrare a dependenelor. Algoritm de descompunere n FN3 cu pstrarea dependenelor Fie R o schem de relaie i F mulimea de dependene funcionale asociat, cu F = { X1 Y1, X2 Y2, Xn Yn } Atunci descompunerea = (X1Y1, X2Y2, XnYn) este o descompunere n FN3 cu pstrarea dependenelor. Se observ din definiia de mai sus a descompunerii c:
55
Toate dependenele sunt pstrate: dependena Xi Yi este n proiecia lui F pe XiYi Pentru a minimiza numrul de elemente din descompunere se aplic regula reuniunii: dac avem mai multe dependene care au aceeai parte stng le reunim ntr-una singur. Dac n descompunere exist dou elemente XiYi i XjYj astfel nct XiYi XjYj atunci XiYi se elimin.
n literatura de specialitate exist demonstraia faptului c fiecare schem din descompunere este n FN3. Exemplul 1: R = ABCDE, F = { A B, A C, A D, D E }. Rescriem prin reuniune mulimea de dependene funcionale: F = { A BCD, D E }. Rezult din algoritm descompunerea = (ABCD, DE) Algoritm de descompunere n FN3 cu pstrarea dependenelor i join fr pierderi Dac la descompunerea obinut prin algoritmul anterior adugm o cheie a relaiei (ca element al descompunerii) vom obine o descompunere care are att proprietatea de join fr pierderi cat i pe cea a pstrrii dependenelor. Observaie: Dac vreunul dintre elementele de forma XiYi conin deja o cheie a lui R atunci nu este necesar adugarea unui element suplimentar n descompunere. Algoritm de descompunere n FNBC cu join fr pierderi Fie R o schem de relaie i F mulimea de dependene funcionale asociat, F n form canonic: F = { X1 A1, X2 A2, Xn An }. Putem calcula descompunerea n FNBC cu join fr pierderi iterativ: Iniial = (R) La fiecare pas se alege o schem T care conine o dependen de forma XA care violeaz condiiile de FNBC. Schema respectiv este nlocuit n prin T1 i T2 unde T1 = XA i T2 = T {A} Procesul se oprete cnd n nu mai exist elemente care nu sunt n FNBC
56
Sa lum exemplul tabelei urmtoare unde au fost stocate date referitoare la entitile PERSOANA, ADRESA i FACULTATE precum i asocierile dintre ele (multi-multi o persoan poate avea mai multe adrese i poate absolvi mai multe faculti): 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 funcional netrivial valid pentru aceasta relaie, deci nu exist dependene care s violeze condiiile FNBC. Ca urmare relaia este n FNBC avnd ca singur cheie posibil mulimea tuturor atributelor relaiei: din axioma de reflexivitate (A1) putem obine dependena: Nume,Strada,Localitate,Facultate,AnAbsolvire Nume,Strada,Localitate,Facultate,AnAbsolvire Dei relaia este n FNBC adresa i facultatea absolvit de un angajat sunt prezente repetat n relaie: adresa pentru fiecare facultate absolvit iar facultatea pentru fiecare adres a angajatului. Exemplul de mai sus sugereaz faptul c seturile de atribute {Strada, Localitate} i {Facultate, AnAbsolvire} sunt independente unele de altele, n sensul c fiecare adres apare cu fiecare facultate absolvit de un angajat i reciproc. Astfel de situaii sunt modelate cu un nou tip de dependene numite dependene multivalorice.
57
t1 t2 t3
O consecin interesant a acestei definiii este c, dac inversm tuplurile t1 i t2, 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 definiie rezult c dac n R exist dependena multivaloric X Y atunci exist i dependena X R X Y. Consecin important: orice dependen funcional este n acelai timp i o dependen multivaloric (se demonstreaz folosind definiia) ns reciproca nu este adevarat: exist dependene multivalorice pentru care n schema relaiei nu avem o dependen funcional corespunzatoare.
Forma normala 4
Pentru a prentampina redundanele prezentate la nceputul paragrafului este bine ca schemele de relaie s fie ntr-o form normal superioar FNBC. Aceast form care consider i dependenele multivalorice se numete forma normal 4 (FN4). Definiia ei este similar cu cea pentru FNBC dar condiia se pune pentru dependenele multivalorice ale relaiei respective: Definitie: O schem de relaie R este n forma normal 4 dac orice dependen multivaloric netrivial X Y are n partea stang o supercheie Dependenele multivalorice triviale sunt de dou feluri: 1. Dependene n care partea dreapt este inclus n partea stang: X Y unde Y X 2. Dependene de tipul X Y pentru care X Y = R Condiia de FN4 spune deci c orice DMV care nu intr n una din categoriile de mai sus are n partea stang o supercheie. Observatie importanta: Cheile relaiei (care definesc i supercheile sale) se determin doar pe baza dependenelor funcionale ale acesteia. Relatia dintre formele normale FN3, FNBC i FN4 este una de includere, n aceast ordine. Orice relaie n FN4 este n acelai timp i n FNBC i FN3:
58
FN3 FNBC
FN4
5. LIMBAJUL SQL
SQL este unul dintre cele mai folosite limbaje n dezvoltarea de aplicaii software, putnd fi folosit pentru manipularea datelor, dar i pentru crearea i administrarea obiectelor n baza de date. Limbajul are la baz conceptul bazelor de date relaionale, care a fost introdus pentru prima data de E.F. Codd n anii 70 i modeleaz bazele de date sub forma de tabele i relaii ntre acestea. IBM a fost prima companie care a preluat i dezvoltat acest concept, punnd la punct primul limbaj SQL (SEQUEL2) n anul 1976, ulterior dezvoltnd DB2 i SQL/DS. Inspirat din Algebra Relationala, modelul bazelor de date relaionale poate fi asemnat de utilizatori ca o colecie de tabele bidimensionale definite de urmtoarele concepte : - tabele - coloane - rnduri - cmpuri - operatori - relaii Modificarea datelor este realizat prin operaiile relaionale efectuate pe tabele, iar operatorii acioneaz asupra tabelelor pentru a produce noi relaii. Operatorii relaionali pot fi definii astfel : o Restricie - este o operaie care preia i afieaz toate rndurile din una sau mai multe tabele, sau doar rndurile care ndeplinesc una sau mai multe condiii (submulime orizontal). o Proiecie - este operaia care afieaz selectiv anumite coloane din una sau mai multe tabele (submulime vertical) o Produs - este rezultatul obinut prin concatenarea rndurilor a dou mulimi de date, conform condiiilor specificate. o Join - este rezultatul obinut prin concatenarea coloanelor din una sau mai multe tabele, conform condiiilor specificate. o Reuniune - este rezultatul obinut prin afiarea rndurilor comune i necomune din una sau mai multe tabele, conform condiiilor specificate. o Intersecie - este rezultatul obinut prin afiarea rndurilor comune din una sau mai multe tabele, conform condiiilor specificate.
60
BAZE DE DATE ON-LINE o Diferena - este rezultatul obinut prin afiarea rndurilor care aparin
numai unei singure tabele, conform condiiilor specificate. Controlul asupra bazelor de date este gestionat de ctre SGBD(Sistemul de Gestiune a Bazei de Date) i respect anumite reguli : - o baz de date relaional apare ca o colecie de tabele, definit de ctre utilizator; - utilizatorul nu controleaz felul cum este organizat fizic informaia; - controlul asupra fiierelor de date este gestionat exclusiv de ctre sistem; - utilizatorul poate defini anumii parametri de sistem pentru optimizarea aplicaiilor, sau pentru diferite setri; - accesul la baza de date este gestionat exclusiv de sistem, prin executarea de comenzi specifice; - rularea aplicaiilor, att pe server, ct i pe maina client, este gestionat exclusiv de ctre sistem. Structura unei tabele trebuie s respecte anumite reguli : - s nu existe duplicare de rnduri i coloane; - nu trebuie respectat o anumit ordine a rndurilor i coloanelor; - tipurile de coloane trebuie definite n concordan cu tipurile de date; - relaiile ntre tabele se fac pe coloane de acelai tip; - valorile sunt atomice(nedecompozabile).
Limbajul SQL
61
schema.table reprezint shema de identificare a tabelei(view-lui) specificat prin user.table_name; expresion reprezint un nume de coloan sau o expresie care poate folosi funcii sistem; expr_alias este un nume alocat unei expresii care va fi folosit n formatarea coloanei ( apare n antetul listei); dblink reprezint numele complet sau parial de identificare a unei baze de date (database.domain@connection_qualifier); table_alias este un nume alocat unei tabele(view) care poate fi folosit n cereri corelate; WHERE condition reprezint o clauz (nlnuire de condiii), care trebuie s fie ndeplinit n criteriul de selecie a nregistrrilor; START WITH condition stabilete criteriul de selecie pentru prima nregistrare; CONNECT BY condition stabilete o ierarhie de selecie a nregistrrilor; GROUP BY expresion stabilete criteriile de grupare a nregistrrilor(numele coloanelor folosite n criteriul de grupare); HAVING conditionrestricioneaz nregistrrile din grup la anumite condiii; UNION,UNION ALL,INTERSECT,MINUS combin rndurile selectate de mai multe comenzi SELECT prin aplicarea anumitor restricii; ORDER BY expresion(position) ordoneaz nregistrrile selectate dup coloanele din expresie, sau n ordinea coloanelor specificate prin poziie; FOR UPDATE OF face o blocare (lock) a nregistrrilor n vederea modificrii anumitor coloane; NOWAIT returneaz controlul userului, dac comanda ateapt eliberarea unei nregistrri blocat de un alt user.
-------------TEHNICIAN PROGRAMATOR
-------20 30
62
Limbajul SQL
Operator -----------------!= ^= <> NOT NUMECOL = NOT NUMECOL > * operatori SQL Operator -------NOT BETWEEN NOT IN NOT LIKE IS NOT NULL Semnificaie ----------------------------------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 Semnificaie -----------------------------diferit de(VAX,UNIX,PC) diferit de(IBM) diferit de(toate OS) diferit de mai mic sau egal
63
Dac vrem s facem o list cu toi angajaii, care au un anumit job, putem folosi urmtoarea cerere: SQL>SELECT id_dep depart, functie, nume, salariu, data_ang FROM angajati; WHERE functie=DIRECTOR ORDER BY id_dep;
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
Urmtoarea cerere face o list cu toate persoanele care s-au angajat ntr-o anumit perioad de timp: SQL>SELECT id_dep depart,functie, nume,data_ang FROM angajati WHERE data_ang BETWEEN 1-MAY-1981 AND 31-DEC-1981 ORDER BY data_ang; 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
64
Angajaii, care au ecusoane ntr-o list, pot fi listai cu urmtoarea cerere: SQL>SELECT id_ang ecuson, nume,functie, salariu+nvl(comision,0) venit FROM angajati WHERE id_ang IN (7499,7902,7876) ORDER BY nume; 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, este posibil s selectm rndurile care se potrivesc cu un ir sau subir de caractere. Cele dou simboluri sunt : Simbol Semnificaie --------------------------------------------------% orice secven de mai multe caractere un singur caracter Lista persoanelor angajate n luna decembrie 1980 se obine cu urmtoarea cerere: SQL>SELECT id_ang ecuson, nume, functie, data_ang FROM angajati WHERE data_ang LIKE %DEC-1980; ECUSON ---------7369 7902 NUME FUNCTIE ----------------------------------POPA ION TEHNICIAN FLORESCU AUREL ANALIST DATA_ANG ----------------17-DEC-80 03-DEC-80
Dac se compar o coloan, sau expresie cu NULL, atunci operatorul de comparaie trebuie s fie IS sau IS NOT NULL. Dac se folosete orice alt operator, rezultatul va fi ntotdeauna FALSE (de exemplu expresia COMM != NULL este ntotdeauna fals). Operatorii AND i OR pot fi utilizai pentru a compune expresii logice cu condiii multiple. Predicatul AND este adevrat, numai dac ambele condiii sunt TRUE, iar predicatul OR este adevrat dac cel puin una din condiii este TRUE. Se pot combina AND sau OR n acceai expresie logic n clauza WHERE, iar n acest caz, operatorii AND sunt evaluai primii i apoi operatorii OR (deci operatorii AND au o preceden mai mare decat OR). n exemplul urmtor, vor fi selectai toi directorii care au salariul peste 1500 $ i toi tehnicienii(fr condiia de salariu):
Limbajul SQL
SQL>SELECT id_ang ecuson,nume,functie,salariu,id_dep depart FROM angajati WHERE salariu > 1500 AND functie = 'DIRECTOR' OR functie = 'TEHNICIAN ORDER BY functie; ECUSON -----7566 7698 7782 7369 7876 NUME ----------------STOICA DAN NEGRU GELU AVRAM CALIN POPA ION ADAM SORIN FUNCTIE SALARIU ------------------- --------DIRECTOR 2975 DIRECTOR 2850 DIRECTOR 2450 TEHNICIAN 800 TEHNICIAN 1100 DEPART --------20 30 10 20 20
65
Dac operatorii au preceden egal, atunci ei se evalueaz de la stanga la dreapta. Precedena operatorilor logici este urmtoarea: 1. Operatorii de comparaie i operatorii SQL au precedena egal: =, >= , <>, BETWEEN...AND, IN, LIKE, IS NULL. 2. NOT 3. AND 4. OR Pentru a fi siguri de ordinea de execuie a dou operaii, se recomand folosirea parantezelor rotunde.
66
schema.table reprezint shema de identificare a tabelei(view-lui) specificat prin user.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 (nlnuire de condiii) care trebuie s fie ndeplinit n criteriul de selecie a nregistrrilor ORDER BY expresion(position) ordoneaz nregistrrile selectate dup coloanele din expresie, sau n ordinea coloanelor specificate prin poziie.
Se observ c au fost folosite alias-uri pentru tabele, pentru a nu crea ambiguitate cnd referim coloane cu aceeai denumire. Cnd dou sau mai multe tabele nu au coloane comune i trebuie totui relaionate, avem un non equi-join. Sunt situaii cnd trebuie s folosim i equi-join i non equi-join ntr-o cerere . n exemplul anterior, dac dorim s listm numele angajailor, gradul de salarizare i denumirea departamentului 20 din care fac parte, va trebui s facem join dup trei tabele: SQL>SELECT c.den_dep,a.nume, a.salariu, b.grad
Limbajul SQL
FROM angajati a, grila_salar b, departamente c WHERE a.salariu BETWEEN b.nivel_inf AND b.nivel_sup AND a.id_dep=c.id_dep AND a.id_dep=20; DEN_DEP -----------------------------CONTABILITATE CONTABILITATE NUME SALARIU ---------------------------POPA ION 800 ADAM SORIN 1100 GRAD -------1 2
67
68
ID_DEP DEN_DEP --------- -----------------------------10 MARKETING 10 MARKETING 20 CONTABILITATE 20 CONTABILITATE 30 PROIECTARE 40 VANZARI
Limbajul SQL
10 30 MILESCU SILVIU IONESCU VICTOR TEHNICIAN TEHNICIAN are salariu = are comision =
69 1300 500
Folosind operatorul UNION ALL se selecteaz i nregistrrile duplicate: SQL>SELECT functie FROM angajati WHERE id_dep=10 UNION ALL SELECT functie FROM angajati WHERE id_dep=20; Operatorul INTERSECT este folosit pentru a selecta nregistrrile comune. Dac dorim s aflm care sunt funciile angajailor care au primit acelai comision i care se regsesc n toate departamentele, scriem urmtoarea cerere: SQL> SELECT functie, comision FROM angajati where id_dep=10 INTERSECT SELECT functie,comision FROM angajati where id_dep=20 INTERSECT SELECT functie,comision FROM angajati where id_dep=30 Pentru a afla care sunt funciile din departamentul 10, care nu se regsesc n departamentul 30, folosim operatorul MINUS : SQL> SELECT functie FROM angajati WHERE id_dep = 10 MINUS SELECT functie FROM angajati WHERE id_dep = 30; FUNCTIE ------------------PRESEDINTE
70
Funcii numerice
Aceste funcii accept la intrare valori numerice i returneaz tot o valoare numeric. ABS (n) returneaz valoarea absolut a lui n SQL> SELECT abs(-12) FROM dual; -- returneaz valoarea 12 CEIL (n) returneaz cel mai mic ntreg >= n SQL> SELECT ceil(14.7) FROM dual; -- returneaz valoarea 15 COS (n) returneaz cosinus (n) unde n este n radiani SQL> SELECT cos(180 * 3.14/180) FROM dual; -- returneaz -1 COSH (n) returneaz cosinus hiperbolic SQL> SELECT cosh(0) FROM dual; -- returneaz valoarea 1 EXP (n) returneaz e la puterea n (e=2.7182..) SQL> SELECT exp(4) FROM dual; -- returneaz valoarea 54.5981 FLOOR (n) returneaz cel mai mare ntreg <= n SQL> SELECT floor(11.6) FROM dual; -- returneaz valoarea 11 LN (n) returneaz logaritmul natural al lui n (n>0) SQL> SELECT ln(95) FROM dual; -- returneaz valoarea 4.5538 LOG (m,n) returneaz logaritmul n baza m al lui n SQL> SELECT log(10,100) FROM dual; -- returneaz valoarea 2 MOD (m,n) returneaz restul mpririi lui m la n SQL> SELECT mod(14,5) FROM dual; -- returneaz valoarea 4 POWER (m,n) returneaz m la puterea n SQL> SELECT power(3,2) FROM dual; -- returneaz valoarea 9 ROUND (n[,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.193, 1) FROM dual; -- returneaz 15.2 SQL> SELECT round(15.193) FROM dual; -- returneaz 15 SQL> SELECT round(15.193, -1) FROM dual; -- returneaz 20 SIGN (n) returneaz -1 dac n<0, 0 dac n=0 i 1 dac n>0 SQL> SELECT sign(-17.5) FROM dual; -- returneaz valoarea -1 SIN (n) returneaz sinus (n), unde n este n radiani SQL> SELECT sin(30 * 3.14/180) FROM dual; -- returneaz 0.5
Limbajul SQL
SINH (n) returneaz cosinus hiperbolic SQL> SELECT sinh(1) FROM dual; -- returneaz valoarea 1.1752 SQRT (n) returneaz rdcina ptrat a lui n, unde n>0 SQL> SELECT sqrt(26) FROM dual; -- returneaz valoarea 5.099 TAN (n) returneaz tangenta lui n , unde n este n radiani SQL> SELECT tan(135 * 3.14/180) FROM dual; -- returneaz -1 TAN (n) returneaz tangenta hiberbolic a lui n , unde n este n radiani SQL> SELECT tanh( 0.5) FROM dual; -- returneaz 0.4621 TRUNC (n[,m]) returneaz n trunchiat la : m zecimale dac m>0 0 zecimale dac m este omis m cifre nainte de virgula, dac m<0 SQL> SELECT trunc(15.193, 1) FROM dual; -- returneaz 15.1 SQL> SELECT trunc(15.193) FROM dual; -- returneaz 15 SQL> SELECT trunc(15.193, -1) FROM dual; -- returneaz 10
71
RTRIM (char[,set]) terge din char ultimele caractere dac sunt n set SQL> SELECT rtrim('Popescu','scu') FROM dual; -- returneaz Pope SUBSTR (char,m[,n]) returneaz n caractere din char, ncepnd cu poziia m SQL> SELECT substr (Popescu ,2,3) FROM dual; -- returneaz ope INSTR (char1,char2[,n[,m]]) returneaz poziia lui char2, ncepnd cu poziia n la a m-a apariie SQL> SELECT instr(Protopopescu,op,3,2) FROM dual; --returneaz 7 LENGTH (char) returneaz lungimea lui char ca numr de caractere SQL> SELECT length(analyst) FROM dual; - returneaz 7
LAST_DAY (date) returneaz data ultimei zile din luna cuprins n date; SQL>SELECT nume,data_ang,last_day(data_ang) ultima_zi FROM angajati WHERE id_dep=10; NUME DATA_ANG ----------------------------------------AVRAM CALIN 09-JUN-81 COSTESCU GEORGE 17-NOV-81 ULTIMA_ZI ----------------30-JUN-81 30-NOV-81
Limbajul SQL
73
MONTHS_BETWEEN(date1,date2) returneaz numrul de luni (i fraciuni de lun ) cuprinse ntre date1 i date2. Dac date1>date2 rezultatul va fi pozitiv, altfel va fi negativ. SQL>SELECTnume,data_ang,sysdate, months_between(sysdate,data_ang) luni_vechime FROM angajati WHERE id_dep=10; NUME SYSDATE DATA_ANG LUNI_VECHIME ------------------------------ -------------- ---------------------AVRAM CALIN 18-NOV-06 09-JUN-81 305.30665 COSTESCU GEORGE 18-NOV-06 17-NOV-81 300.04858 ROUND(date,fmt) returneaz data prin rotunjirea lui date la formatul fmt; SQL>SELECT round(to_date(17-NOV-2010), YEAR) rot_an FROM dual; ROT_AN --------------01-JAN-2010 TRUNC(date,fmt) returneaz data prin trunchierea lui date la formatul fmt; SQL>SELECT trunc(to_date(17-NOV-2010), YEAR) trunc_an FROM dual; TRUNC_AN -------------01-JAN-2010 SYSDATE returneaz data curent(data sistem) n diferite formate; SQL>SELECT to_date(sysdate,DD-MM-YYYY hh:MI:SS AM) data_crt FROM dual; DATA_CRT --------------18-APR-2011
74
TO_CHAR(date[,fmt[,nlsparams]]) face conversia unei date de tip DATE n format VARCHAR2; SQL> SELECT nume, to_char(data_ang, 'Month DD, YYYY') data_ang FROM angajati WHERE to_char(data_ang,'YYYY') LIKE '1987'; NUME ----------------SAVESCU OVIDIU ADAM SORIN DATA_ANG -----------------April 19, 1987 May 23, 1987
TO_DATE(char[,fmt[,nlsparams]]) face conversia unei variabile de tip CHAR sau VARCHAR2 n format DATE; SQL> SELECT to_date(15112010 ,DD-MON- YYYY) data FROM dual; DATA ----------15-NOV-2010 TO_NUMBER(char[,fmt[,nlsparams]]) face conversia unei variabile de tip CHAR sau VARCHAR2 n format NUMBER; Pentru calculul primei n funcie de anul angajrii, folosim comanda: SQL> SELECT nume, functie, salariu, salariu+to_number(to_char(data_ang,'yyyy'))/10 prima FROM angajati WHERE to_number(to_char(data_ang ,'YYYY'))=1987; NUME FUNCTIE SALARIU ----------------------------------- -----------SAVESCU OVIDIU ANALIST 3000 ADAM SORIN TEHNICIAN 1100 PRIMA ---------3198.7 1298.7
Formatul pentru numere poate fi : Format Semnificaie Exemple ----------- ----------------------------------------------------- -------------------------
Limbajul SQL
9 0 $ . , MI PR EEEE V B
75
numere(nr.de 9 determin lungimea de afiare) 999999 1234 afieaz zerourile de la nceput 099999 001234 semnul dolar $999999 $1234 punct zecimal 99999.99 1234.00 virgula 999,999 1,234 semnele minus la dreapta(valori negative) 999999MI 1234paranteze pentru numere negative 999999PR <112> notaie tiinific 99.999EEEE 1.23E+03 nmulire cu 10 (n=numr de 9 dup V) 9999V99 123400 afieaz valori zero ca blancuri nu 0 B9999.99 1234.00
Funcii diverse
Aceste funcii accept orice tip de argumente. GREATEST(expr1 [,expr2]...) returneaz cea mai mare valoare din lista de argumente; SQL> SELECT greatest(12,34,77,89) from dual; GREATEST(12,34,77,89) -------------------------------89 LEAST(expr1 [,expr2]...) returneaz cea mai mica valoare din lista de argumente; DECODE(expr,search1,result1,...default) - expr este comparat cu fiecare valoare search i ntoarce rezult dac expr este egal cu valoarea search, iar dac nu gsete nicio egalitate, ntoarce valoarea default; Funcia DECODE este considerat cea mai puternic funcie SQL, deoarece are efectul unui case sau a unei construcii if-then-else. Tipurile de parametri pot fi : * expression poate fi orice tip de dat * search este de acelai tip ca expression * result este valoarea ntoars i poate fi orice tip de dat * default este de acelai tip ca expression n exemplul urmtor, se calculeaz prima n raport de funcia angajatului: SQL> SELECT nume,functie,salariu, decode(functie,'DIRECTOR',salariu*1.25,'ANALIST', salariu*1.15,salariu/4) prima FROM angajati WHERE id_dep=20
76 ORDER BY functie;
NUME FUNCTIE SALARIU PRIMA ---------------------------------- ------------- --------SAVESCU OVIDIU ANALIST 3000 3450 FLORESCU AUREL ANALIST 3000 3450 STOICA DAN DIRECTOR 2975 3718.75 NVL(expr1 ,expr2) returneaz expr2 dac expr1 este null SQL>SELECT nume,data_ang,comision,nvl(comision,0) nvl_com FROM angajati WHERE id_dep=30 ORDER BY nume; NUME ----------------------------IONESCU VICTOR MARINESCU MIHAI DATA_ANG COMISION ---------------- ---------------03-DEC-1981 22-FEB-1981 500 NVL_COM --------------0 500
Funcii de grup
Aceste funcii returneaz rezultate bazate pe grupuri de nregistrri, nu pe o singur nregistrare, ca cele prezentate la punctele anterioare. Gruparea se face folosind clauza GROUP BY ntr-o cerere SELECT i n acest caz toate elementele listei trebuie cuprinse n clauza de grupare. Funciile de grup pot fi apelate i n clauza HAVING, dar nu pot fi apelate n clauza WHERE. Se poate folosi operatorul DISTINCT pentru a sorta numai elementele distincte din lista, dar se poate folosi i operatorul ALL pentru a considera i nregistrrile duplicate. AVG([DISTINCT/ALL] expr) returneaz valoarea medie a lui expr, ignornd valorile nule; Pentru a afla valoarea medie a salariului i comisionului pe toate departamentele, folosim urmtoarea cerere: SQL> SELECT avg(salariu),avg(comision) FROM angajati; AVG(SALARIU) AVG(COMISION) -------------------------------------------2062.5 550 Dac dorim s aflm valorile medii pe fiecare departament, trebuie s folosim obligatoriu clauza GROUP BY: SQL>SELECT id_dep,avg(salariu),avg(comision) FROM angajati GROUP BY id_dep;
Limbajul SQL
ID_DEP AVG(SALARIU) AVG(COMISION) ----------------------------------------10 2916.6667 30 1541.6667 550
77
COUNT(* | [DISTINCT/ALL] expr) returneaz numrul de nregistrri ntoarse de interogare. Dac se fosete *, se numr toate nregistrrile, inclusiv cele nule, iar dac se folosete expr, se numr numai nregistrrile not null; Pentru a afla numrul angajailor care au primit comision pe fiecare departament, folosim urmtoarea cerere: SQL> SELECT id_dep,count(*),count(comision), count(all comision),count(distinct comision) FROM angajati GROUP BY id_dep;
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; Pentru a afla salariul maxim pe fiecare departament, folosim cererea: SQL> SELECT a.id_dep,b.den_dep,max(salariu) FROM angajati a,departamente b WHERE a.id_dep=b.id_dep GROUP BY a.id_dep,b.den_dep; ID_DEP DEN_DEP -----------------------------------10 MARKETING 20 CONTABILITATE MAX(SALARIU) ----------------------5000 3000
MIN([DISTINCT/ALL] expr) - returneaz valoarea minim pentru expresie Pentru a afla care este venitul minim pe fiecare departament, folosim cererea: SQL> SELECT id_dep, min(salariu + nvl(comision,0)) venit_minim
78 FROM angajati GROUP BY id_dep; ID_DEP VENIT_MINIM -------------------------10 1300 20 800 30 950
Trebuie menionat c operatorii DISTINCT i ALL nu au niciun efect pentru funciile MIN i MAX. SUM([DISTINCT/ALL] expr) returneaz suma valorilor pentru expresie Pentru a calcula suma salariilor i comisioanelor pe fiecare departament, folosim cererea: SQL> SELECT id_dep,sum(salariu), sum(distinct salariu), sum(comision) FROM angajati GROUP BY id_dep;
ID_DEP SUM(SALARIU) SUM(DISTINCTSALARIU) SUM(COMISION) -------------------------------------- ------------10 8750 8750 20 10875 7875 30 9250 8000 2200
- n furnizarea valorilor pentru condiii puse n comenzile SELECT, UPDATE, DELETE, INSERT i CREATE TABLE.
Din punct de vedere al rolului pe care l au ntr-o cerere SQL i a modului de a face construcia comenzii, subcererile pot fi mprite n : * Subcereri ascunse * Subcereri corelate * Subcereri pe tabela temporar * Subcereri pe clauza HAVING
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,...expr k) IN [NOT IN] ( SELECT expr 1, ...expr k FROM table 2 WHERE table 2.expr x = table 1.expr y [AND,OR] .. );
79
Subcereri ascunse
Subcererile ascunse pot fi mprite n mai multe categorii, n funcie de numrul 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 aflm salariile angajailor, care au funcii similare funciilor aferente departamentului 20, folosim urmtoarea cerere : SQL>SELECT nume,functie,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, prelucrat de cererea principal i la execuie folosesc cel puin o valoare dintr-o coloan din cererea principal. O subcerere corelat se join-eaz cu cererea exterioar prin folosirea unei coloane a cererii exterioare, n clauza predicatului cererii interioare. n cazul unei subcereri ascunse, cererea SELECT din subcerere ruleaz prima i se execut o singur dat, ntorcnd valori ce vor fi folosite de cererea principal. Pentru o cerere corelat, subcererea se execut de mai multe ori, cte o dat pentru fiecare linie prelucrat de cererea principal, deci cererea interioar este condus de cererea exterioar.
80
Trebuie specificat c, dei subcererea corelat se execut repetat, aceasta nu nseamn c subcererile corelate sunt mai puin eficiente dect subcererile ascunse.
Dac vrem s aflm persoanele care au salariul peste valoarea medie salariului pe departamentul din care fac parte, folosim cererea urmtoare: SQL> SELECT a.id_dep,a.nume,a.functie,a.salariu FROM angajati a WHERE a.salariu > (SELECT avg(salariu) salariu_mediu FROM angajati b WHERE b.id_dep=a.id_dep ) ORDER By id_dep; 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 angajai i pstreaz toi angajaii care au salariul peste salariul mediu pe departamentul respectiv returnat de subcerere, care se coreleaz cu cererea principal prin condiia din clauza WHERE. n acest caz, se folosete un join pe aceeai tabel. Cnd folosim subcereri, trebuie respectate cteva reguli, cum ar fi: - cererea interioar trebuie s fie inclus ntre paranteze i trebuie s fie n partea dreapt a condiiei; - expresiile din lista de expresii a subcererii trebuie s fie n aceeai ordine ca cele din lista din clauza WHERE a cererii principale( avnd acelai tip i numr de expresii ); - subcererile nu pot fi ordonate, deci nu conin clauza ORDER BY; - clauza ORDER BY apare la sfritul cererii principale; - subcererile sunt executate de la cea mai adnc imbricare pna la nivelul principal de imbricare(cu excepia cererilor corelate); - subcererile pot folosi funcii de grup i clauza GROUP BY ; - subcererile pot fi nlnuite cu predicate multiple AND sau OR n aceeai cerere extern; - n subcereri se pot folosi operatori de mulimi; - subcererile pot fi imbricate pn la nivelul 255.
81
82
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 constrngerile de integritate pentru coloana table_constraints - definete constrngerile de integritate la nivel de tabela tablespace specifica n ce tablespace al bazei de date se creeaz tabela storage parameters definete parametrii de creare i pot fi: PCTFREE procentaj de spaiu rezervat pentru update PCTUSED procentaj minim folosit pentru un bloc de date INITRANS numarul initial de tranzactii pentru fiecare bloc(1-255) MAXTRANS- numarul maxim de tranzacii concurente (1-255) CLUSTER specific daca tabela face parte dintr-un cluster ENABLE/DISABLE clause activare/dezactivare de constrngeri 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 numr real de dimensiune variabil (maxim 38 cifre) NUMBER(n) numr intreg de n cifre NUMBER(n,m) numr real de n cifre din care m zecimale CHAR(n) ir de caractere de lungime fix n ( 1- 2000 ) NCHAR(n) analog cu CHAR dar poate stoca iruri de caractere nationale VARCHAR2(n) sir de caractere de lungime variabil 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
Limbajul SQL
LONG RAW similar cu LONG dar conine date binare ROWID poate stoca identificatorul unei linii din tabel DATE data calendaristic TIMESTAMP(n) extensie pentru tipul DATE i conine i fraciuni de secunda pe n zecimale
83
Cnd se creeaz o tabela trebuie respectate anumite reguli, cum ar fi : - 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; - numele trebuie s aib maxim 30 caractere continue, sa inceap cu o litera i s nu fie cuvant rezervat ; - o tabela poate fi creat oricnd dar nu poate fi alterat cnd este accesat de un alt user; - la creare nu este necesar sa se specifice dimensiunea tabelei dar trebuie estimat ce spaiu va ocupa n tablespace; - structurile tabelelor pot fi modificate i ulterior (prin adaugare sau tergere de coloane, constrngeri, indeci, e.t.c.); - dac dimensiunea iniial este insuficient i se aloca automat mai mult spaiu n limita tablespace-lui ( care la randul lui poate fi extins cu un nou data_file); - clauza DEFAULT poate conine constante numerice, ir de caractere , functii (inclusiv sysdate i user) dar nu poate contine numele unei alte coloane sau pseudocoloane); - valoarea DEFAULT este luat n considerare n cazul inserrii unei linii n care nu se specific nimic n legtura cu coloana respectiv. S crem o tabela pentru evidena admiterii la facultate : SQL>CREATE TABLE studenti (facultate char(30) DEFAULT 'Automatica si Calculatoare', catedra char(20), cnp number(13), nume varchar2(30), data_nastere date, an_univ number(4) DEFAULT 2011, media_admitere number(5,2) , discip_oblig varchar2(20) DEFAULT 'Matematica', discip_opt varchar2(20) DEFAULT 'Fizica' , operator DEFAULT user, data_op DEFAULT sysdate );
84
n cazul inserrii unei linii, valorile campurilor operator i data operare nu trebuie specificate deoarece sunt preluate cu funciile de sistem user i sysdate.
Limbajul SQL
den_functie varchar2(20) NOT NULL, data_vigoare date );
85
Funcionalitatea coloanelor cod_functie i den_functie este aceeai (nu accept valori nule) dar consructia constrngerii pentru cod_functie permite activarea sau dezactivarea lui NL.
Constrngerea UNIQUE
Se folosete cnd vrem ca o coloan sau perechi de coloane s nu conin valori duplicate. Verificarea se face numai pentru inregistrari cu valori nenule deoarece constrngerea permite inserarea de valori nule n coloanele respective. n mod automat se creeaz i un index pe coloanele definite chei unice, ceea ce duce la marirea vitezei de interogare pe tabel. Sintaxa la nivel de coloan este: column [ CONSTRAINT constraint_name ] UNIQUE iar la nivel de tabela este: [, CONSTRAINT constraint_name ] UNIQUE (col1, col 2,..) Sa cream tabela funcii definind unicitate pe anumite coloane: SQL>CREATE TABLE functii ( cod_functie number(2) CONSTRAINT UK_FUN UNIQUE, den_functie varchar2(20) UNIQUE, data_vigoare date ) ; Putem s facem i urmatoarea construcie la nivel de tabel: SQL>CREATE TABLE functii ( cod_functie number(2), den_functie varchar2(20), data_vigoare date, CONSTRAINT UK_FUN UNIQUE (cod_functie,den_functie) ); n prima consructie putem insera oricate inregistrari cu valori nule pe coloanele definite unice dar n construcia a doua nu putem sa inseram inregistrari cu una din coloane nul i cealalt sa nu respecte unicitatea.
86
Sintaxa la nivel de coloan este column [ CONSTRAINT constraint_name ] PRIMARY KEY iar la nivel de tabel [, CONSTRAINT constraint_name ] PRIMARY KEY (col1, col 2,..) Dac vrem s crem un nomenclator de funcii n care fiecare funcie sa aib cod unic folosim urmatoarea construcie: SQL>CREATE TABLE functii ( cod_functie number(2) CONSTRAINT PK PRIMARY KEY, den_functie varchar2(20), data_vigoare date ); Dac dorim ca un cod de funcie s poat fi utilizat de mai multe ori trebuie s definim cheia pe mai multe coloane, de exemplu pe codul funciei i data la care intr n vigoare codificarea. SQL>CREATE TABLE functii ( cod_functie number(2) , den_functie varchar2(20), data_vigoare date, CONSTRAINT PK_FUN PRIMARY KEY (cod_functie,data_vigoare));
Limbajul SQL
87
Pentru a se putea face relaionarea trebuie ca tabela funcii s aib cheie primar sau unic pe coloana den_functie iar tabela departamente sa aib cheie primar sau unic pe coloana id_dep. Se observ c tabela este relaionat cu ea insi dup coloanele id_sef si id_ang. O constructie la nivel de tabel arat astfel: SQL>CREATE TABLE angajati ( id_ang number(4) PRIMARY KEY, nume varchar2(30), functie varchar2(20) REFERENCES functii(den_functie), id_sef number(4) REFERENCES angajati(id_ang), data_ang date, salariu number(7,2), comision number(7,2), id_dep number(2) , CONSTRAINT FK_ANG FOREIGN KEY (id_dep) REFERENCES departamente(id_dep) ); Cnd se face relaionarea intre doua tabele trebuie avute n vedere urmatoarele reguli de functionare : - inserarea unei linii intr-o tabel relaionat (pe care am definit FOREIGN KEY) nu se poate face dac nu exist decat o singur linie; - n tabela de referin ( n care am definit PRIMARY KEY sau UNIQUE) corespunzator coloanelor de relaionare; - tergerea unei linii din tabela de referin nu se poate face atta timp cat exist linii relaionate pe linia respectiv n tabela relaionat; - regulile de mai sus sunt valabile i n cazul relaionrii pe coloane. Pentru a putea sa tergem totui linii n tabela de referin, chiar daca sunt relaionate din alte tabele, se poate folosi optiunea ON DELETE CASCADE i n acest caz atunci cnd se terge o linie n tabel de referin se vor terge toate liniile din tabelele relaionate care sunt n relaie cu linia respectiv. n cazul unei tabele relaionat cu ea insi, cnd se terge o linie care este referit, toate coloanele devin nule n liniile relaionate. De exemplu, n tabela angajai, dac se folosete opiunea ON DELETE CASCADE, cnd se terge o linie aferent unui ef, la toi angajaii care au eful respectiv se va face nul coloana id_sef. Cnd se folosete opiunea ON DELETE SET NULL, atunci cnd se terge o linie din tabela de referina toate coloanele de relaie din tabela relaionat vor deveni nule, deci nu vor fi terse liniile relaionate.
88
Limbajul SQL
Stergerea unei coloane dintr-o tabel: SQL>ALTER TABLE departamente DROP COLUMN interfon;
89
Modificarea dimensiunii unei coloane (pentru descreterea dimensiunilor tabela trebuie sa fie goal sau coloanele de modificat s conin valori nule): SQL> ALTER TABLE departamente MODIFY ( telefon varchar2(12) ); Adugarea unei noi constrngeri: SQL>ALTER TABLE departamente ADD CONSTRAINT UK_DEN UNIQUE (den_dep); Stergerea unei constrngeri: SQL>ALTER TABLE departamente DROP CONSTRAINT UK_DEN; Dezactivarea unei constrngeri: SQL>ALTER TABLE departamente DISABLE CONSTRAINT UK_DEN; Marcarea unei coloane ca neutilizabil: SQL>ALTER TABLE departamente SET UNUSED (interfon);
90
S facem o inserare complet (toate coloanele au valori nenule) n tabela intrari_gestiune. n acest caz nu trebuie s specificm numele coloanelor dar valorile trebuie specificate n clauza VALUES n ordinea de creare a coloanelor n tabel. SQL> INSERT INTO intrari_gestiune VALUES(999,'12-DEC-2010',33,2,1,124.50); Dac facem inserri numai n anumite coloane comanda arat astfel: SQL>INSERT INTO iesiri_gestiune (NR_DOC_OUT,DATA_DOC_OUT,COD_PRODUS, CANT_OUT,COD_UM) VALUES(777,'15-DEC-2010',333,10,2);
Limbajul SQL
91
93
Orice alt poriune a bazei de date care ndeplinete condiia din definiie n concordan cu facilitile puse la dispoziie de SGBD-ul respectiv. De exemplu sistemul Oracle blocheaz automat orice linie afectat de o comanda de tip UPDATE, INSERT i DELETE pn cnd tranzacia care a efectuat operaia fie comite modificrile (le face permanente n baza de date) fie le revoc. n acest caz articolele sunt deci linii ale tabelei actualizate. c. Planificare Definiie: O planificare reprezint ordinea n care sunt executai de SGBD paii elementari ai unui set de tranzacii. Tabela de la inceputul acestui capitol este o vizualizare a unei planificari. Planificarea este deci o lista de pai pentru un set de tranzacii care se execut concurent i arat c SGBD-ul execut aceti pai n exact acea ordine. n acest capitol vom reprezenta doar paii care semnific o interaciune a tranzaciei 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 operaiile de scriere nu devin permanente n baza de date dect dup comitere putem avea i pai de tip COMMIT (comiterea modificrilor efectuate de o tranzacie) sau ROLLBACK (revocarea modificrilor efectuate de o tranzacie). d. Planificare serial Definiie: O planificare n care paii fiecarei tranzacii sunt succesivi, fr s fie intercalai pai ai altor tranzacii se numete planificare serial. e. Blocarea articolelor Definiie: Blocarea unui articol de catre o tranzacie semnific faptul c acea tranzacie obine din partea sistemului (SGBD) anumite drepturi speciale de acces care mpiedic alte tranzacii s efectueze anumite operaii asupra acelui articol. Exist dou categorii de blocri: Blocri exclusive: celelalte tranzacii nu pot s execute operaii asupra articolului blocat. Aceste blocri sunt denumite n literatura de specialitate i Exclusive Locks sau Write Locks. Blocri partajate: celelalte tranzacii pot s execute doar anumite tipuri de operaii asupra articolului blocat. Aceste blocri 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)
94
dintre ele fiind finalizata fie prin comiterea modificrilor efectuate (ele devin definitive n baza de date) fie prin revocarea lor (modificrile sunt anulate). Dup terminarea unei tranzacii celelalte operaii asupra bazei de date aparin tranzaciilor urmatoare. Cum singurele operaii care sunt importante din punct de vedere al interaciunii dintre program i sistemul de gestiune sunt cele de citire/scriere i cele conexe (blocare, deblocare, comitere i revocare) putem defini o tranzacie i ca o succesiune de operaii de acest tip.
ACID
Pentru ca o tranzacie s fie bine definit ea trebuie s indeplineasca nite criterii de corectitudine care au fost sintetizate prin abrevierea ACID. Aceasta semnific: A Atomicitate C Consisten I Izolare D Durabilitate. Atomicitate O tranzacie trebuie s fie atomic n sensul c fie toate modificrile efectuate de ea n baza de date sunt comise fie sunt toate revocate. Exemplu: Sa luam o tranzacier 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 modificri 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 dispoziie mecanismele prin care s se asigura atomicitatea tranzaciilor inclusiv n cazul unor incidente hardware i software care pot interveni n timpul execuiei unei tranzacii. Consistena O tranzacie 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 tranzacie nu poate ncalca restriciile existente la nivelul bazei de date. n cele mai multe cazuri aceste restricii sunt modelate sub forma constrngerilor de integritate (NOT NULL, PRIMARY KEY, etc). Dac o tranzacie conine o operaie care violeaz o constrngere de integritate atunci toate modificrile efectuate de tranzacie vor fi revocate. Mecanismele de pstrare a consistenei trebuie asigurate de SGBD.
95
Izolare O tranzacie trebuie s se comporte ca i cnd operaiile efectuate de ea sunt izolate, independente de operaiile efectuate de alt tranzacie. Nici o alt tranzacie nu trebuie s citeasca date intermediare scrise de tranzacia respectiv. De exemplu dac o tranzacie contine succesiunea de operaii:
READ (A) A = A + 1 WRITE (A) READ (B) B = B - 1 WRITE (B) -- citeste valoarea veche a lui A: 5 -- scrie valoarea noua a lui A:6 -- citeste valoarea veche a lui B:10 -- scrie valoarea noua a lui B:9
Atunci nici o alt tranzacie 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). Inconsistenele prezentate n paragraful anterior erau datorate nclcrii acestui criteriu de corectitudine. Din punct de vedere al modului de asigurare a izolarii tranzaciilor tot sistemul de gestiune trebuie s asigure mecanismele necesare. Izolarea este obiectul controlului accesului concurent, prezentat n paragrafele urmatoare. Durabilitate O dat comise cu succes modificrile efectuate de o tranzacie ele vor persista i nu mai pot fi revocate. Inclusiv n cazul unui incident hardware i software efectele tranzaciilor comise sunt regsite la recuperarea dup incident. Din acest punct de vedere fiecare sistem de gestiune trebuie s conina mecanisme prin care efectele tuturor tranzaciilor comise s fie nregistrate i n jurnalele sistemului pentru a fi restaurate n caz de incident.
6.3. Serializabilitate
Aa cum s-a specificat planificrile seriale nu duc la inconsistene. n practic ns n cazul unor sisteme ncrcate planificrile conin pai intercalai ai diverselor tranzacii. Rezultatul va fi totusi corect dac efectul execuiei planificrii respective este acelai cu al uneia dintre planificrile seriale posibile ale acelorasi tranzacii. O astfel de planificare se numeste planificare serializabil.
Planificri serializabile
Definiie: O planificare este serializabil dac produce aceleai efecte n baza de date cu o planificare serial. Exemplu: O planificare serializabil i planificarea serial echivalent:
96
Planificare serializabil:
T1 READ A READ B READ C READ D WRITE A WRITE C READ A WRITE A T2 T3
Planificri conflict-serializabile
Exista i o alt abordare a serializabilitii bazat pe conflictele care pot s apar ntre paii a dou tranzacii dintr-o planificare. Definiie: ntre dou operaii aparinnd unei planificri exist un conflict dac: Aparin unor tranzacii diferite Sunt pe acelai obiect Una dintre operaii este o scriere Cele dou operaii sunt succesive n sensul c ntre ele nu exist o operaie cu care vreuna dintre ele este n conflict. Rezult c exista 3 tipuri de situaii conflictuale: Fiind date dou tranzacii T1 i T2 pot exista conflicte de tipurile R1-W2, W1-W2 i W1-R2. Definiie: Doua planificri sunt conflict-echivalente dac: Conin aceleai operaii ale acelorai tranzacii Fiecare pereche de operaii conflictuale apare n aceeai ordine n cele dou planificri. Aceasta definiie nu spune c nu pot s apar anomalii n execuia celor dou planificari ci c apar aceleai anomalii n ambele. Definiie: O planificare este conflict-serializabil dac este conflictechivalent cu o planificare serial. Observaie: Reformulnd putem spune c o planificare este conflictserializabil dac poate fi transformat ntr-o planificare serial prin interschimbri ale operaiilor consecutive care nu sunt n conflict din dou tranzacii.
97
Definiie: Doua planificri S1 i S2 sunt v-echivalente dac pentru orice articol A: 1. Dac Ti citete valoarea iniiala a lui A n S1 atunci ea face acelai lucru i n S2. 2. Dac Ti citete o valoare a lui A scrisa de Tj n S1, atunci face acelai lucru i n S2. 3. Daca Ti scrie valoarea final a lui A n S1 atunci ea face acelai lucru i n S2 Definiie: O Planificare este v-serializabil dac este v-echivalent cu o planificare serial. Incluziunea ntre diverse tipuri de planificari este urmatoarea:
98
Execuia simultan a unei operaii de scriere cu o alt operaie (de citire sau de scriere) poate duce la inconsistene n utilizarea bazei de date. O astfel de situaie este evitat n Oracle prin mecanismele de consisten la citire: Aceleai date pot fi citite simultan de orici utilizatori, Aceleai date nu pot fi modificate simultan de doi utilizatori. n momentul n care unul din ei modific o valoare, sistemul efectueaz o blocare implicit a liniei care o conine blocnd accesul pentru scriere al altor utilizatori. Aceleai date pot fi modificate la un moment dat de un utilizator i citite de orici alii, Modificrile fcute de un utilizator n coninutul tabelelor nu sunt vizibile pentru ceilali utilizatori pn n momentul n care se execut implicit sau explicit nscrierea lor permanent n baza de date (pn la comitere). Pn la comiterea modificrilor, operaiile de citire efectuate de ali utilizatori returneaz coninutul de date anterior modificrii lor, Pn nu au fost comise, modificrile pot fi revocate, anulndu-se efectul cererilor care le-au efectuat, n momentul comiterii sau revocrii modificrilor se ridic toate blocrile aferente acestora, n acest fel operaiile de citire i modificare a datelor se pot executa simultan fr s interfereze unele cu celelalte. De asemenea sunt prevenite inconsistenele care pot apare la modificarea simultan a acelorai date.
99
UNLOCK A LOCK B putem avea o planificare care o combin cu o alt tranzacie 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 conine un ciclu, ceea ce nseamn c nu e serializabila. Graful se construiete avnd ca noduri tranzaciile i arce de la tranzacia care face UNLOCK pe un articol ctre cea care face urmatorul LOCK pe acel articol. Protocolul de blocare n 2 faze implica ns uneori operaii de roll-back n cascad:
T1 LOCK A LOCK B READ A WRITE A UNLOCK A T2
n momentul Rollback pentru T1 este necesar Rollback i pentru T2 deoarece T2 a citit date scrise de T1, date care prin operaia de Rollback se pierd. 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 sfritul tranzaciei. n acest caz tranzacia T2 din exemplul anterior pornete abia dup terminarea complet a tranzaciei T1.
100