l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
Costin Ioan Georg
e
Iulia 15.09.1
981
Lugoj Lugoj, str.
Grii nr.8
ap.19
tiine
Ec.
I 854 2 215 3
Marines
cu
Liana Lu-
cian
Eva 04.11.1
979
Timi-
oara
Timioara,
str.1 Iunie
nr.3
Cal-
cula-
toare
II 130 1 233 1
Ondea Vasile Mihai Aurica 25.10.1
977
Timi-
oara
Timioara,
Cl. agului
nr. 201
tijn-
e Ec.
II 602 2 141 2
Popes-
cu
Maria Ion Oana 10.06.1
980
Timi-
oara
Timioara,
str. A.Vlaicu
Cal-
cula-
II 175 1 233 2
27
nr.7 toare
Vasiu Bogdan Mirce
a
Floare 24.01.1
981
Reia Reia, str.
Grii nr.3
ap.5
Calcu
-
latoar
e
II 188
Figura 3.1. Relaia EVIDENA
Domeniile unei relaii determin tipul i eventual limitrile valorilor atributelor.
Tipurile sunt cele standard n reprezentarea datelor n calculator (numeric,
eventual cu diferenierile ntreg, real; caracter/ir de caractere; dat
calendaristic/or etc.). Mai multe atribute pot lua valori ale aceluiai domeniu (de
exemplu Numr Matricol i Camera sunt de tip ntreg) dar un atribut nu poate lua
valori din dou tipuri diferite (de exemplu nu poate fi simultan numeric i ir de
caractere).
Limitrile sunt condiii pe care valorile atributelor trebuie s le ndeplineasc
pentru a fi introduse n relaie. Exist multe tipuri de limitri, cum sunt condiia de
numericitate (informaia s fie numeric), de pozitivitate (sunt admise doar valori
pozitive), de incrementare (o valoare este admis numai dac este egal cu cea
anterioar incrementat cu 1, pentru acelai atribut) etc.
Tuplele sunt liniile dintr-o tabel, adic elementele unei relaii. Ele mai sunt
numite i nregistrri (eng. records).
Cheile unei relaii sunt atribute dup care tuplele se difereniaz clar ntre ele;
conform conceptelor generale de BD, exist chei candidate dintre care se alege o
cheie primar i chei alternate, cu semnificaiile ntlnite n capitolul I.
Reprezentrile sunt modalitile de a enumera componentele unei relaii. Cea
mai des utilizat reprezentare n BD relaionale descrie relaia prin numele su, urmat
(ntre paranteze) de numele atributelor, dintre care cheia primar se indic prin
subliniere.
De exemplu, relaia EVIDENA de mai sus are reprezentarea:
Evidena (Numele, Prenumele, Prenumele tatlui, Prenumele mamei, Data naterii,
Locul naterii. Domiciliul, Facultatea, Anul de studiu, Numr matricol#, Cminul,
Camera, Patul)
Orice relaie trebuie s satisfac dou aseriuni (constrngeri) relaionale:
aseriunea privind cheia primar: nici o component a valorii de cheie
primar nu poate fi nul. Aceasta rezult din definiia cheii primare (capitolul I)
care spune c aceasta trebuie s identifice n mod unic instana entitii; dac
ea este nul, instana nu poate fi identificat unic;
aseriunea privind atributul de cheie strin: valoarea unui atribut de cheie
strin trebuie s fie nul sau egal cu valoarea cheii primare a unui anumit
tuplu din relaia tat. Aceasta rezult din definiia atributului de cheie strin i
din restricia de integritate referenial; dac atributul cheie strin nu are
echivalent n instana tat atunci aceasta nu poate fi identificat.
3.1.2 Regulile lui Codd
28
Avantajele foarte mari pe care modelul relaional de BD le ofer sunt datorate
faptului c acesta are o fundamentare matematic riguroas, datele au o structur
relativ simpl i o independen mare fa de implementarea fizic iar redundana
este minim.
Pentru a respecta modelul relaional, un SGBD trebuie s respecte un set de
13 reguli, propuse de Codd n 1985. Totui, o privire mai realist a problemei arat
c nu se pune problema neaprat dac SGBD este sau nu relaional, ci doar msura
n care el este relaional adic respect toate aceste 13 reguli.
Regulile indicate sunt [POP96]:
Regula 1 gestionarea datelor: un SGBD este relaional dac poate gestiona orice
BD prin posibiliti relaionale.
Regula 2 reprezentarea informaiei: un SGBD este relaional dac poate
organiza orice BD sub form de tabele (relaii).
Regula 3 accesul garantat la date: un SGBD este relaional dac orice informaie
din BD poate fi regsit prin expresia numele relaiei+numele atributului+valoarea
cheii primare.
Regula 4 reprezentarea informaiei necunoscute: un SGBD este relaional dac
permite definirea i utilizarea valorii nul pentru informaiile care nc nu sunt
cunoscute.
Regula 5 - dicionarele de date: un SGBD este relaional dac asupra descrierii BD
se pot efectua aceleai operaii ca asupra datelor din BD (adic i descrierea BD
este tot un tabel).
Regula 6 limbajul de interogare: un SGBD este relaional dac el conine cel
puin un LMD.
Regula 7 actualizarea vizualizrii: un SGBD este relaional dac poate determina
condiile n care o vizualizare poate fi actualizat.
Regula 8 limbajul de nivel nalt: un SGBD este relaional dac nu oblig
utilizatorul s caute informaia dorit, ntr-o relaie, linie cu linie.
Regula 9 independena fizic a datelor: un SGBD este relaional dac
programele utilizatorilor nu depind de modul de memorare sau de acces la date.
Regula 10 independena logic a datelor: un SGBD este relaional dac
programele utilizatorlor sunt transparente la modificrile efectuate asupra datelor.
Regula 11 independena datelor din punct de vedere al integritii: un SGBD
este relaional dac regulile de integritate sunt definite prin limbajul SGBD nu prin
aplicaiile utilizatorului.
Regula 12 - independena datelor din punct de vedere al distribuirii: un SGBD
este relaional dac faptul c datele sunt distribuite n reea este transparent
aplicaiilor utilizatorului.
Regula 13 versiunea procedural a SGBD: un SGBD este relaional dac orice
component procedural a SGBD respect aceleai restricii de integritate ca i
componenta relaional.
Cum aceste reguli sunt foarte stricte, se pot utiliza criterii mai reduse care s
indice gradul n care un SGBD este relaional.
3.1.3 Normalizarea relaiilor
29
Normalizarea este procesul reversibil prin care o relaie este transformat
ntr-o relaie cu structur mai simpl [POP96].
Normalizarea trebuie s asigure ndeplinirea urmtoarelor cerine:
conservarea datelor - relaia final s nu piard din datele iniiale;
conservarea dependenelor relaia final s nu piard din dependenele
iniiale;
s fie o descompunere minimal - relaia final s nu fie coninut ntr-o alt
relaie.
Normalizarea trebuie efectuat atunci cnd relaiile utilizate posed unul dintre
urmtoarele dezavantaje, numite de ctre Codd anomalii de actualizare [NAS00]:
anomalia de tergere, care se manifest cnd datele care trebuie terse fac
parte din tuple care conin i alte informaii iar tergerea lor ar duce la
pierderea acestor informaii;
anomalia de adugare, care se manifest cnd datele care trebuie adugate
fac parte din tuple care conin i informaii care nc nu sunt cunoscute;
anomalia de modificare, care se manifest cnd datele care trebuie
modificate apar n foarte multe tuple.
n funcie de dependenele care trebuie rezolvate n cadrul relaiilor, prin
procesul de normalizare, relaiile pot fi considerate n mai multe forme normale,
incluse unele n celelalte ca n Figura 3.2.
FN1
FN2
FN3
FNBC
FN4
FN5
Relaie general
Figura 3.2: Nivelele formelor normale
Prima form normal (FN1, eng. First Normal Form 1NF)
O relaie este considerat ca fiind de prima form dac:
fiecare atribut conine numai valori indivizibile (atomice);
fiecare tuplu nu conine atribute sau grupe de atribute repetitive.
O relaie care nu este n FN1 se poate aduce n aceast form prin:
Pasul 1. nlocuirea atributului compus cu mai multe atribute simple (de exemplu,
atributul Domiciliu se poate nlocui cu atributele DLocalitate, DStrada, DNumr,
DBloc, DScara, DApartament);
Pasul 2. plasarea fiecrui atribut repetitiv ntr-o nou relaie (de exemplu, dac
atributele Numele i Prenumele se repet pentru a fi alturi de cmpurile de note, de
cmpurile de taxe, de cmpurile de cri mprumutate, pentru a putea realiza trei
vederi utilizator diferite ce corespund necesitilor studentului-de a vedea notele,
contabilitii-de a vedea taxele, bibliotecii-de a vedea circulaia crilor, atunci se
construiesc trei tabele distincte);
Pasul 3. introducerea n schema fiecrei relaii construit ca mai sus a cheii primare
a relaiei de unde s-a extras atributul respectiv (de exemplu, Numele i Prenumele
trebuie s se regseasc n cele trei noi relaii construite ca mai sus);
Pasul 4. stabilirea cheii primare a fiecrei relaii construit ca mai sus s includ
cheia primar a relaiei iniiale i alte atribute necesare.
De exemplu, o relaie aflat n FN1 care memoreaz cadrele didactice i
cursurile la care acestea predau, cu numele NCADRARE, poate fi ca n figura II.3.
30
INCADRARE
C
o
d
#
D
e
n
u
m
i
r
e
T
i
p
c
u
r
s
C
o
d
C
D
1
#
N
u
m
e
C
D
1
G
r
a
d
C
D
1
S
a
l
a
r
C
D
1
C
o
d
C
D
2
#
N
u
m
e
C
D
2
G
r
a
d
C
D
2
S
a
l
a
r
C
D
2
101 Algebr Obl 2018 Marinescu
V.
Prof. 200 2018 Marinescu
V.
Prof. 100
102 Arhitectur Obl 2315 Ionescu Gh. Prof. 200 2378 Popescu M. As. 25
103 Birotic Obl 2375 Georgescu
I.
Lect. 100 2375 Georgescu
I.
Lect. 50
104 Logic Op 2018 Marinescu
V.
Prof. 150 2270 Iliescu A. Prep 15
105 Structuri Obl 2974 Nstase Al. Conf 150 2378 Popescu M. As. 25
Figura 3.3. Relaie aflat n FN1
Se observ c aceast relaie nu conine atribute compuse (exceptnd poate
numele i prenumele cadrelor didactice, dar descompunerea n atribute de gen
Nume respectiv Prenume nu ar avea nici un rost) i nici atribute care se repet.
CURSURI TITULARI
C
o
d
#
D
e
n
u
m
i
r
e
T
i
p
c
u
r
s
C
o
d
C
D
1
#
S
a
l
a
r
C
D
1
C
o
d
C
D
2
#
S
a
l
a
r
C
D
2
C
o
d
C
D
#
N
u
m
e
C
D
G
r
a
d
C
D
101 Algebr Obl 2018 200 2018 100 2018 Marinescu V. Prof.
102 Arhitectur Obl 2315 200 2378 25 2270 Iliescu A. Prep
103 Birotic Obl 2375 100 2375 50 2315 Ionescu Gh. Prof.
104 Logic Op 2018 150 2270 15 2375 Georgescu I Lect.
105 Structuri Obl 2974 150 2378 25 2378 Popescu M. As.
2974 Nstase Al. Conf
Figura 3.4. Relaia din Figura 3.3 adus n FN2
A doua form normal (FN2, eng. Second Normal Form 2NF)
O relaie este considerat ca fiind de a doua form normal dac:
este n FN1;
orice atribut care nu intr n compunerea cheii primare, depinde de ntreaga
cheie primar.
O relaie care nu este n FN2 se poate aduce n aceast form prin
descompunerea relaiei n mai multe relaii pentru a elimina redundanele.
De exemplu, relaia din Figura 3.3 nu este n FN2 deoarece conine
redundane; aducerea ei n FN2 se face construind dou relaii, una care conine
date despre cursuri i alte despre cadrele didactice, ca n figura II.4.
A treia form normal (FN3, eng. Third Normal Form 3NF)
O relaie este considerat ca fiind de a treia form normal dac:
31
este n FN2;
orice atribut care nu intr n compunerea cheii primare, depinde direct de
cheia primar.
O relaie care nu este n FN3 se poate aduce n aceast form prin
descompunerea relaiei n mai multe relaii pentru a elimina dependenele funcionale
tranzitive, adic prin construirea unei relaii n care se regsesc atributele care
depind indirect de alte atribute.
SALARIZARE1 SALARIZARE2
C
o
d
c
u
r
s
#
G
r
a
d
C
D
1
#
S
a
l
a
r
C
D
1
C
o
d
c
u
r
s
#
G
r
a
d
C
D
2
#
S
a
l
a
r
C
D
2
101 2018 200 101 2018 100
102 2315 200 102 2315 25
103 2375 100 103 2375 50
104 2018 150 104 2018 15
105 2974 150l 105 2974 25
Figura 3.5. Relaia din Figura 3.3 adus n FN3
De exemplu, n Figura 3.4 se observ c apar mai multe tuple n care
CodCD1# este egal cu 2018 (prima i a patra) dar pentru care valoarea atributului
SalarCD1 este diferit (200 n primul caz i 150 n al doilea). Problema apare
deoarece cursurile respective sunt obligatorii respectiv opionale i deci valoarea
cmpului SalarCD1 depinde de Tip Curs (care depinde de Cod#) i GradCD1 (care
depinde de CodCD1#). Se poate atunci trece relaia CURSURI din forma FN2 n FN3
prin descompunerea relaiei ca n Figura 3.5.
Forma normal Boyce-Codd (FNBC, eng. Boyce-Codd Normal Form
BCNF)
O relaie este considerat ca fiind de forma normal Boyce-Codd dac:
este n FN3;
orice atribut care nu intr n compunerea cheii primare, depinde direct i total
de cheia primar.
O relaie care nu este n FNBC se poate aduce n aceast form prin
descompunerea relaiei n mai multe relaii pentru a elimina atributele care depind de
atribute non-cheie, adic prin construirea unei relaii n care se regsesc atributele
care depind indirect de alte atribute care nu sunt cheie.
De exemplu, n Figura 3.4 se observ c apar mai multe tuple n care Tip curs
este egal cu Obl i SalarCD1 este egal cu 200, dei CodCD1# are valori diferite
(2018 respectiv 2315). Situaia se datoreaz faptului c cele dou valori pentru
CodCD1 corespund la dou ocurene similare din TITULARI, n sensul c ambele
aparin unor cadre didactice cu grad de Profesor. Rezolvarea acestei probleme i
trecerea n FNBC se face ca n Figura 3.6.
A patra form normal (FN4, eng. 4th Normal Form 4NF)
O relaie este considerat ca fiind de a patra form normal dac:
32
este n FNBC;
nu conine relaii m:n independente.
O relaie care nu este n FN4 se poate aduce n aceast form prin
descompunerea relaiei n mai multe relaii care conin fiecare atributul cheie i cte
un atribut din cele care depind direct de cheia respectiv.
ASOCIERE11 ASOCIERE12
C
o
d
c
u
r
s
#
G
r
a
d
C
D
1
#
T
i
p
c
u
r
s
T
i
p
c
u
r
s
#
G
r
a
d
C
D
1
#
S
a
l
a
r
C
D
1
101 2018 Obl Obl Prof. 200
102 2315 Obl Obl Conf 150
103 2375 Obl Obl Lect. 100
104 2018 Op Obl As. 50
105 2974 Obl Obl Prep null
Figura II.6: Relaia din figura II.3 adus n FNBC
LIMBAJE => LIMBAJE1 LIMBAJE2
C
o
d
C
D
2
#
L
i
m
b
a
j
C
o
d
c
u
r
s
C
o
d
C
D
2
#
L
i
m
b
a
j
C
o
d
C
D
2
#
C
o
d
c
u
r
s
2375 Word 103 2375 Word 2375 103
2375 Pascal 104 2375 Pascal 2378 105
2375 Pascal 105 3771 Pascal
3771 Pascal 105 2378 C
3771 Pascal 104
2378 C 105
Figura 3.7: Figura 3.8:
Relaie redundant Relaia din Figura 3.7 adus n FN4
De exemplu, n Figura 3.7 se observ c apar mai multe tuple n care valorile
lui CodCD2# i Limbaj se repet; eliminarea redundanei se face prin desfacerea
relaiei n alte dou relaii, n care CodCD2 apare alturi de fiecare din celelalte
atribute care iniial ddeau problema de relaie dependent.
A cincea form normal (FN5, eng. 5th Normal Form 5NF)
O relaie de tip FN5 este foarte rar ntlnit n practic, ea are mai mult un
aspect teoretic; relaia este considerat ca fiind de a cincea form normal dac:
este n FN4;
nu conine dependene ciclice.
O relaie care nu este n FN5 se poate aduce n aceast form prin eliminarea
dependenelor ciclice astfel: dac dependena ciclic este ntre perechile de mulimi
(A, B), (B, C) i (A, C), se creaz relaiile:
R
1
(A:Domeniu
A
, B:Domeniu
B
),
R
2
(B:Domeniu
B
, C:Domeniu
C
),
33
R
3
(A:Domeniu
A
, C:Domeniu
C
)
i astfel valorile luate de cheile care forau dependena ciclic sunt eliminate.
3.1.4 Operaii i operatori
Asupra relaiilor pot fi aplicate operaii de tip relaional care au ca rezultat tot
relaii. Cei trei operatori relaionali de baz sunt PROJECT, SELECT i JOIN.
Operatorul PROJECT (proiecie) formeaz o nou relaie prin extragerea
(proiectarea) unor atribute dintr-o relaie existent. Dac se noteaz relaiile cu R
1
i
R
2
iar atributele cu A
1
, A
2
, ..., A
n
atunci formula de definire este:
R
2
:= PROJECT (R
1
) (A
1
, A
2
, ...)
sau
R
2
:= PROJECT A
1
, A
2
, ... FROM R
1
De exemplu, dac se dorete obinerea unei evidene a repartizrii studenilor
cminiti pe faculti i ani de studiu, atunci se pleac de la relaia EVIDENA (figura
II.1) i se efectueaz operaia de extragere de forma:
REPARTIIE := PROJECT (EVIDENA) (Facultatea, Anul de studiu, Cminul)
sau
REPARTIIE := PROJECT Facultatea, An de studiu, Cminul FROM EVIDENA
REPARTIIE
Facultatea Anul de studiu Cminul
tiine Ec. I 2
Calculatoare II 1
tijne Ec. II 2
Calculatoare II 1
Figura 3.9. Rezultatul operaiei PROJECT (faza I)
REPARTIIE
Facultatea Anul de studiu Cminul
tiine Ec. I 2
Calculatoare II 1
tijne Ec. II 2
Figura 3.10. Rezultatul operaiei PROJECT (faza II)
care se efectueaz n dou etape: n prima etap se extrag toate tuplele (figura II.9)
apoi se elimin tuplele duplicate (Figura 3.10).
Operatorul SELECT (el se mai noteaz uneori RESTRICT) (selecia)
formeaz o nou relaie prin extragerea (proiectarea) dintr-o relaie existent numai a
liniilor care satisfac anumite criterii (condiii). Formula de definire este:
R
2
:= SELECT (R
1
) (A
1
, A
2
, ...) (condiie)
sau
R
2
:= SELECT A
1
, A
2
, ... FROM R
1
WHERE condiie
CMINITI
34
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
Costin Ioan George Iulia 15.09.
1981
Lugoj Lugoj, str.
Grii nr. 8
ap.19
tiin-
e Ec.
I 854 2 215 3
Marinesc
u
Liana Lucian Eva 04.11.
1979
Timi-
oara
Timioara,
str.1 Iunie
nr.3
Calcu-
lato-
are
II 130 1 233 1
Ondea Vasile Mihai Aurica 25.10.
1977
Timi-
oara
Timioara,
Cl. agului
nr. 201
tijn-
e Ec.
II 602 2 141 2
Popescu Maria Ion Oana 10.06.
1980
Timi-
oara
Timioara,
str.
A.Vlaicu
nr.7
Calcu-
lato-
are
II 175 1 233 2
Figura 3.11. Rezultatul operaiei SELECT
De exemplu, dac se dorete obinerea unei evidene a studenilor cminiti,
plecnd de la relaia EVIDENA (figura II.1), operaia de extragere poate fi de forma:
CMINITI := SELECT (EVIDENA) (Cminul <> null)
sau
CMINITI := SELECT Numele, Prenumele, Prenumele tatlui,
Prenumele mamei, Data naterii, Locul naterii,
Domiciliul, Facultatea, Anul de studiu, Numr matricol,
Cminul, Camera, Patul
FROM EVIDENA
WHERE Cminul <> null
i rezultatul este ca n Figura 3.11.
Observaie: chiar dac din exemplul indicat nu a rezultat astfel, i operaia SELECT
elimin tuplele duplicate din noua relaie.
Operatorul JOIN (compunere) formeaz o nou relaie prin extragerea
(proiectarea) din dou relaii existente a liniilor care satisfac anumite criterii (condiii).
Formula de definire este:
R
3
:= JOIN (R
1
) (condiie) (R
2
)
De exemplu, dac se dorete obinerea unei evidene a studenilor la
facultile acreditate i care pot da licena n cadrul universitii, folosind relaiile
EVIDENA (figura II.1) i ACREDITARE (figura II.12), atunci operaia de extragere
poate fi de forma:
LICEN PROPRIE := JOIN (EVIDENA) (Facultatea = Denumirea) (ACREDITARE)
ACREDITARE
35
Denumirea Numr act legal Data act legal
tiine Ec. 154 2002
Drept 287 2002
Figura 3.12. Relaia ACREDITARE
i rezultatul obinut este ca n Figura 3.13:
LICEN PROPRIE
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
N
u
m
r
a
c
t
l
e
g
a
l
D
a
t
a
a
c
t
l
e
g
a
l
Costin Ioan Geor-
ge
Iulia 15.09
.1981
Lugoj Lugoj,
str. Grii
nr.8
ap.19
tiine
Ec.
I 854 2 215 3 15
4
2002
On-
dea
Vasile Mihai Aurica 25.10
.1977
Timi-
oara
Timioar
a, Cl.
agului
nr. 201
tijne
Ec.
II 602 2 141 2 15
4
2002
Figura 3.13. Rezultatul operaiei JOIN
unde se observ c noua relaie are gradul 15 (ea a preluat atributele de la ambele
relaii din care s-a format).
Pe lng cei trei operatori prezentai anterior, literatura de specialitate
[POP96] mai ofer posibilitatea de a utiliza urmtoarele aciuni:
Operatorul UNION (reuniune) formeaz o nou relaie prin proiectarea din
dou relaii existente a unei reuniuni a liniilor care satisfac anumite criterii (condiii) i
care pot aparine fie primei relaii, fie celei de-a doua, fie ambelor. Formula de
definire este:
R
3
:= (R
1
) (condiie
1
) UNION (R
2
) (condiie
2
)
sau
R
3
:= SELECT A
1
, A
2
, ... FROM R
1
WHERE condiie
1
UNION
SELECT B, B, ... FROM R WHERE condiie
2
De exemplu, dac se dorete obinerea unei evidene a studenilor i cadrelor
didactice de la aceeai facultate, se folosete operaia de reunire:
R
3
:= SELECT Numele, Prenumele
FROM EVIDENA
WHERE Facultatea = Calculatoare
UNION
SELECT Numele, Prenumele
FROM PROFESORI
WHERE Facultatea = Calculatoare
unde am considerat relaia PROFESORI (Figura 3.15) ca avnd aceeai structur ca
i relaia EVIDENA (Figura 3.14). Rezultatul obinut este o relaie ca n figura II.16.
36
Observaie: relaiile care intervin n operaia UNION trebuie s aib aceeai aritate i
aceeai ordine (nu numele) a atributelor.
EVIDENA (extras) PROFESORI (extras)
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
F
a
c
u
l
t
a
t
e
a
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
F
a
c
u
l
t
a
t
e
a
Costin Ioan George tiine
Ec.
Anton Ileana Marian Calcula
-toare
Marines
cu
Liana Lucian Calcu-
latoare
Achim Silvia Lica Calcu-
latoare
Ondea Vasile Mihai tijne
Ec.
Manea Mihai vasile Psiho-
logie
Popescu Maria Ion Calcu-
latoare
Popesc
u
Maria Ion Calcu-
latoare
Vasiu Bogda
n
Mircea Calcu-
latoare
George Andrei Mihai Drept
Figura 3.14. Relaia EVIDENA Figura 3.15. Relaia EVIDENA
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
F
a
c
u
l
t
a
t
e
a
Marinescu Liana Lucian Calcu-latoare
Popescu Maria Ion Calcu-latoare
Vasiu Bogdan Mircea Calcu-latoare
Anton Ileana Marian Calcula-toare
Achim Silvia Lica Calcu-latoare
Figura 3.16. Relaia R3 la operatorul UNION
Operatorul DIFFERENCE (diferen) formeaz o nou relaie prin
proiectarea din dou relaii existente a liniilor care aparin primei relaii dar nu aparin
celei de-a doua. Formula de definire este:
R
3
:= (R
1
) DIFFERENCE (R
2
)
sau
R
3
:= DIFFERENCE (R
1
, R
2
)
De exemplu, dac se dorete obinerea unei evidene a studenilor care nu
sunt cminiti, plecnd de la relaiile EVIDENA (Figura 3.1) i CMINITI (Figura
3.11), se folosete operaia de diferen:
NECMINITI := DIFFERENCE (EVIDENA, CMINITI)
i se obine relaia din Figura 3.17.
NECMINITI
37
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
Vasiu Bogdan Mircea Floare 24.01
.1981
Rei
a
Reia,
str.
Grii
nr.3
ap.5
Calcu-
latoare
II 188
Figura 3.17. Relaia NECMINITI
Observaie: relaiile care intervin n operaia DIFFERENCE trebuie s aib aceeai
aritate i aceeai ordine a atributelor; numele atributelor nu este important pentru
operator.
Operatorul INTERSECT (intersecie) formeaz o nou relaie prin
proiectarea din dou relaii existente a liniilor care aparin ambelor relaii. Formula de
definire este:
R
3
:= (R
1
) INTERSECT (R
2
)
sau
R
3
:= SELECT A
1
, A
2
, ... FROM R
1
WHERE condiie
1
INTERSECT
SELECT B, B, ... FROM R WHERE condiie
2
De exemplu, dac se dorete obinerea unei evidene a studenilor (figura
II.14) care sunt n acelai timp i cadre didactice (Figura 3.15), se folosete operaia
de intersecie:
R
4
:= SELECT Numele, Prenumele
FROM EVIDENA
INTERSECT
SELECT Numele, Prenumele
FROM PROFESORI
iar rezultatul este ca n Figura 3.18.
Observaie: relaiile care intervin n operaia INTERSECT trebuie s aib aceeai
aritate i aceeai ordine a atributelor; numele atributelor nu este important.
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
F
a
c
u
l
t
a
t
e
a
Popescu Maria Ion Calculatoare
Figura 3.18. Relaia R4 la operatorul INTERSECT
38
Operatorul DIVISION (diviziune) formeaz o nou relaie prin proiectarea din
dou relaii existente a liniilor pentru care valorile atributelor din prima relaie apar n
valorile atributelor celeilalte relaii. Formula de definire este:
R
3
:= (R
1
) DIVISION (R
2
)
sau
R
3
:= DIVISION (R
1
, R
2
)
De exemplu, dac se dorete obinerea unei evidene a studenilor care
parcurg dou cursuri de limbi strine, se folosete operaia de diviziune:
NSCRIERI CURSURI
Numele Prenumele
Numr
matricol
Cod
curs
Cod
curs
Denumire curs
Ionescu Maria 1223 107 107 Engleza
Ionescu Maria 1223 108 108 Germana
Popescu Gheorghe 1245 107
Popescu Gheorghe 1245 108
Vasile Ana 1287 108
Figura 3.19. Operaia DIVISION
DIVISION (NSCRIERE, CURSURI)
care va avea ca rezultat studenii avnd valorile cmpurilor Numele i Prenumele:
Ionescu, Maria respectiv Popescu, Gheorghe.
Operatorul PRODUCT (produs cartezian) formeaz o nou relaie prin
proiectarea din dou relaii existente a liniilor pentru care primele m componente
aparin primei relaii iar celelalte n componente aparin celeilalte relaii, unde m
respectiv n sunt aritile relaiilor. Formula de definire este:
R
3
:= (R
1
) PRODUCT (R
2
)
sau
R
3
:= PRODUCT (R
1
, R
2
)
De exemplu, considernd relaiile EVIDENA i ACREDITARE ca n
exemplele anterioare (figurile II.1 i II.12), o nou relaie se poate scrie prin produsul
lor cartezian:
PRODUCT (EVIDENA, ACREDITARE)
care ar fi un tabel cu 16 coloane (13 de la EVIDENA i 3 din ACREDITARE)
compus prin alturarea celor dou tabele iniiale.
3.1.5 Proiectarea logic
Pentru definirea schemei pentru o BD relaional se utilizeaz un LDD; dac
se utilizeaz (de exemplu) limbajul SQL atunci operaiile de definire a structurii BD
apeleaz la instruciunile CREATE TABLE, EXPAND TABLE i DROP TABLE.
39
Instruciunea CREATE TABLE definete o relaie prin indicarea, pentru
fiecare atribut, a numelui, tipului datei i domeniului, adic:
CREATE TABLE nume_tabel
(A
1
tip
1
(domeniu
1
) [restricie
1
],
A
2
tip
2
(domeniu
2
) [restricie
2
],
.....
A
n
tip
n
(domeniu
n
) [restricie
n
]);
De exemplu, definirea relaiei EVIDENA prezentat anterior se face prin
instruciunea:
CREATE TABLE Evidena
(Numele varchar(20) not null,
Prenumele varchar(20) not null,
Prenumele tatlui varchar(20),
Prenumele mamei varchar(20),
Data naterii date,
Locul naterii varchar(20),
Domiciliul varchar(40),
Facultatea varchar(20) not null,
Anul de studiu number(1),
Numr matricol# number(3) not null primary key,
Cminul number(3),
Camera number(3),
Patul number(3));
Instruciunea EXPAND TABLE (sau ALTER TABLE) adaug la o relaie
existent un nou atribut, prin indicarea numelui, tipului datei i domeniului, adic:
EXPAND TABLE nume_tabel
ADD COLUMN A
n+1
tip
n+1
(domeniu
n+1
) [restricie
n+1
];
sau
ALTER TABLE nume_tabel
ADD COLUMN A
n+1
tip
n+1
(domeniu
n+1
) [restricie
n+1
];
De exemplu, adugarea la relaia EVIDENA prezentat anterior a atributului
Stare Civil se face prin instruciunea:
ALTER TABLE Evidena ADD COLUMN Stare civil char;
Instruciunea DROP TABLE elimin o relaie existent:
DROP TABLE nume_tabel;
Pentru definirea unei vederi a relaiei se utilizeaz instruciunea DEFINE VIEW
(sau CREATE VIEW) cu sintaxa:
DEFINE VIEW AS SELECT A
1
, A
2
, ... FROM relaie [WHERE condiie];
sau
CREATE VIEW AS SELECT A
1
, A
2
, ... FROM relaie [WHERE condiie];
40
De exemplu, pentru a obine situaia studenilor la facultatea de calculatoare
se poate defini vederea:
CREATE VIEW AS SELECT Numele, Prenumele, Anul de studiu
FROM Evidena
WHERE Facultatea = Calculatoare;
Pentru a defini o aseriune despre o cheie a unei relaii se utilizeaz
instruciunea ASSERT cu sintaxa:
ASSERT nume_aseriune ON relaie: atribut condiie,
De exemplu, dac universitatea are trei cmine, se poate defini aseriunea
(care aici este o definire a domeniului):
ASSERT X1 ON Evidena: Cminul BETWEEN 1 AND 3;
Maparea dintr-un model de date logice pe un model relaional este direct
deoarece SGBD relaionale permit efectuarea acestei operaii, cu respectarea
urmtoarelor reguli [DES99]:
entitate este reprezentat de o relaie;
un atribut al unei entiti este reprezentat de un atribut al relaiei;
relaie de conectare este reprezentat prin prezena unui atribut de cheie
strin n relaia fiu.
De exemplu, relaia EVIDENA poate fi mapat astfel:
Faculti (Cod facultate#, Denumire facultate)
Studeni (Numele, Prenumele, Prenumele tatlui, Prenumele mamei, Data naterii,
Locul naterii, Domiciliul, Cod facultate#, Anul de studiu, Numr matricol#)
Cmine (Cminul#, Camera#, Patul#, Cod facultate#, Numr matricol#)
relaiile de conectare ntre atribute sunt:
Este student (Cod facultate#, Denumire facultate, Numr matricol#)
n timp ce relaiile de categorie (mai greu de implementat n modelul relaional) sunt:
St n cmin (Cminul#, Camera#, Patul#, Cod facultate#, Denumire facultate,
Numr matricol#)
St n afar (Domiciliul#, Cod facultate#, Denumire facultate, Numr matricol#)
Modelul relaional respect dependena de identificator dar nu foreaz
restricia de integritate referenial.
3.1.6 Proiectarea fizic
Pentru ca o BD relaional s poat fi implementat fizic, ea trebuie s fie:
translatabil n tabele. Aceasta nseamn s permit utilizarea anumitor
structuri de date pentru fiecare relaie. Cea mai simpl structur este de tip
tabel (tablou) dar pot fi folosite i listele nlnuite, arborii etc., cu condiia ca
indiferent de structura folosit, ea s fie transparent pentru utilizator;
accesibil dup orice atribut. Aceasta nseamn ca utilizatorul s poat cere
acces la orice instan specificnd valoarea oricrui atribut al relaiei, nu
numai dup cheia relaiei;
41
s suporte operatori relaionali. Aceasta nseamn ca structura de date s
suporte operaiile SELECT, PROJECT i JOIN fr ca utilizatorul s utilizeze
explicit operaii de adresare, pointeri sau adrese.
Maparea unei relaii logice ntr-o relaie fizic se poate face prin urmtoarele
operaii:
partiionarea vertical a unei tabele n mai multe relaii de baz, fiecare
coninnd o parte a atributelor iniiale;
partiionarea orizontal a unei tabele n mai multe relaii de baz, fiecare
coninnd o parte a tuplelor iniiale;
reunirea mai multor tabele ntr-o singur relaie de baz.
Partiionarea vertical presupune proiectarea atributelor unei relaii n mai
multe relaii, fiecare dintre acestea coninnd cheia primar pentru a permite
reconstituirea tabelei originale. Operaia se execut atunci cnd tabela are foarte
multe coloane, cnd pri diferite ale aceleiai BD sunt exploatate n locuri de munc
diferite ale aceleiai organizaii, cnd unele coloane sunt actualizate foarte des fa
de altele sau cnd utilizatori cu diferite permisiuni de acces ar trebui s foloseasc
ntreaga BD.
De exemplu, relaia EVIDENA de mai sus poate fi partiionat vertical n
dou relaii, un SECRETARIAT i una ADMINISTRAIE, prima coninnd informaiile
generale despre studeni iar cea de-a doua doar informaiile despre studenii cazai la
cmin (figura 3.20).
Operaia se bazeaz pe instruciunea PROJECT:
Secretariat := PROJECT (Evidena) (Numele; Prenumele; Prenumele tatlui;
Prenumele mamei; Data naterii; Locul naterii; Domiciliul; Facultatea#; Anul de
studiu; Numr matricol#);
EVIDENA
EVIDENA
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
Costin Ioan George Iulia 15.09.
1981
Lugoj Lugoj, str.
Grii nr.8
ap.19
tiine
Ec.
I 854 2 215 3
Marinesc
u
Liana Lucian Eva 04.11.
1979
Timi-
oara
Timioara
str.1 Iunie
nr.3
Calcu-
latoare
II 130 1 233 1
Ondea Vasile Mihai Aurica 25.10.
1977
Timi-
oara
Timioara
Cl.
agului
nr. 201
tijne
Ec.
II 602 2 141 2
Popescu Maria Ion Oana 10.06.
1980
Timi-
oara
Timioara
str.
A.Vlaicu
nr.7
Calcu-
latoare
II 175 1 233 2
Vasiu Bogdan Mircea Floare 24.01.
1981
Reia Reia,
str. Grii
nr.3 ap.5
Calcu-
latoare
II 188
42
SECRETARIAT
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
Costin Ioan George Iulia 15.09.
1981
Lugoj Lugoj, str.
Grii nr.8
ap.19
tiine
Ec.
I 854
Marinescu Liana Lucian Eva 04.11.
1979
Timi-
oara
Timioara,
str.1 Iunie
nr.3
Calcu-
latoare
II 130
Ondea Vasile Mihai Aurica 25.10.
1977
Timi-
oara
Timioara,
Cl. agului
nr. 201
tijne
Ec.
II 602
Popescu Maria Ion Oana 10.06.
1980
Timi-
oara
Timioara,
str.
A.Vlaicu
nr.7
Calcu-
latoare
II 175
Vasiu Bogdan Mircea Floare 24.01.
1981
Reia Reia, str.
Grii nr.3
ap.5
Calcu-
latoare
II 188
ADMINISTRAIE
Facultatea
Numr
matricol#
Cminul Camera Patul
tiine Ec. 854 2 215 3
Calculatoare 130 1 233 1
tijne Ec. 602 2 141 2
Calculatoare 175 1 233 2
Figura 3.20. Partiionarea vertical
Administraie := PROJECT (Evidena) (Facultatea#; Numr matricol#; Cminul;
Camera; Patul);
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
Costin Ioan George Iulia 15.09
1981
Lugoj Lugoj,
str. Grii
nr.8
ap.19
tiine
Ec.
I 854 2 215 3
Marines
cu
Liana Lucian Eva 04.11
1979
Timi-
oara
Timioar
a, str.1
Iunie
nr.3
Calcu-
latoare
II 130 1 233 1
43
Ondea Vasile Mihai Aurica 25.10
1977
Timi-
oara
Timioar
a, Cl.
agului
nr. 201
tijne
Ec.
II 602 2 141 2
Popescu Maria Ion Oana 10.06
1980
Timi-
oara
Timioar
a, str.
A.Vlaicu
nr.7
Calcu-
latoare
II 175 1 233 2
Vasiu Bogdan Mircea Floare 24.01
1981
Rei
a
Reia,
str. Grii
nr.3 ap.5
Calcu-
latoare
II 188
CMINITI
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
Costin Ioan George Iulia 15.09.
1981
Lugoj Lugoj, str.
Grii nr.8
ap.19
tiine
Ec.
I 854 2 215 3
Marinesc
u
Liana Lucian Eva 04.11.
1979
Timi-
oara
Timioara
, str.1
Iunie nr.3
Calcu-
latoare
II 130 1 233 1
Ondea Vasile Mihai Aurica 25.10.
1977
Timi-
oara
Timioara
, Cl.
agului
nr. 201
tijne
Ec.
II 602 2 141 2
Popescu Maria Ion Oana 10.06.
1980
Timi-
oara
Timioara
, str.
A.Vlaicu
nr.7
Calcu-
latoare
II 175 1 233 2
EXTERNI
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
Vasiu Bogdan Mircea Floare 24.01
.1981
Rei
a
Reia, str.
Grii nr.3
ap.5
Calcu
-lato-
are
II 188
Figura 3.21. Partiionarea orizontal
Partiionarea orizontal presupune proiectarea liniilor unei relaii n mai multe
relaii, fiecare dintre acestea coninnd cheia primar pentru a permite reconstituirea
tabelei originale. Operaia se execut atunci cnd tabela are foarte multe linii, cnd
linii diferite ale aceleiai BD sunt exploatate n locuri de munc diferite ale aceleiai
organizaii sau cnd unele linii sunt accesate foarte des fa de altele. Obinerea BD
originale se face prin reunirea BD partiionate.
44
De exemplu, relaia EVIDENA de mai sus poate fi partiionat orizontal n
dou relaii, una CAMINITI i una EXTERNI, prima coninnd informaiile despre
studenii care locuiesc n cmin iar cea de-a doua informaiile despre studenii din
afara cminului (Figura 3.21).
Operaia se bazeaz pe instruciunea SELECT:
Cminiti := SELECT (Evidena) (Cminul <> null);
Externi := SELECT (Evidena) (Cminul = null);
EVIDENA
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
Costin Ioan George Iulia 15.09
.1981
Lugoj Lugoj,
str. Grii
nr.8
ap.19
tiin
e Ec.
I 854 2 215 3
Marines
cu
Liana Lucian Eva 04.11
.1979
Timi-
oara
Timioar
a, str.1
Iunie
nr.3
Calcu
-
latoar
e
II 130 1 233 1
Ondea Vasile Mihai Aurica 25.10
.1977
Timi-
oara
Timioar
a, Cl.
agului
nr. 201
tijn
e Ec.
II 602 2 141 2
Popescu Maria Ion Oana 10.06
.1980
Timi-
oara
Timioar
a, str.
A.Vlaicu
nr.7
Calcu
-
latoar
e
II 175 1 233 2
Vasiu Bogdan Mircea Floare 24.01
.1981
Rei
a
Reia,
str. Grii
nr.3 ap.5
Calcu
-
latoar
e
II 188
TAXE
Facultatea# Numr matricol# Procent achitare
tiine Ec. 854 100
Calculatoare 130 0
tijne Ec. 602 50
Calculatoare 175 100
Calculatoare 188 0
45
ACCEPTARE
N
u
m
e
l
e
P
r
e
n
u
m
e
l
e
P
r
e
n
u
m
e
l
e
t
a
t
l
u
i
P
r
e
n
u
m
e
l
e
m
a
m
e
i
D
a
t
a
n
a
t
e
r
i
i
L
o
c
u
l
n
a
t
e
r
i
i
D
o
m
i
c
i
l
i
u
l
F
a
c
u
l
t
a
t
e
a
A
n
u
l
d
e
s
t
u
d
i
u
N
u
m
r
m
a
t
r
i
c
o
l
#
C
m
i
n
u
l
C
a
m
e
r
a
P
a
t
u
l
P
r
o
c
e
n
t
a
c
h
i
t
a
r
e
Costin Ioan George Iulia 15.09
.1981
Lugoj Lugoj,
str. Grii
nr.8
ap.19
tiine
Ec.
I 854 2 215 3
10
0
Popescu Maria Ion Oana 10.06
.1980
Timi-
oara
Timioar
a, str.
A.Vlaicu
nr.7
Calcu-
latoare
II 175 1 233 2
10
0
Figura 3.22: Reunirea relaiilor
Reunirea relaiilor presupune proiectarea liniilor din mai multe relaii ntr-una singur
care conine atribute extrase din toate relaiile iniiale, cu condiia ca relaiile s aib
un atribut comun. Operaia se execut atunci cnd informaiile respective sunt
accesate de obicei mpreun.
De exemplu, relaia EVIDENA de mai sus poate fi reunit cu relaia TAXE
(Facultatea#, Numr matricol#, Procent achitare) pentru a determina care din
studeni se pot prezenta la examen folosind (Figura 3.22) instruciunea JOIN:
Acceptare := JOIN (Evidena) (Procent achitare = 100) (Taxe)
Este evident c pentru utilizator timpul de acces la informaiile din BD este un
parametru important al eficienei folosirii unui anumit sistem informatic, de aceea
proiectarea fizic trebuie s asigure mbuntirea performanelor.
Accesul la atributele cel mai des folosite trebuie efectuat cu maximum de
vitez, de aceea proiectantul va prevedea ci de acces rapid preconstruite. Tehnicile
care se folosesc sunt cele cu structuri de indeci (se pstreaz localizarea liniilor ce
corespund valorilor indecilor) sau prin hashing pe valorile atributului.
ntr-o BD relaional, pentru atributele de cheie primar trebuie ntotdeauna
ci de acces rapid preconstruite (index) deoarece dup aceste chei se face accesul
n cea mai mare parte a timpului. Pentru atributele de cheie alternat ca i pentru
atributele de cheie strin pot fi construite ci de acces rapid preconstruite.
Uneori, dei ar trebui s existe chei de acces rapid asociate unor atribute,
acest lucru nu se implementeaz; sunt situaiile cnd valorile acestor atribute se
actualizeaz foarte des i deci i indexul sau hashingul se modific permanent.
Reuniunile preconstruite sunt o alt metod de mrire a vitezei de acces la
datele din BD. Tehnicile care se folosesc sunt cele ale directoarelor cu valori atribut-
reuniune (coninnd pointeri la liniile care se reunesc) sau ale listelor nlnuite
(coninnd pointerii de la liniile unei tabele la liniile celeilalte tabele).
De exemplu, se observ din analiza situaiei colare anumite tipare n
alegerea disciplinelor ca n Figura 3.23. Se poate atunci construi o relaie folosind
directoare ca n Figura 3.24 sau folosind liste nlnuite ca n Figura 3.25.
46
LIMBI STRINE SPORT
Genul Disciplina Genul Disciplina
Feminin Francez Feminin Aerobic
Feminin German Feminin not
Masculin Englez Masculin Fotbal
Masculin not
Masculin Schi
Figura 3.23. Relaiile LIMBI STRINE i SPORT
Genul Disciplina-Limba strin Disciplina-Sport
Feminin Francez Aerobic
Feminin Francez not
Feminin German Aerobic
Feminin German not
Masculin Englez Fotbal
Masculin Englez not
Masculin Englez Schi
Figura 3.24. Reuniunile preconstruite reprezentate prin directoare
Genul Disciplina
Primul SPORT cu
valoarea GENUL
Feminin Francez 1
Feminin German 1
Masculin Englez 3
Genul Disciplina
Urmtorul SPORT cu
valoarea GENUL
Feminin Aerobic 2
Feminin not 2
Masculin Fotbal 0
Masculin not 0
Masculin Schi 0
Figura 3.25. Reuniunile preconstruite reprezentate prin liste nlnuite
Gestionarea mrimii buffer-elor este o alt cale de mbuntire a
parametrilor de acces la BD. Cu ct buffer-ul de transfer ntre memoria principal i
cea secundar este mai mare, cu att mai multe linii pot fi accesate simultan fr a
necesita o nou citire a memoriei secundare.
i gruparea relaiilor de baz, adic a acelor relaii care apar cel mai des
ntre informaii, poate aduce rezultate pozitive. Gruparea mpreun a liniilor cu valori
similare ale atributului dup care se face accesul, dup secvena FIFO sau LIFO,
face ca pentru relaia respectiv s nu se pierd timp cu accese multiple la locuri
diferite din BD.
Alegerea corect a dimensiunii fiierelor, care poate fi un impediment
permanent la viteza de execuie a interogrilor, poate ajuta la performanele BD cnd
se fac actualizri masive sau se definesc relaii noi. Dac spaiul ales este prea mic,
eventualele reorganizri necesit timp i consum de resurse; n acelai timp, un
spaiu excesiv nseamn un surplus de plat a unei resurse care nu este utilizat.
47
C CA AP PI IT TO OL LU UL L I IV V
I IM MP PL LE EM ME EN NT TA AR RE EA A A AP PL LI IC CA A I IE EI I
4.1 ARHITECTURA PROGRAMULUI
Aplicaia J_MySQL_win este o interfa Java ce permite accesarea i
manipularea datelor dintr-o baz de date MySQL. Specificaia de proiectare a cuprins
prin urmare cerina de implementare a urmtoarelor operaii:
SELECT * afiarea tuturor datelor din tabel);
SELECT afiarea selectiv dup ID;
INSERT inserarea de nregistrri noi;
DELETE stergerea unor nregistrri.
Figura 4.1. Structura aplicaiei J_MySQL_win
Prin urmare arhitectura programului cuprinde din punct de vedere structural
urmtoarele clase:
J_MySQL_win clasa principala responsabil de afiarea ferestrei
principale cu bara de meniuri i spaiul de afiare a rezultatelor;
Cnx clasa care asigur conexiunea la baza de date apelnd la
pachetele com i org din seciunea insert
Afi clasa care gestioneaz apariia ferestrei secundare de afiaj a
rezultatelor;
Data_sel clasa care pregtete operaiunea de Select i preia
rezultatele acesteia de la Cnx;
Data_get clasa care asigur realizarea inserrii de noi nregistrri prin
preluarea i procesarea comenzii utilizatorului;
48
Data_del clasa care asigur realizarea tergerii unei nregistrri prin
preluarea i procesarea comenzii utilizatorului.
4.2 GHIDUL DE UTILIZATOR
La pornirea programului ferestra principal arat aa cum se prezint n Figura
4.2.
Figura 4.2. Ferestra principal la start
Principalele operaiuni ce se execut cu programul ce face obiectul acestei
lucrri sunt:
SELECT * afiarea tuturor datelor din tabel);
SELECT afiarea selectiv dup ID;
INSERT inserarea de nregistrri noi;
DELETE stergerea unor nregistrri.
Drept urmare consola principal are meniul din Figura 4.3.
Figura 4.3. Meniul din ferestra principal
La alegerea comenzii Select * rezultatele se afieaz n cadrul ferestrei
principale aa cum se poate observa n Figura 4.4.
49
Figura 4.4. Afiarea rezultatelor Select * n ferestra principal
Figura 4.5. Ferestra de dialog preluare date pentru selecie
n cazul n care operaiunea ales este Select apare fereastra de dialog din
Figura 4.5. n care operatorul specific ceea ce va conine condiia de selecie. Toate
condiiile se refer la cmpul ID cheia principal a tabelului.
Rezultatele interogrii anterior definite sunt prezentate n Figura 4.6. Aceste
rezultate sunt plasate n cadrul ferestrei secundare Rezultat selecie.
Figura 4.6. Afiarea rezultatelor Select * n ferestra
50
Inserarea unei noi inregistrri se face prin alegerea comenzii Insert din meniul
Comenzi al ferestrei principale. Urmare acestui fapt pe ecran se afieaz ferestra de
dialog Preluare date din Figura 4.7.
Figura 4.7. Preluarea datelor pentru inserarea unei nregistrri
Rezultatul inserrii se poate verifica prin comanda Select * unde noua
nregistrare apare alaturi de cele anterioare.
tergerea unei inregistrri se face prin alegerea comenzii Delete din meniul
Comenzi al ferestrei principale. Urmare acestui fapt pe ecran se afieaz ferestra de
dialog Preluare date din Figura 4.8.
Figura 4.8. Preluarea datelor pentru tergerea unei nregistrri
Rezultatul tergerii se poate, de asemenea, verifica prin comanda Select * unde
nregistrarea eliminat nu mai apare.
51
C CA AP PI IT TO OL LU UL L V V
C CO ON NC CL LU UZ ZI II I I I P PO OS SI IB BI IL LI IT T I I D DE E D DE EZ ZV VO OL LT TA AR RE E
Aplicaia J_MySQL_win este un program cu scop didactic care furnizeaz
elementele de baz pentru dialogul cu o baz de date MySQL. Avnd n vedere
specificaia iniial a proiectului s-a adoptat soluia simpl a unei interfee consol
cuprinznd att meniul de comenzi ct i spaiul de afiaj pentru Select * (toate
datele).
Aplicaia a fost implementat n limbajul Java deoarece acesta este
independent de platform i permite prin urmare rularea cvasi-identic pe oricare
dintre sistemele de calcul folosite curent.
Programarea orientat pe obiecte este o opiune mai avantajoas dect
programarea procedural, pentru c ferestrele, meniurile, interfeele grafice de
utilizator sunt mult mai uor de implementat prin utilizarea unor clase i familii de
clase predefinite.
Scrierea i testarea programului s-a fcut n Textpad care permite utilizarea
scrierea programelor sub compact. Acest fapt permite compilarea i rularea mai
multor clase din cadrul proiectului ntr-un singur fiier.
Pentru operaiile Select, Insert i Delete s-au implementat ferestre de dialog
care permit o flexibilitate suplimentar n definirea comenzilor respective.
Aplicaia implementat are o funcionare corect i eficient, deoarece codul
scris este compact avnd avantajul c soluioneaz toate cerinele din specificaie
ntr-un mod direct i precis.
O dezvoltare ulterioar a acestei aplicaii ar putea fi introducerea posibilitii ca
ea s fie utilizat n reea de ctre mai muli clieni care s ruleze programul pe
calculatoare diferite. Pentru acest lucru trebuie implementat n program un server i
doi, trei, ... utilizatori separai corespunztori nevoilor aplicaiei.
Posibilitile de dezvoltare ulterioar sunt principial posibile prin ataarea de noi
module funcionale sub forma unor clase sau pachete de clase Java. Dintre aceste
posibile dezvoltri menionez introducerea unei interfee grafice de interaciune cu
operatorul GUI mai sofisticat, a unui Help on line cu explicaii suplimentare.
De asemenea, n cadrul ferestrelor de dialog se poate mri numrul de
elemente de definire a operaiilor aflate la dispoziia utilizatorului astfel nct s se
obin o cretere a flexibilitii funcionale a programului.
52
B BI IB BL LI IO OG GR RA AF FI IE E
1. Connolly T., Begg C., Strachan A., Baze de date, ed Teora
Bucureti 2001
2. DuBois P., MySQL, ed. Teora, Bucureti 2000
3. Greenspan J., Bulger B., MySQL/PHP Databases Application, M&T
Books, Chicago, IL, USA 2002
4. Karnyanszky T.M., Lacrm L.D., Baze de date teorie i aplicaii,
ed. Mirton Timioara, 2003
5. Luers T., Atwood T., Gennick J., PL/SQL, ed. Teora Bucureti 2001
6. Chan M.C., Griffith W.S., Iasi F.A., 1001 de secrete Java ed Teora
Bucureti 2000
7. Lemay L., Cadenhead R., Java 2 fr profesor ed. Teora Bucureti
2001
8. Lalani S., Jamsa K., Java Biblioteca programatorului, ed All
Timioara 1977
9. Lacrm L.D., Programarea orientat pe obiecte ed. Helicon
Timioara 1999
10. Norton P., Stanek W., Limbajul Java ed. Teora Bucureti 1997
53
A An ne ex x
import java.awt.*; // import pachete java.awt
import java.awt.event.*; // java.awt.event
import javax.swing.*;
import java.sql.*; // java.sql
import java.util.*; // si java.util
public class J_MySQL_win extends JFrame implements ActionListener{
// declaratie clasa J_MySQL_win
private MenuBar mb; // bara de meniu
private Menu f; // meniu
private MenuItem o, s, i, d, c; // comenzi meniu
protected static Data_sel ds;
protected static Data_get dg;
protected static Data_del dd;
private Cnx cnx = null; // conexiune la BD
protected static String q = null; // interogare
public J_MySQL_win(){ // metoda constructor J_MySQL_win
setDefaultCloseOperation(EXIT_ON_CLOSE); // iesirea cu X
initComponents (); // apel metoda initializare meniu
}
public void actionPerformed(ActionEvent ev){
Object sr=ev.getSource();
if(sr==o){ // tratarea comenzii Select
q = "SELECT * FROM Job WHERE ID>100" ;// interogare1
nx = new Cnx(); // instantiere conexiune la BD
cnx.connect(); // conectare la BD
repaint(); // afisare rezultate
}
else if(sr==s){ // tratarea comenzii Insert
ds=new Data_sel(); // instantiere fereastra f
ds.setTitle("Preluare date"); // setarea barei de titlu
s.setSize(240,200); // stabilire dimensiuni fereastra
s.setLocation(400,400); // stabilire locatie protected ecran
ds.setVisible(true); // comanda afisare fereastra
}
else if(sr==i){ // tratarea comenzii Insert
dg=new Data_get(); // instantiere fereastra f
.setTitle("Preluare date"); // setarea barei de titlu
g.setSize(240,200); // stabilire dimensiuni fereastra
g.setLocation(400,400); // stabilire locatie protected ecran
g.setVisible(true); // comanda afisare fereastra
}
else if(sr==d){ // tratarea comenzii Delete
d = new Data_del(); // instantiere fereastra f
.setTitle("Preluare date"); // setarea barei de titlu
dd.setSize(240,200); // stabilire dimensiuni fereastra
dd.setLocation(400,400); // stabilire locatie protected ecran
dd.setVisible(true); // comanda afisare fereastra
}
else if(sr==c){ // tratarea comenzii Close
this.dispose(); //eliberare resurse alocate ferestrei
System.exit(1); // iesire din program
54
}
}
private void initComponents(){ // metoda initializare meniu
mb=new MenuBar(); // instantiere bara de meniuri
f= new Menu("Comenzi"); // instantiere meniu "Comenzi"
o= new MenuItem("Select *") // instantiere comanda "Select"
o.addActionListener(this); // alocare actiune
f.add(o);
s= new MenuItem("Select"); // instantiere comanda "Select"
s.addActionListener(this); // alocare actiune f.add(s);
i= new MenuItem("Insert"); // instantiere comanda "Select"
i.addActionListener(this); // alocare actiune
f.add(i); // inserarea comenzii "Select"
in meniul File
d= new MenuItem("Delete"); // instantiere comanda "Select"
d.addActionListener(this); // alocare actiune
f.add(d);
c= new MenuItem("Close"); // instantiere comanda "Close"
c.addActionListener(this); // alocare actiune
f.add(c); // inserarea comenzii "Close" in
meniul File
mb.add(f); // inserare bara in cadru
this.setMenuBar(mb); // stabilire bara de meniuri
}
public void paint(Graphics g){ // metoda paint
g.setColor(Color.white);
g.fillRect(0,0,600,350);
g.setColor(Color.black);
if(q!=null){ // testare existenta interogari
g.drawString("Rezultatul interogarii",30,70); // tiparire
g.drawString(q+" este:",30,85); // interogare si cap de tabel
g.drawString(" ID Nume Prenume Pozitie",30,105);
g.drawString("-------------------------------------------------",30,110);
for(int j=0;j<cnx.i;j++) // tiparire rezultate
g.drawString((String)cnx.getRezult().elementAt(j),30,120 +15*j);
g.drawString("Setul rezultat cuprinde "+cnx.i+" inregistrari",30,130+15*cnx.i);
q=null;
}
else if(dg.q!=null){
g.drawString("Inserarea:",30,70); // tiparire
g.drawString(dg.q,30,85);
g.drawString("a fost executata",30,100);
dg.q = null;
}
else if(dd.q!=null){
g.drawString("Stergerea:",30,70); // tiparire
g.drawString(dd.q,30,85);
g.drawString("a fost executata",30,100);
dd.q = null;
}
}
public static void main(String args[]){ // metoda main
J_MySQL_win f=new J_MySQL_win(); // instantiere fereastra f
f.setTitle("Conexiune cu MySQL"); // setarea barei de titlu
f.setSize(600,350); // stabilire dimensiuni fereastra
f.setLocation(200,200); // stabilire locatie protected ecran
55
f.setVisible(true); // comanda afisare fereastra
}
}
class Afis extends JFrame{
public Afis(){
repaint();
}
public void paint(Graphics g){ // metoda paint
g.setColor(Color.white);
g.fillRect(0,0,600,350);
g.setColor(Color.black);
if(J_MySQL_win.ds.q!=null){ // testare existenta interogari
g.drawString("Rezultatul interogarii",30,70); // tiparire
g.drawString(J_MySQL_win.ds.q+" este:",30,85); // interogare si cap de tabel
g.drawString(" ID Nume Prenume Pozitie",30,105);
g.drawString("-------------------------------------------------",30,110);
for(int j=0;j<J_MySQL_win.ds.cnx.i;j++) // tiparire rezultate
g.drawString((String)J_MySQL_win.ds.cnx.getRezult().elementAt(j),30,120 +15*j);
g.drawString("Setul rezultat cuprinde "+J_MySQL_win.ds.cnx.i+"
inregistrari",30,130+15*J_MySQL_win.ds.cnx.i);
J_MySQL_win.ds.q=null;
}
}
}
class Data_sel extends JFrame implements ActionListener{ // declaratie clasa
Data_del
private Label l,l1;
private TextField t1;
private Button b1;
protected Cnx cnx=null; // conexiune la BD
protected static String q = null; // interogare
public Data_sel(){
setDefaultCloseOperation(EXIT_ON_CLOSE); // iesirea cu X
initComponents();
}
public void initComponents(){
Container c= getContentPane(); // definire container
c.setLayout(null); // setare asezare absoluta
l = new Label("Completati datele si apasati pe buton"); // eticheta
l.setBounds(10,20,360,20); // setare dimensiuni l
c.add(l); // adaugare eticheta l
l1 = new Label("ID:"); // instantiere etichata l1
l1.setBounds(30,40,60,20); // setare dimensiuni l1
c.add(l1); // adaugare eticheta l1
t1 = new TextField(20); // instantiere textfield t1
t1.setBounds(90,40,120,20); // setare dimensiuni t1
t1.setText("<104");
c.add(t1); // adaugare eticheta t1
b1=new Button("Corect"); // instantiere buton b
b1.setBounds(60,80,120,30); // setare dimensiuni b
b1.addActionListener(this); // alocare actiune
c.add(b1); // adugare buton b
}
public void actionPerformed(ActionEvent ev){
Object sr=ev.getSource();
if(sr==b1){ // tratarea comenzii Corect
56
q = "SELECT * FROM Job WHERE ID"+ t1.getText();
// stergere
cnx = new Cnx(); // instantiere conexiune la BD
cnx.connect(); // conectare la BD
Afis a=new Afis(); // instantiere fereastra a
a.setTitle("Rezultat selectie"); // setarea barei de titlu
a.setSize(600,350); // stabilire dimensiuni fereastra
a.setLocation(400,400); // stabilire locatie protected ecran
a.setVisible(true); // comanda afisare fereastra
this.dispose(); // eliberare resurse alocate ferestrei
}
}
}
class Data_get extends JFrame implements ActionListener{ // declaratie clasa
Data_get
private Label l,l1,l2,l3,l4;
private TextField t1,t2,t3,t4;
private Button b1;
private Cnx cnx=null; // conexiune la BD
protected static String q = null; // interogare
public Data_get(){
setDefaultCloseOperation(EXIT_ON_CLOSE); // iesirea cu X
nitComponents();
}
public void initComponents(){
Container c= getContentPane(); // definire container
c.setLayout(null); // setare asezare absoluta
l = new Label("Completati datele si apasati pe buton"); // eticheta
setBounds(10,20,360,20); // setare dimensiuni l
c.add(l); // adaugare eticheta l
l1 = new Label("ID:"); // instantiere etichata l1
l1.setBounds(30,40,60,20); // setare dimensiuni l1
add(l1); // adaugare eticheta l1
t1 = new TextField(20); // instantiere textfield t1
t1.setBounds(90,40,120,20); // setare dimensiuni t1
t1.setText("110");
c.add(t1); // adaugare eticheta t1
l2 = new Label("Nume:"); // instantiere etichata l2
l2.setBounds(30,60,60,20); // setare dimensiuni l2
c.add(l2); // adaugare eticheta l2
t2 = new TextField(20); // instantiere textfield t2
t2.setBounds(90,60,120,20); // setare dimensiuni t2
t2.setText("Popovici");
c.add(t2); // adaugare eticheta t2
l3 = new Label("Prenume:"); ] // instantiere etichata l1
l3.setBounds(30,80,60,20); // setare dimensiuni l1
c.add(l3); // adaugare eticheta l1
t3 = new TextField(20); // instantiere textfield t1
t3.setBounds(90,80,120,20); // setare dimensiuni t1
t3.setText("Radu");
c.add(t3); // adaugare eticheta t1
l4 = new Label("Pozitie:"); // instantiere etichata l2
l4.setBounds(30,100,60,20); // setare dimensiuni l2
c.add(l4); // adaugare eticheta l2
t4 = new TextField(20); // instantiere textfield t2
t4.setBounds(90,100,120,20); // setare dimensiuni t2
57
t4.setText("portar");
c.add(t4); // adaugare eticheta t2
b1=new Button("Corect"); // instantiere buton b
b1.setBounds(60,120,120,30); // setare dimensiuni b
b1.addActionListener(this); // alocare actiune
c.add(b1); // adugare buton b
}
public void actionPerformed(ActionEvent ev){
Object sr=ev.getSource();
if(sr==b1){ // tratarea comenzii Corect
q = "INSERT INTO Job (ID, Nume, Prenume, Pozitie) VALUES ( " +
t1.getText()+", \""+t2.getText()+ "\", \""+t3.getText()+"\", \""+t4.getText()+"\")";
// adaugare
cnx = new Cnx(); // instantiere conexiune la BD
cnx.connect(); // conectare la BD
this.dispose();
}
}
}
class Data_del extends JFrame implements ActionListener{ // declaratie clasa
Data_del
private Label l,l1;
private TextField t1;
private Button b1;
private Cnx cnx=null; // conexiune la BD
protected static String q = null; // interogare
public Data_del(){
setDefaultCloseOperation(EXIT_ON_CLOSE); // iesirea cu X
initComponents();
}
public void initComponents(){
Container c= getContentPane(); // definire container
c.setLayout(null); // setare asezare absoluta
l = new Label("Completati datele si apasati pe buton"); // eticheta
l.setBounds(10,20,360,20); // setare dimensiuni l
c.add(l); // adaugare eticheta l
l1 = new Label("ID:"); // instantiere etichata l1
l1.setBounds(30,40,60,20); // setare dimensiuni l1
c.add(l1); // adaugare eticheta l1
t1 = new TextField(20); // instantiere textfield t1
t1.setBounds(90,40,120,20); // setare dimensiuni t1
t1.setText("110");
c.add(t1); // adaugare eticheta t1
b1=new Button("Corect"); // instantiere buton b1
b1.setBounds(60,80,120,30); // setare dimensiuni b1
b1.addActionListener(this); // alocare actiune
c.add(b1); // adugare buton b
}
public void actionPerformed(ActionEvent ev){
Object sr=ev.getSource();
if(sr==b1){ // tratarea comenzii Corect
q = "DELETE FROM Job WHERE ID="+ t1.getText();
// stergere
cnx = new Cnx(); // instantiere conexiune la BD
58
cnx.connect(); // conectare la BD
this.dispose(); // eliberare resurse alocate ferestrei
}
}
}
class Cnx{ // clasa conexiune la BD
private ResultSet set; // buffer rezultate
private Connection c= null; // conexiunea
private Statement p; // interogarea
private Vector rez = new Vector(); // instantiere vector
protected int i = 0; // contor inregistrari
public Cnx(){ // constructor clasa Cnx
getDriver(); // apel metoda getDriver()
}
public void getDriver(){ // declaratie metoda getDriver()
try{ // testare erori la gasirea
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
}catch (Exception e){ // clasei Driver
System.err.println(e); // mesaj standard de eroare
}
}
public void connect(){ // metda conect
MySQL_win.q!=null) try{ // testare eroare de conectare
c = DriverManager.getConnection("jdbc:mysql: //localhost/Test_cnx","","");
p = c.createStatement(); // propozitie interogare
getData();
}catch(SQLException e){ // exceptie SQL
System.err.println(e); // mesaj standard de eroare
}
else if(J_MySQL_win.ds.q!=null) try{ // testare eroare de conectare
c = DriverManager.getConnection("jdbc:mysql://localhost/Test_cnx","","");
p = c.createStatement(); // propozitie interogare
getData1();
}catch(SQLException e){ // exceptie SQL
System.err.println(e); // mesaj standard de eroare
}
else if(J_MySQL_win.dg.q!=null) try{ // testare eroare de conectare
c = DriverManager.getConnection("jdbc:mysql://localhost/Test_cnx","","");
p = c.createStatement(); // propozitie interogare
addData();
}catch(SQLException e){ // exceptie SQL
System.err.println(e); // mesaj standard de eroare
}
else if(J_MySQL_win.dd.q!=null) try{ // testare eroare de conectare
c = DriverManager.getConnection("jdbc:mysql://localhost/Test_cnx","","");
p = c.createStatement(); // propozitie interogare
deleteData();
}catch(SQLException e){ // exceptie SQL
System.err.println(e); // mesaj standard de eroare
}
}
public void getData(){
try{
set = p.executeQuery(J_MySQL_win.q); // executie
while(set.next()){ // transfer rezultate din
59
i++; // bufferul set in vectorul rez
rez.addElement(set.getString("ID")+" "+set.getString("Nume")+
" "+set.getString("Prenume")+" "+set.getString("Pozitie"));
}
p.close();
c.close(); // inchidere conexiune la BD
}catch(SQLException e){ // exceptie SQL
System.err.println(e); // mesaj standard de eroare
}
}
public void getData1(){
try{
set = p.executeQuery(J_MySQL_win.ds.q); // executie
while(set.next()){ // transfer rezultate din
i++; // bufferul set in vectorul rez
rez.addElement(set.getString("ID")+" "+set.getString("Nume")+
" "+set.getString("Prenume")+" "+set.getString("Pozitie"));
}
p.close();
c.close(); // inchidere conexiune la BD
}catch(SQLException e){ // exceptie SQL
System.err.println(e); // mesaj standard de eroare
}
}
public void addData(){
try{
p.executeUpdate(J_MySQL_win.dg.q); // executie
p.close();
c.close(); // inchidere conexiune la BD
}catch(SQLException e){ // exceptie SQL
System.err.println(e); // mesaj standard de eroare
}
}
public void deleteData(){
try{
p.executeUpdate(J_MySQL_win.dd.q); // executie
p.close();
c.close(); // inchidere conexiune la BD
}catch(SQLException e){ // exceptie SQL
System.err.println(e); // mesaj standard de eroare
}
}
public Vector getRezult(){ // metoda pentu accesarea
return rez; // rezultatelor interogarii
}
}
60
DECLARAIE PE PROPRIE RSPUNDERE
PRIVIND RESPECTAREA DREPTURILOR INTELECTUALE N
ELABORAREA LUCRRII DE LICEN/ DISERTAIE
Subsemnatul/a ______________________________________________________________ ,
legitimat cu BI/CI seria ____ nr. ____________ , CNP ______________________________
autorul lucrrii de licen/disertaie, cu titlul: _______________________________________
_________________________________________________________________________________
_________________________________________________________________________________
avnd conductor tiinific pe __________________________________________________ ,
am elaborate aceast lucrare n vederea susinerii examenului de finalizare a studiilor organizat de
ctre Facultatea de Calculatoare i Informatic Aplicat, din cadrul Universitii Tibiscus din
Timioara, n sesiunea _________________ a anului universitar __________ / _________ ,
declar pe proprie rspundere,
cunoscnd prevederile Codului Penal privind falsul n declaraii, c aceast lucrare este
rezultatul propriei mele activiti intelectuale, nu conine poriuni plagiate, iar sursele
bibliografice au fost folosite cu respectarea legislaiei romne i a conveniilor internaionale
privind drepturile de autor.
Timioara, Semntura,
__________________________ __________________________
(data)