Sunteți pe pagina 1din 26

Universitatea din Bucuresti

Facultatea de Matematica-Informatica
Departamentul de Tehnologii
Specializarea: Tehnologia Informatiei





















Bucuresti 2011
Proiectarea
bazelor de date



Cuprins

I. Introducere in Proiectarea Bazelor de Date
II. Prezentarea modelului si a regulilor acestuia .
1. Notiuni generale
2.Prezentarea modelului firmei de inchirieri autovehicule g3o Car Rental
III. Diagrama E/R ....................
1. Prezentare
2. Reguli pentru proiectarea diagramei Entitate-Relatie (E/R)
3. Algoritmul pentru proiectarea diagramei entitate-relatie
4. Descrierea diagramei entitate-relatie
5. Relatiile intre entitati. Gradul si cardinalitatea unei relatii
IV. Diagrama conceputala......................
1. Descriere
2. Cheile primare
3. Cheile externe (straine)
V. Schema relationala
VI. Algebra relationala .........................................................................................
1. Prezentare
2. Operatorul PROJECT
3. Operatorul SELECT
4. Operatorul UNION
5. Operatorul INTERSECT
7. Operatorul PRODUCT
8. Operatorul DIVISION
9. Operatorul JOIN NATURAL JOIN, -JOIN, SEMI-JOIN, OUTERJOIN
VII. Normalizarea datelor .....................................................................................





I. Introducere in Proiectarea Bazelor de Date

La inceput, calculatoarele au fost utilizate numai pentru calcule aritmetice. Prin cresterea vitezei de
calcul, prin cresterea de memorare a datelor, prin adaugarea unor noi componente performante de
intrare - iesire, prin dezvoltarea unor limbaje de programare s-a ajuns acum la prelucrarea intr-un timp
scurt a unei mari cantitati de informatii. Organizarea si gestionarea acestor informatii se face la nivelul
bazelor de date.
O baza de date, uneori numita si "banca de date", contine toate informatiile necesare despre obiectele
ce intervin intr-o multime de aplicatii, relatiile logice intre aceste informatii si tehnici de prelucrare
corespunzatoare. In bazele de date are loc o integrare a datelor, in sensul ca mai multe fisiere sunt
privite in ansamblu, eliminandu-se pe cat posibil informatiile redundante. De asemenea, se permite
accesul simultan la aceleasi date, situate in acelasi loc sau distribuite spatial, a mai multor persoane de
pregatiri diferite, fiecare cu stilul personal de lucru, cu posibilitatea regasirii rapide a acestora.
Cel mai raspandit tip de baze de date este cel relational, in care datele sunt memorate in tabele. Pe langa
tabele, o baza de date relationala mai poate contine: indecsi, proceduri stocate, declansatori, utilizatori
si grupuri de utilizatori, tipuri de date, mecanisme de securitate si de gestiune a tranzactiilor etc.
Sistemul de structurare a datelor care intervine cel mai frecvent este tabelul, iar in cazul volumelor mari
vorbim depre baze de date.
Exemplul tipic, intuitiv si putin mai simplu, este cel al organizarii cartilor intr-o biblioteca. Asa numitul
catalog care ne permite noua sau bibliotecarului sa gasim cartea dorita, pornind doar de la titlul ei, de la
numele autorului sau chiar de la cateva alte indicii mai marunte.

Proiectarea unei baze de date
Proiectarea bazelor de date presupune fixarea structurii bazei de date si a metodelor de prelucrare a
datelor. Daca in mod obisnuit bazele de date isi schimba frecvent continutul, structura bazei de date
ramane nemodificata pe lungi perioade de timp.
Prin proiectare se determina modul semantic care sa reflecte cat mai fidel posibil lumea reala, construita
astfel :
- se identifica o multime de concepte semantice(entitati, tipuri de entitati, proprietati ale entitatilor,
indicatori, relatii intre entitati) ce dau informatii despre lumea reala;
- se asociaza obiecte simbolice prin care sunt reprezentate conceptele semantice;
- se defineste o multime de operatori ce pot sa transforme obiectele simbolice.



Etapele construirii unei baze de date :

- studiul de fezabilitate ce consta in cercetarea sistemala existenta si evaluarea costurilor pe diversele
alternative;
- cercetarea sistemului existent (tipuri de date, dimensiuni);
- analiza sistemului si proiectarea sistemului;
- dezvoltarea sistemului;
- implementarea sistemului;
- revizuire si intretinere.

Problemele Proiectarii Bazelor de Date
Construirea unei aplicatii care sa manipuleze informatii dintr-o baza de date presupune atat intelegerea
principiilor de organizare a bazelor de date, a limbajului SQL, dar si observarea atenta a structurii de date
in discutie, a cerintelor si a tipului clientilor, a specificului informatiilor (frecventa de modificare,
complexitatea, tipul frecvent de cautari - selectii, dimensiunea estimata a bazei de date ... cautand
modalitatea de a grupa datele pentru o cat mai eficienta manevrare, dar si pentru a le asigura o cat mai
buna protectie.
Baza de date poate fi organizata ca un singur tabel de mari dimensiuni, sau ca un set de tabele mici, care
sunt legate dupa o schema pe care proiectantul trebuie sa o aleaga si s-o impuna. Tot o baza de date
relationala va rezulta, uneori clientul nici nu va sesiza diferenta, beneficiarul principal al unei organizari
judicioase fiind administratorul bazei de date.









II. Prezentarea modelului si a regulilor acestuia
1. Notiuni generale
O baza de date reprezinta un ansamblu de date integrat, anume structurat si dotat cu o
descriere a acestei structuri. Descrierea structurii poarta numele de dictionar de date sau
metadate si creaza o interdependenta intre datele propriu-zise si programe. Baza de date poate
fi privita ca o colectie de fisiere interconectate care contin nucleul de date necesare unui sistem
informatic. Astfel, poate fi considerata drept un model al unor aspecte ale realitatii unei unitati
economice, modelata prin intermediul datelor. Diferitele obiecte din cadrul realitatii ce prezinta
interes sunt denumite clase sau entitati. Pentru aceste obiecte sunt achizitionate si memorate
date referitoare la diferite caracteristici (atribute).
Baza de date se constituie ca un ansamblu intercorelat de colectii de date, prin care se
realizeaza reprezentarea unei realitati.

2. Prezentarea modelului firmei de inchirieri autovehicule g3o Car Rental
Exemplul bazei de date prezentat in acest proiect se refera la un model de gestiune al unei firme
de inchirieri autovehicule, intitulata fictiv g3o Car Rental. Modelul analizat prezinta aspecte
privind modul de functionare si administrare al firmei.
Baza de date are ca scop simplificarea managementului datelor firmei de inchirieri, oferind un
mod centralizat de stocare a datelor si acces rapid la informatiile dorite. Baza de date cuprinde
date despre angajatii sucursalelor, departementul unde lucreaza acestia in cadrul sucursalei,
clienti, rezervarile si inchirierile acestora si date despre parcul de autovehicule.
Firma are in orasele mari din tara una sau mai multe sucursale (de exemplu in Bucuresti are 6
sucursale, una in fiecare sector; iar in Timisoara doar una). Un client, o persoana fizica sau
juridicava fi inscrisa la o singura sucursala (prima la care va face o inchiriere/rezervare). Clientul
poate face rezervari asupra unor vehicule si poate inchiria unul sau mai multe vehicule. Pentru
fiecare serviciu de inchiriere se va emite o factura clientului. Clientul are dreptul de a face
reclamatii asupra serviciilor prestate de sucursala. Vehiculele apartin sucursalei si vor fi reparate
in service-uri cu care sucursala are contract.
In baza de date vor fi retinute date privind evidenta angajatilor (nume , prenume, adresa etc.) si
a vehiculelor (numar de inmatriculare, marca, model, asigurare etc.).


III. Diagrama Entitate-Relatie (Diagrama E/R)

1. Prezentare
Diagrama E/R reprezinta un model neformalizat pentru reprezentarea unui sistem din lumea
reala. Este um model de date conceptual d enivel inalt, dezvoltat de Chen (1976), pentru a
facilita proiectarea bazelor de date. O diagrama E/R este reprezentarea grafica a unei colectii
de entitati, relatii, constrangeri, conditionari etc, care descriu complet o baza de date.

2. Reguli pentru proiectarea diagramei Entitate-Relatie (E/R):
Pentru proiectarea diagramei entitate-relatie au fost stabilite anumite reguli:
1). Entitatile sunt reprezentate prin dreptunghiuri;
2). Relatiile dintre entitati sunt reprezentate prin arce neorientate;
3). Atributele care reprezinta chei primare trebuie marcate prin simbolul #, plasat la sfarsitul
numelui acestor atribute;
4). Cardinalitatea minima este indicata in paranteze, iar cea maxima se scrie fara paranteze;
5). Nu trebuie specificate toate atributele.

3. Algoritmul pentru proiectarea diagramei entitate-relatie:
1). Identificarea entitatilor din cadrul sistemului analizat;
2). Identificarea relatiilor dintre entitati si stabilirea cardinalitatii;
3). Identificarea atributelor aferente entitatilor si asocierilor dintre entitati;
4). Stabilirea atributelor de identificare a entitatilor (stabilirea cheilor).




Figura 1.1 Diagrama E/R (simpla, doar cu chei primare)
























M(1)
M
(
0
)
M
(
0
)











r
e
c
l
a
m
a

M(1)
M(1)
1




















1














a
p
a
r
t
i
n
e

M(1) 1
are
apartine
a
r
e

a
r
e

M
(
1
)







1











i
n
s
c
r
i
s

l
a

M(1)
M(0) M(0)
reparat in
re
pa
ra
1












M
(
1
)





a
r
e

c
o
n
t
r
a
c
t

l
u
c
r
e
a
z
a

c
u

inc
hiri
aza
1















M
(
1
)

















a
r
e

l
u
c
r
e
a
z
a

l
a

1M(1)
are
apartine
SERVICE
id_service#
DEPARTAMENT
id_departament#
ANGAJAT
cnp#
SUCURSALA
id_sucursala#
VEHICUL
nr_inmatriculare#
ASIGURARE
cod_asigurare#
nr_inmatriculare#
FACTURA
cod_factura#

CLIENT
id_client#

PERSOANA FIZICA
nume
prenume
PERSOANA JURIDICA
tip_juridic
nume
conduce
1
M(1)
re
ze
rv
a
re
ze
rv
at
de
r
e
c
l
a
m
a
t
a

d
e

Figura 1.2 Diagrama E/R





























M(1)
M
(
0
)
M
(
0
)











r
e
c
l
a
m
a

M(1)
M(1)
1




















1














a
p
a
r
t
i
n
e

M(1) 1
are
apartine
a
r
e

a
r
e

M
(
1
)







1











a
p
a
r
t
i
n
e

M(1)
M(0) M(0)
reparat in
re
pa
ra
1












M
(
1
)





a
r
e

c
o
n
t
r
a
c
t

l
u
c
r
e
a
z
a

c
u

inc
hiri
aza
1















M
(
1
)

















a
r
e

l
u
c
r
e
a
z
a

l
a

1M(1)
are
apartine
SERVICE
id_service#
*nume_service
*adresa
*telefon
email
reprezentanta
DEPARTAMENT
id_departament#
*nume
*email
ANGAJAT
cnp#
*nume
*prenume
*adresa
*telefon
email
*functie
*salariu
SUCURSALA
id_sucursala#
*adresa
*telefon
*pagina_web
VEHICUL
nr_inmatriculare#
*marca
*model_v
*an_fabricatie
*tip_vehicul
*nr_locuri
*masa_proprie
*masa_maxima_autorizata
*combustibil
*capacitate_cilindrica
*putere
ASIGURARE
cod_asigurare#
nr_inmatriculare#
*asigurator
*data_emitere_polita_asigurare
*data_expirare_polita_asigurare
FACTURA
cod_factura#
*data_emitere
*valoare_factura
*procent_TVA
*modalitate_plata

CLIENT
id_client#
*adresa
*telefon
*fax
email

PERSOANA FIZICA
*nume
*prenume
*cnp
*serie_BI
*nr_BI

PERSOANA JURIDICA
*denumire
*tip_juridic
cod_IBAN
*cod_CUI
pagina_web

conduce
1
M(1)
re
ze
rv
a
re
ze
rv
at
de
r
e
c
l
a
m
a
t
a

d
e

4. Descrierea diagramei entitate-relatie:
Entitatile care intervin in acest model sunt urmatoarele:
a).SUCURSALA(entitate independenta) sucursala caruia ii apartine angajatul si unde clientii
sunt inscrisi la prima inchiriere/rezervare. Atributele principale sunt: id_sucursala, adresa,
telefon, pagina_web. Cheia primara este atributul id_sucursala.
b).DEPARTAMENT(entitate independenta) departamentul in care lucreaza angajatul.
Atributele principale sunt: id_departament, nume, email. Cheia primara este atributul
id_departament.
c).VEHICUL (entitate independenta) orice vehicul care poate fi inchiriat sau rezervat. Atributele
principale sunt: nr_inmatriculare, marca, model_v,an_fabricatie, tip_vehicul, nr_locuri,
masa_proprie, masa_maxima_autorizata, combustibil, capacitate_cilindrica, putere. Cheia
primara este atributul nr_inmatriculare.
d).ASIGURARE (entitate dependenta) asigurarea obligatorie pentru orice vehicul care apartine
unei sucursale. Atributele principale sunt: nr_inmatriculare, cod_asigurare, asigurator,
data_emitere_polita_asigurare, data_expirare_polita_asigurare. Cheia primara compusa din
atributele nr_inmatriculare si cod_asigurare.
e).SERVICE(entitate independenta) service-urile cu care are contract sucursala si in care se
executa reparatiile la vehicule. Atributele principale sunt: id_service, nume_service, adresa,
telefon, email, reprezentanta. Cheia primara este atributul id_service.
f).ANGAJAT (entitate independenta) orice persoana care lucreaza in cadrul unui departament
dintr-o sucursala. Atributele principale sunt: cnp, nume, prenume, adresa, telefon, email,
functie, salariu, id_sef. Cheia primara este atributul cnp.
g).CLIENT (entitate independenta) orice persoana fizica sau juridica care rezerva si/sau
inchiriaza un vehicul. Atributele principale sunt: id_client, adresa, telefon, fax, email. Atributele
secundare se impart in functie de tipul persoanei (fizica sau juridica) astfel:
-pentru o persoana fizicaatributele sunt: nume, prenume, cnp, serie_BI, nr_BI.
-pentru o persoana juridica atributele sunt: denumire, tip_juridic, cod_CUI, cod_IBAN,
pagina_web.
Cheia primara este atributul id_client.
h).FACTURA (entitate independenta) - facturile ce clientul o va primii pentru serviciul prestat de
catre firma. Atributle principale sunt: cod_factura, data_emitere, valoare_factura,
modalitate_plata, procent_TVA. Cheia primara este atributul cod_factura.

5. Relatiile intre entitati. Gradul si cardinalitatea unei relatii

Im conformitate cu regulile de proiectare a diagramei E/R a modelului, cardinalitatea minima
este indicata in paranteze, iar cardinalitatea maxima se scrie fara paranteze. Relatiile se clasifica
in functie de cardinalitate in: relatii one to one (1:1), relatii one to many (1:M) si relatii many to
many (M:M). O relatie este descrisa prin 2 atribute, in functie de cum se va citi relatia respectiva
(Ex: ASIGURARE_apartine_VEHICUL sau VEHICUL_are_ASIGURARE).

Cu privire la relatiile din model se pot face urmatoarele observatii:
Relatia ASIGURARE_apartine_VEHICULeste o relatie one-to-one (1:1) cu cardinalitatea minima
1-1. Cardinalitatea a fost dedusa astfel: un vehicul are o singura asigurare; o asigurare apartine
unei singure masini.
Relatia CLIENT_inchiriaza_VEHICUL este o relatie many-to-many (M:M) de tip 3 (intre entitatile
vehicul, client si factura) cu cardinalitatea minima 1-1.
Relatia CLIENT_rezerva_VEHICUL este o relatie many-to-many (M:M) cu cardinalitatea minima
1-1. Cardinalitatea a fost dedusa astfel: un client poate rezerva unul sau mai multe vehicule; un
vehicul poate fi rezervat de unul sau mai multi clienti.
Relatia CLIENT_reclama_SUCURSALA este o relatie many-to-many (M:M) cu cardinalitatea
minima 0-0. Cardinalitatea a fost dedusa astfel: o sucursala poate avea mai multe reclamatii
minim 0; un client poate face mai multe reclamatii minim 0.
Relatia SUCURSALA_are_CLIENT este o relatie one-to-many (1:M) cu cardinalitatea minima 1-1.
Cardinalitatea a fost dedusa astfel: o sucursala are unul sau mai multi clienti; un client este
inscris la o singura sucursala.
Relatia SUCURSALA_are_VEHICUL este o relatie one-to-many (1:M) cu cardinalitatea minima 1-
1. Cardinalitatea a fost dedusa astfel: o sucursala are unul sau mai multi vehicule; un vehicul
apartine unei singure sucursale.
Relatia SUCURSALA_are_DEPARTAMENT este o relatie one-to-many (1:M) cu cardinalitatea
minima 1-1. Cardinalitatea a fost dedusa astfel: o sucursala are unul sau mai multe
departamente; un departament apartine unei singure sucursale.


Relatia SUCURSALA_are_contract_cu_SERVICE este o relatie one to many (1:M) cu cardinalitatea
minima 1-1. Cardinalitatea a fost dedusa astfel: o sucursala are contract cu unul sau mai multe
service-uri; un service lucreaza cu o singura sucursala.
Relatia SERVICE_repara_VEHICUL este o relatie many to many (M:M) cu cardinalitatea minima
0-0. Cardinalitatea o fost dedusa astfel: un service repara unul sau mai multe vehicule; un
vehicul reparat intr-unul sau mai multe service-uri. Cardinalitatea minima este 0 cand un vehicul
nu sufera reparatii.
Relatia DEPARTAMENT_are_ANGAJATeste o relatie one to many (1:M) cu cardinalitatea minima
1-1. Cardinalitatea a fost dedusa astfel: o sucursala are unul sau mai multe departamente; un
departament unei singure sucursale.
Relatia ANGAJAT_conduce_ANGAJAT este o relatie recursiva si are cardinalitatea maxima one to
many (1:M) iar cea minima este 1-1. Cardinalitatea a fost dedusa astfel: un angajat poate fi
condus de un angajat, un angajat conduce unul sau mai multi angajati.


IV. Diagrama conceptuala

1. Descriere
Diagrama conceptuala pentru proiectarea modelului ales a fost construita din diagrama E/R prin
adaugarea tabelelor asociative si prin marcarea cheilor externe.
Transformarea relatiilor se face astfel:
Relatiile 1:1 si 1:M devin chei externe. Simbolul X indica plasamentul cheii externe, iar
simbolul X exprima faptul ca aceasta cheie externa este continuta in cheia primara.
Relatia 1:1 plaseaza cheia externa in tabelul cu mai putine linii.
Relatia M:M devine un tabel special, numit tabel asociativ, care are doua chei externe
pentru cele doua tabele asociate. Cheia primara este compunerea acestor doua chei
externe plus eventuale coloane aditionale. Tabelul asociativ se deseneaza punctat.

Relatiile de tip trei devin tabele asociative. Cheia primara este compunerea a trei chei
externe plus eventuale coloane aditionale.

Transformare entitatilor se face astfel:

Entitatile independente devin tabele independente. Cheia primara nu contine chei
externe.

Entitatile dependente devin tabele dependente. Cheia primara a entitatilor dependente
contine cheia primara a entitatii de care depinde (cheie externa) plus unul sau mai multe
atribute aditionale.

Subentitatile devin subtabele. Cheia externa se refera la supertabel, iar cheia primara
este aceasta cheie externa.

Transformarea atributelor se face astfel:
Un atribut singular devine o coloana.

Atributele multiple devin tabele dependendente ce contin cheia primara a entitatii si
atributul multiplu. Cheia primara este o cheie externa, plus una sau mai multe coloane
aditionale.

Entitatile devin tabele, iar atributele lor devin coloane in aceste tabele. Pentru relatii 1:1
si 1:n, atributele relatiilor vor apartine tabelului care contine cheia externa, iar pentru
relatii m:m si de tipul trei, atributele vor fi plasate in tabelele asociative.


















Figura 2. Diagrama conceptuala (doar cu chei primare si chei straine)






























































l
u
c
r
e
a
z
a

l
a

INCHIRIERE
#cod_inchiriere(PK)
*id_client(FK)
*nr_inmatriculare(FK)
*cod_factura(FK)
REPARATIE
#cod_reparatie(PK)
*id_serviceFK)
*nr_inmatriculare(FK)
SERVICE
#id_service(PK)
*id_sucursala(FK)
DEPARTAMENT
#id_departament(PK)
*id_sucursala(FK)
ANGAJAT
#cnp(PK)
*id_departament(FK)
*id_sef(FK)
RECLAMATIE
#cod_reclamatie(PK)
*id_sucursala(FK)
*id_client(FK)
SUCURSALA
#id_sucursala(PK)
VEHICUL
#nr_inmatriculare(PK)
*id_sucursala(FK)
ASIGURARE
#cod_asigurare(PK)
#nr_inmatriculare(PK&FK)
FACTURA
#cod_factura(PK)

CLIENT
#id_client(PK)
*id_sucursala(FK)

PERSOANA FIZICA

nume
prenume
PERSOANA JURIDICA

tip_juridic
denumire
REZERVARE
#cod_rezervare(PK)
*id_client(FK)
*nr_inmatriculare(FK)
apartine
ap
ar
tin
e
Inscris la
apartine
apartine
apartine
apartine
conduce
lucreaza cu
executata de
face
are
are
apartine de
face
2. Cheile primare


Cheia primara:
-trebuie sa fie unica si cunoscuta la orice moment;
-trebuie sa fie controlata de administratorul bazei;
-trebuie sa nu contina informatii descriptive, sa fie simpla, fara ambiguitati;
-sa fie stabila;
-sa fie familiara utilizatorului.

Cu privire la cheile primare dim model se pot face urmatoarele observatii:

TabelulSUCURSALA are ca si cheie primara atributul id_sucursala. Acesta are rolul de a identifica
in mod unic fiecare sucursala in parte. Este de tip numeric intreg de 2 cifre [number(2)].

TabelulASIGURARE, fiind un tabel dependent, are cheia primara compusa din 2 atribute:
cod_asigurare si nr_inmatriculare. Aceasta cheie compusa are rolul de a identifica in mod unic o
asigurare, ce depinde de un anumitvehicul. Cod_asigurare este de tip numeric intreg de 8 cifre
[number(8)] iar nr_inmatriculare este de tip sir de caractere cu o lungime maxima de 8
caractere [varchar2(8)].

TabelulFACTURA are ca si cheie primara atributul cod_factura. Acesta are rolul de a identifica in
mod unic fiecare factura in parte. Este de tip numeric intreg de 8 cifre [number(8)].

TabelulVEHICUL are ca si cheie primara atributul nr_inmatriculare. Acesta are rolul de a
identifica in mod unic fiecare vehicul in parte. Este de tip sir de caractere cu o lungime maxima
de 8 caractere [varchar2(8)].

TabelulCLIENTeste un supertabel ce are ca si cheie primara atributul id_client. Acesta are rolul
de a identifica in mod unic fiecare client (persoana fizica sau juridica) in parte. Este de tip
numeric intreg de 8 cifre [number(8)].

TabelulDEPARTAMENT are ca si cheie primara atributul id_departament. Acesta are rolul de a
identifica in mod unic fiecare departament in parte. Este de tip numeric intreg de 3 cifre
[number(3)].

TabelulANGAJAT are ca si cheie primara atributul cnp. Acesta are rolul de a identifica in mod
unic fiecare angajat in parte. Este de tip numeric intreg de 13 cifre [number(13)].

TabelulSERVICE are ca si cheie primara atributul id_service. Acesta are rolul de a identifica in
mod unic fiecare service in parte. Este de tip numeric intreg de 3 cifre [number(3)].

Tabelul REPARATIE este un tabel asociativ ce are ca si cheie primara artiiciala atributul
id_reparatie. Acesta are rolul de a identifica in mod unic fiecare reparatie in parte. Este de tip
numeric intreg de 6 cifre [number(6)].

Tabelul RECLAMATIE este un tabel asociativ ce are ca si cheie primara artificiala atributul
id_reclamatie. Acesta are rolul de a identifica in mod unic fiecare reclamatie in parte. Este de tip
numeric intreg de 6 cifre [number(6)].

Tabelul REZERVARE este un tabel asociativ ce are ca si cheie primara artificiala atributul
id_rezervare. Acesta are rolul de a identifica in mod unic fiecare rezervare in parte. Este de tip
numeric intreg de 8 cifre [number(8)].

Tabelul INCHIRIERE este un tabel asociativ ce are ca si cheie primara artificiala atributul
id_inchiriere. Acesta are rolul de a identifica in mod unic fiecare inchiriere in parte. Este de tip
numeric intreg de 8 cifre [number(8)].

Tabelul PERSOANA_FIZICA este un subtabel ce are cheie primara atributul id_client. Este de tip
numeric intreg de 8 cifre [number(8)].

Tabelul PERSOANA_JURIDICA este un subtabel ce are cheie primara atributul id_client. Este de
tip numeric intreg de 8 cifre [number(8)].




3. Cheile externe (straine)

Tabelul ASIGURARE fiind tabel dependent, are o cheie straina (nr_inmatriculare) care face parte
din cheia primara. Atributul nr_inmatriculare este de tip sir de caractere cu o lungime maxima
de 8 caractere [varchar2(8)].

Tabelul ANGAJAT are 2 chei straine care au rolul de a realiza legatura ANGAJAT-ANGAJAT si
legatura DEPARTAMENT-ANGAJAT. Atributul id_departament este de tip numeric intreg de 3
cifre [number(3)] iar atributul sef_id este de tip numeric intreg de 13 cifre [number(13)].

Tabelul CLIENT are o cheie straina (id_sucursala) care are rolul de a realiza legatura SUCURSALA-
CLIENT. Atributul id_sucursala este de tip numeric intreg de 2 cifre [number(2)].

Tabelul DEPARTAMENT are o cheie straina (id_sucursala) care are rolul de a realiza legatura
SUCURSALA- DEPARTAMENT. Atributul id_sucursala este de tip numeric intreg de 2 cifre
[number(2)].




Tabelul INCHIRIERE este un tabel asociativ si are 3 chei straine pentru a indeplinii relatia de tip 3
dintre tabelele VEHICUL , FACTURA si CLIENT. Atributul id_client este de tip numeric intreg de 8
cifre [number(8)] , nr_inmatriculare este de tip sir de caractere cu o lungime maxima de 8
caractere [varchar2(8)] si cod_factura este de tip numeric intreg de 8 cifre [number(8)].


Tabelul RECLAMATIE este un tabel asociativ si are 2 chei straine pentru a indeplinii relatia many
to many intre tabelele SUCURSALA si CLIENT. Atributul id_client este de tip numeric intreg de 8
cifre [number(8)] iar id_sucursala este de tip numeric intreg de 2 cifre [number(2)].


Tabelul REPARATIEeste un tabel asociativ si are 2 chei straine pentru a indeplinii relatia many to
many intre tabelele SERVICE si CLIENT. Atributul id_service este de tip numeric intreg de 3 cifre
[number(3)] si atributul nr_inmatriculare este de tip sir de caractere cu o lungime maxima de 8
caractere [varchar2(8)].


Tabelul REZERVARE este un tabel asociativ si are 2 chei straine pentru a indeplinii relatia many
to many intre tebelele VEHICUL si VEHICUL. Atributul id_client este de tip numeric intreg de 8
cifre [number(8)] iar nr_inmatriculare este de tip sir de caractere cu o lungime maxima de 8
caractere [varchar2(8)].


Tabelul SERVICE are o cheie straina (id_sucursala) care are rolul de a realiza legatura
SUCURSALA-SERVICE. Atributul id_sucursala este de tip numeric intreg de 2 cifre [number(2)].


Tabelul VEHICUL are o cheie straina (id_sucursala) care are rolul de a realiza legatura
SUCURSALA-VEHICUL. Atributul id_sucursala este de tip numeric intreg de 2 cifre [number(2)].


Tabelul PERSOANA_FIZICA este un subtabel ce are cheie externa atributul id_client. Este de tip
numeric intreg de 8 cifre [number(8)].


Tabelul PERSOANA_JURIDICA este un subtabel ce are cheie externa atributul id_client. Este de
tip numeric intreg de 8 cifre [number(8)].






V. Schema relationala

Schemele relationale includ cheile primare, cheile straine si celelelte atribute ale fiecarui tabel.
Pentru diagrama conceptuala a modelului ales avem urmatoarele scheme relationale:

SUCURSALA (id_sucursala#, adresa, telefon, pagina_web)

SERVICE (id_service#, id_sucursala, nume_service, adresa, telefon, email, reprezentanta)

REPARATIE (id_reparatie#, id_service, nr_inmatriculare, tip, valoare, data_inceperii,
data_finalizarii)

VEHICUL (nr_inmatriculare#, id_sucursala, marca, model_v, an_fabricatie, tip_vehicul,
nr_locuri, masa_proprie, masa_maxima_autorizata, combustibil, capacitate_cilindrica, putere)

ASIGURARE (nr_inmatriculare#, cod_asigurare#, asigurator, data_emitere_polita_asigurare,
data_expirare_polita_asigurare)

INCHIRIERE (id_inchiriere#, nr_inmatriculare, id_client, cod_factura, data_preluare_vehicul,
data_retur_vehicul)

REZERVARE (id_rezervare#, nr_inmatriculare, id_client, data_incepere_rezervare,
data_finalizare_rezervare)

FACTURA (cod_factura#, data_emitere, valoare_factura, modalitate_plata , procent_TVA)

ANGAJAT (cnp#, nume, prenume, adresa, telefon, email, functie, salariu, id_departament,
id_sef)

DEPARTAMENT (id_departament#, id_sucursala, nume, email)

RECLAMATIE (id_reclamatie#, id_sucursala, id_client, data_depunere, text)

CLIENT (id_client#, id_sucursala, adresa, telefon, fax, email)

PERSOANA_FIZICA (id_client#, nume, prenume, cnp, serie_BI, numar_BI)

PERSOANA_JURIDICA (id_client#, denumire, tip_juridic, cod_IBAN, cod_CUI, pagina_web)






VI. Algebra relationala

1. Prezentare

Algebra relationala a fost introdusa de E.F. Codd ca o multime de operatii formale actionand
asupra unor relatii si avand ca rezultat alte relatii. Baza teoretica pentru limbajele de interogare
relationale o constituie operatorii introdusi de Codd pentru prelucrarea relatiilor.

Scopul fundamental al algebrei relationale este de a permite scrierea expresiilor relationale.
Expresiile servesc ca o reprezentare de nivel superior, simbolica, a intentiilor utilizatorului.

Operatorii algebrei relationale sunt:
operatori traditionali pe multimi (UNION, INTERSECT, PRODUCT, DIFFERENCE);
operatori relationali speciali (PROJECT, SELECT, JOIN, DIVISION).

Echivalenta dintre algebra relationalasi calculul relational a fost demonstrata de J.D.Ullman.
Aceasta echivalenta arata ca orice relatie posibil de definit in algebra relationala poate fi
definitasi in cadrul calcului relational, si reciproc.

Operatorii (unari sau binari) algebrei relationale realizeaza urmatoarele functii:
SELECT (selectie) extrage tupluri ce satisfac o conditie specificata;
PROJECT (proiectie) extrage atributele specificate;
DIFFERENCE (diferenta) extrage tupluri care apar intr-o relatie, dar nu apar in cealalta;
PRODUCT (produs cartezian) genereaza toate perechile posibile de tupluri, primul element al
perechii fiind luat din prima relatie, iar cel de-al doilea element din cealalta relatie;
UNION (reuniune) reuneste doua relatii;
INTERSECT (intersectie) extrage tupluri care apar in ambele relatii;
DIVISION (diviziune) extrage valorile atributelor dintr-o relatie, care apar in toate valorile
atributelor din cealalta relatie;
JOIN (compunere) extrage tupluri din mai multe relatii corelate:
NATURAL JOIN (compunere naturala) combina tupluri din doua relatii, cu conditia ca
atributele comune sa aiba valori identice;
SEMI-JOIN (semi-compunere) selecteaza tupluri ce apartin unei singure relatii, care sunt
corelate cu tupluri din cea de a doua relatie;
-JOIN (-compunere) combina tupluri din doua relatii (nu neaparat corelate), cu conditia ca
valorile atributelor specificate sa satisfaca o anumita conditie;
OUTER JOIN (compunere externa) combina tupluri din doua relatii, astfel incat conditiile de
corelare sa fie satisfacute. Tuplurile din orice relatie care nu satisfac aceste conditii sunt
completate cu valori null.



2. Operatorul PROJECT

Proiectia este o operatie unara care elimina anumite atribute ale unei relatii producand o
submultime pe verticala a acesteia.

Prin proiectie se construieste dintr-o relatie R, o noua relatie:
a)stergand din R atributele care nu sunt mentionate in parametrii proiectiei;
b)eliminand dublurile care apar dupastergere.
Pentru a reprezenta operatorul proiectie sunt utilizate diferite notatii:
A1, ..., Am (R) PROJECT (R, A1, ..., Am)
R[A1, ..., Am]
unde A1, A2, ..., Am sunt parametrii proiectiei relativ la relatia R.

Exemplu. Sa se obtina o lista ce contine numele, prenumele si telefonul angajatilor.
1.Proiectie in algebra relationala:
Rezultat = PROJECT(ANGAJAT, nume, prenume, telefon)
2.Proiectie cu dubluri in SQL:
SELECT nume, prenume, telefon
FROM angajat;
3.Proiectie fara dubluri in SQL:
SELECT DISTINCT nume, prenume, telefon
FROM angajat;


3. Operatorul SELECT

Selectia (restrictia) este o operatie unara care produce o submultime pe orizontala a unei
relatii R. Aceasta submultime se obtine prin extragerea tuplurilor din R care satisfac o conditie
specificata.

Sunt utilizate diferite notatii:
conditie(R) R[conditie]
SELECT(R, conditie) RESTRICT(R, conditie).

Exemplu. Sa se obtina informatii complete despre vehiculele fabricate in 2010.
1.Selectie in algebra relationala:
Rezultat = SELECT(VEHICUL, an_fabricatie = 2010)
2.Selectie in SQL:
SELECT *
FROM VEHICUL
WHERE an_fabricatie = 2010;



4. Operatorul UNION

Reuniunea a doua relatii R si S este multimea tuplurilor apartinand fie lui R, fie lui S, fie ambelor
relatii.

Sunt utilizate notatiile:
R S
UNION(R, S)
OR(R, S)
APPEND(R, S).

Exemplu. Sa se obtina lista cu adresaangajatilor si a clientilor.
1. Operatorul UNION in algebra relationala:
UNION(PROJECT(ANGAJAT, adresa), PROJECT(CLIENT,adresa))
2.Operatorul UNION in SQL
SELECT adresa
FROM angajat
UNION
SELECT adresa
FROM client;



5. Operatorul DIFFERENCE

Diferenta a doua relatii R si S este multimea tuplurilor care apartin lui R, dar nu apartin lui S.
Diferenta este o operatie binara necomutativa care permite obtinerea tuplurilor ce apar numai
intr-o relatie.

Sunt utilizate diferite notatii:
R S
DIFFERENCE(R, S)
REMOVE(R, S)
MINUS(R, S).

Exemplu. Sa se obtina lista cu numarul de inmatriculare, marca, modelulsi tipul vehiculului
pentru autoturismele care au capacitatea cilindrica mai mica de 2000 cmcubi.

1.Diferentain algebra relationala:
R=PROJECT(SELECT(VEHICUL, tip_vehicul=autoturism), nr_inmatricuare, marca, model,
tip_vehicul);
S=PROJECT(SELECT(VEHICUL, capacitate_cilindrica<2000), nr_inmatricuare, marca, model,
tip_vehicul);
Rezultat = DIFFERENCE(R, S)
2.Diferenta in SQL:
SELECT nr_inmatricuare, marca, model_v, tip_vehicul
FROM VEHICUL
WHERE tip_vehicul=autoturism
MINUS
SELECT nr_inmatricuare, marca, model_v, tip_vehicul
FROM VEHICUL
WHERE capacitate_cilindrica<2000;


6. Operatorul INTERSECT

Intersectia a doua relatii R si S este multimea tuplurilor care apartin si lui R si lui S. Operatorul
INTERSECT este un operator binar, comutativ, derivat: R S = R (R S) sau R S = S (S R).

Sunt utilizate diferite notatii:
INTERSECT(R, S)
R S
AND(R, S).

Exemplu. S sa se obtina lista nr_inmatriculare a vehiculelor care sunt autoturisme, dar care au
motorizari diesel.
1.Intersectie in algebra relationala:
R = PROJECT(SELECT(VEHICUL, tip_vehicul=autoturism), nr_inmatriculare);
S = PROJECT(SELECT(VEHICUL, combustibil=diesel), nr_inmatriculare),
Rezultat = INTERSECT(R, S).
2.Intersectie in SQL:
SELECT nr_inmatriculare
FROM vehicul
WHEREtip_vehicul=autoturism
INTERSECT
SELECT nr_inmatriculare
FROM vehicul
WHEREcombustibil=diesel



7. Operatorul PRODUCT

Fie R si S relatii de aritate m, respectiv n. Produsul cartezian al lui R cu S este multimea tuplurilor
de aritate m + n unde primele m componente formeaza un tuplu in R, iar ultimele n
componente formeaza un tuplu in S.


Sunt utilizate diferite notatii:
R S
PRODUCT(R, S)
TIMES(R, S).

Exemplu. Sa se obtina lista tuturor posibilitatilor de alegerea vehiculelorde catre o persoana
juridica.
1.Produs cartezian in algebra relationala:
R = PROJECT(PERSOANA_JURIDICA, denumire);
S = PROJECT(VEHICUL, id_vehicul);
Rezultat = PRODUCT(R, S).
2.Produs cartezian in SQL:
SELECT denumire, nr_inmatriculare
FROM persoana_juridica,vehicul;



8. Operatorul DIVISION

Diviziunea este o operatie binara care defineste o relatie ce contine valorile atributelor dintr-o
relatie care apar in toate valorile atributelor din cealalta relatie.

Sunt utilizate diferite notatii:
DIVIDE(R, S)
DIVISION(R, S)

Exemplu. Sa se obtina id-urile angajatilor ce lucreaza in departamentelece apartin sucursalei cu
id-ul 1.
1.Diviziune in algebra relationala:
R = PROJECT(ANGAJAT, id_angajat, id_departament);
S = PROJECT(SELECT(DEPARTAMENT, id_sucursala = 1),id_departament);
Rezultat = DIVISION(R, S).
2.Diviziune in SQL:
SELECT UNIQUE cnp
FROM angajat a
WHERE NOT EXISTS
(SELECT *
FROM departament d
WHERE d.id_sucursala=1
AND NOT EXISTS
(SELECT *
FROM angajat b
WHERE d.id_departament=b.id_departament
AND b.cnp=a.cnp));
9. Operatorul JOIN

Operatorul de compunere (uniune) permite regasirea informatiei din mai multe relatii corelate.
Operatorul combina produsul cartezian, selectia si proiectia.

Operatorul NATURAL JOIN

Operatorul de compunere naturala (NATURAL JOIN) combina tupluri din doua relatii R si S, cu
conditia ca atributele comune sa aiba valori identice.
Algoritmul care realizeaza compunerea naturala este urmatorul:
1.se calculeaza produsul cartezian R S;
2.pentru fiecare atribut comun A care defineste o coloanain R si o coloanain S, se selecteaza
din R S tuplurile ale caror valori coincid in coloanele R.A si S.A (atributul R.A reprezinta
numele coloanei din R S corespunzatoare coloanei A din R);
3.pentru fiecare astfel de atribut A se proiecteaza coloana S.A, iar coloana R.A se va numi A.

Exemplu. Sa se obtina informatii complete despre angajati si departamentele in care lucreaza.
1.Operatorul de compunere naturalain algebra relationala:
Rezultat = JOIN(ANGAJAT, DEPARTAMENT).
2.Operatorul de compunere naturalain SQL:
SELECT *
FROM angajat a, departament d
WHERE a.id_departament = d.id_departament;


Operatorul -JOIN

Operatorul -JOIN combina tupluri din doua relatii (nu neaparat corelate) cu conditia ca valorile
atributelor specificate sa satisfaca o anumita conditie specificata explicit in cadrul operatiei.
Operatorul -JOIN este un operator derivat, fiind o combinatie de produs scalar si selectie:
JOIN(R, S, conditie) = conditie (R S)

Exemplu.Sa se obtina informatii despre angajati si despre departamentele unde lucreaza cu
conditia ca sa angajatul sa nu lucreze contabilitate .
1.Operatorul -JOIN in algebra relationala:
R = PROJECT(ANGAJAT, cnp, nume, prenume);
S = PROJECT(DEPARTAMENT, id_departament, email);
Rezultat = JOIN(R, S, DEPARTAMENT.nume<> contabilitate )
2.Opratorul -JOIN in SQL:
SELECT a.cnp, a.nume, a.prenume, d.id_departament,d. email
FROM angajat a, departament d
WHERE d.nume<> contabilitate


Operatorul SEMI-JOIN

Operatorul SEMI-JOIN conserva atributele unei singure relatii participante la compunere si este
utilizat cand nu sunt necesare toate atributele compunerii. Operatorul este asimetric.
Tupluri ale relatiei R care participain compunerea (naturala sau-JOIN) dintre relatiile R si S.
SEMI-JOIN este un operator derivat, fiind o combinatie de proiectie si compunere naturala sau
proiectie si -JOIN:
SEMIJOIN(R, S) = M (JOIN(R, S))
SEMIJOIN(R, S, conditie) = M (JOIN(R, S, conditie)),
unde am notat prin M atributele relatiei R.


Exemplu. Sa se obtina informatii referitoare la sucursalale (id_sucursala, adresa) care au
vehicule cu capacitate cilindrica de 1800 sau 1900 cm cubi.
1.Operatorul SEMI-JOIN in algebra relationala:
R = SELECT(VEHICUL, capacitate_cilindrica = 1800 OR capacitate_cilindrica = 1900)
S = JOIN(SUCURSALA, R)
Rezultat = PROJECT(S, id_sucursala, adresa).
2.Operatorul SEMI-JOIN in SQL:
SELECT s.id_sucursala, s.adresa
FROM sucursalas, vehicul v
WHERE s.id_sucursala = v.vehicul
AND (v.capacitate_cilindrica = 1800) OR (capacitate_cilindrica = 1900);



Operatorul OUTER-JOIN

Operatia de compunere externa combina tupluri din doua relatii pentru care sunt satisfacute
conditiile de corelare. In cazul aplicarii operatorului JOIN se pot pierde tupluri, atunci cand
exista un tuplu in una din relatii pentru care nu exista nici un tuplu in cealalta relatie, astfel incat
sa fie satisfacuta relatia de corelare.

Operatorul elimina acest inconvenient prin atribuirea valorii null valorilor atributelor care exista
intr-un tuplu din una dintre relatiile de intrare, dar care nu exista si in cea de-a doua relatie.
Practic, se realizeaza compunerea a doua relatii R si S la care se adauga tupluri din R si S, care nu
sunt continute in compunere, completate cu valori null pentru atributele care lipsesc.

Compunerea externa poate fi: LEFT, RIGHT, FULL.

De exemplu, OUTER JOIN LEFT reprezinta compunerea in care tuplurile din R, care nu au valori
similare in coloanele comune cu relatia S, sunt de asemenea incluse in relatia rezultat.

VII. Normalizarea datelor

Normalizarea este procesul reversibil de transformare a unei relatii, in relatii de structura mai
simpla. Procesul este reversibil in sensul ca nici o informatie nu este pierdutain timpul
transformarii. O relatie este intr-o forma normala particulara daca ea satisface o multime
specificata de constrangeri.

Normalizarea are drept scop:
suprimarea redundantei logice
evitarea anomaliilor la reactualizare
rezolvarea problemei reconexiunii.

Exista o teorie matematica a normalizarii al carei autor este E.F. Codd. Solutia: construirea unor
tabele standard (forme normale).

Forma normala (FN1)

O relatie este in prima forma normala daca fiecarui atribut care o compune ii corespunde o
valoare indivizibila (atomica).

Forma normala 2 (FN2)

O relatie R este in a doua forma normala dacasi numai daca:
relatia R este in FN1;
fiecare atribut care nu este cheie (nu participa la cheia primara) este dependent de intreaga
cheie primara.

Forma normala 3 (FN3)

Intuitiv, o relatie R este in a treia forma normala dacasi numai daca:
relatia R este in FN2;
fiecare atribut care nu este cheie (nu participa la o cheie) depinde direct de cheia primara.

Formal, o relatie R este in a treia forma normala dacasi numai daca:
relatia R este in FN2;
fiecare atribut care nu este cheie (nu participa la o cheie) nu este dependent tranzitiv de nici o
cheie a lui R.

O relatie este in FN3 dacasi numai daca fiecare atribut (coloana) care nu este cheie, depinde de
cheie, de intreaga cheie si numai de cheie.