Documente Academic
Documente Profesional
Documente Cultură
TEMĂ BDTC
Student:
Andra-Irina Ivan
București
2016
Cuprins
Listă de Figuri .................................................................................................................................. 5
Listă de Tabele ................................................................................................................................. 7
Listă de Acronime ............................................................................................................................ 8
Introducere 9
CAPITOLUL 1 Conceptele fundamentale ale bazelor de date .......................................................... 11
1.1 Ce este o bază de date? ........................................................................................................ 11
1.2 Sistemul de gestionare a bazei de date (SGBD) .................................................................. 12
1.3 Clasificarea sisemelor de baze de date ................................................................................ 12
1.3.1 Clasificarea după modelul de date ............................................................................... 12
1.3.2 Clasificarea după numărul de utilizatori ...................................................................... 13
1.3.3 Clasificarea după numărul de stații pe care este stocată baza de date ......................... 13
1.4 Modelul Entitate-Asociere .................................................................................................. 13
1.5 Modelul Entitate-Asociere Extins ....................................................................................... 17
1.6 Modelul relațional ............................................................................................................... 18
CAPITOLUL 2 Proiectarea bazelor de date relaționale ..................................................................... 21
2.1 Proiectarea conceptuală a bazei de date .............................................................................. 21
2.1.1 Identificarea entităților ................................................................................................. 22
2.1.2 Identificarea asocierilor dintre entități ......................................................................... 22
2.1.2.1 Tipuri de asocieri ............................................................................................................ 23
2.1.2.2 Exemplu practic.............................................................................................................. 23
2.1.3 Identificarea atributelor entităților și determinarea domeniilor atributelor ................. 24
2.1.4 Determinarea atributelor chei candidat și chei primare ............................................... 25
2.1.5 Generalizarea/Specializarea tipurilor de entități .......................................................... 26
2.2 Proiectarea logică a bazei de date ....................................................................................... 28
2.2.1 Construirea și validarea modelului de date logic pentru fiecare vedere a
utilizatorului ............................................................................................................................... 28
2.2.1.1 Transpunerea modelului de date conceptual local într-un model de date logic local .. 28
2.2.1.2 Extragerea relațiilor (tipurilor de entități) din modelul de date logic local ................... 32
2.2.1.3 Utilizarea normalizării .................................................................................................... 33
2.2.1.4 Definirea constrângerilor de integritate ........................................................................ 36
2.3 Proiectarea fizică a bazei de date ........................................................................................ 39
CAPITOLUL 3 Implementarea fizică a modelului logic asociat bazei de date a unui operator de
telefonie mobilă ................................................................................................................................. 41
3.1 Crearea tabelulor ................................................................................................................. 41
3.2 Adăugarea cheii primare și a cheii străine .......................................................................... 45
3.3 Inserarea datelor în tabele ................................................................................................... 49
3.4 Crearea vederilor ................................................................................................................. 53
3.4.1 Vederea care afișează clienții din roaming, ce au fie abonament, fie cartelă, fie și
abonament și cartelă ................................................................................................................... 53
3.4.2 Vederea care afișează clienții ce au o anumită vechime .............................................. 55
3.4.3 Vederea care afișează clienții care lunar, în cazul abonamentelor, sau la
reîncărcare, în cazul cartelei, plătesc peste o anumită sumă ...................................................... 56
Bibliografie 57
LISTĂ DE FIGURI
Sistemele de baze de date se numără, la ora actuală, printre cele mai importante
componente ale vieții de zi cu zi. Deși importanța lor nu poate fi contestată, adeseori, nu
suntem conștienți că le utilizăm. De exemplu, nu mulți se gândesc că o agendă cu adrese
poate fi considerată o bază de date. Ce-i drept, pentru ca aceasta să fie recunoscută ca o bază
de date propriu-zisă, trebuie copiată informația din agendă într-un computer și salvată într-un
fișier, într-un mod ordonat. Trecând la un alt exemplu, atunci când cumpărăm ceva de la
supermarket, vânzătorul scanează produsele cu ajutorul cititorului de coduri de bare. Acest
aparat este conectat la o aplicație care utilizând codul de bare interoghează o bază de date
pentru a obține prețul produsului scanat. Oare câți dintre noi s-au întrebat vreodată cum
reușește acel aparat să „ghicească” prețul produsului? Sau ce se întâmplă atunci când plătim
cu ajutorul cardului de credit? În ceea ce privește ultima întrebare, atunci când plata se face cu
ajutorul cardului de credit, cititorul verifică, în primul rând, dacă există suficient credit astfel
încât tranzacția să poată fi realizată. Acest lucru este posibil datorită existenței unei baze de
date care conține informații referitoare la cumpărăturile efectuate utilizând cardul de credit.
Verificarea creditului se face cu ajutorul unei aplicații ce utilizează numărul cardului pentru a
inspecta dacă prețul produselor ce se doresc a fi cumpărate împreună cu totalul cumpărăturilor
deja efectuate în luna respectivă se află în limita creditului deținătorului cardului. În
momentul în care tranzacția este confirmată, detaliile acesteia sunt adăugate în baza de date
respectivă. Trebuie precizat faptul că, înainte ca tranzacția să fie autorizată, aplicația va
9
interoga baza de date și pentru a verifica dacă nu cumva cardul de credit se află pe lista celor
furate sau pierdute.
Având în vedere că bazele de date sunt vitale în ceea ce privește facilitarea vieții
omului modern, așa cum reiese și din exemplele anterioare, lucrarea de față își propune să
prezinte modul în care se proiectează o bază de date, mai precis o bază de date a unui operator
de telefonie mobilă.
Cerința proiectului este următoarea:
„Se va presupune faptul că un client poate avea atât abonamente (oricâte), cât și
cartele pre-plătite. Se presupune că se va cunoaște identitatea unui deținător de cartelă pre-
plătită.
Informațiile despre clienți vor conține codul clientului, numele și prenumele, adresa,
numere de telefon deținute, starea financiară (plata la zi sau întârziat/restanțier).
Structura pentru abonamente va conţine tipul de abonament, servicii oferite (voce,
sms, mms, video call, internet, roaming), cost, stare plăți (la zi sau restanţier), vechime în
reţea.
Structura pentru cartele pre-plătite va conţine servicii oferite (voce, sms, mms, video
call, internet, roaming), suma disponibilă, vechime în reţea.
În final, se vor crea vederi pentru a pune în evidenţă clienţii care sunt în roaming
(abonaţi + prepay), cei care plătesc peste o anumită sumă, care au o anumită vechime.”
10
CAPITOLUL 1
11
de telefon) până la un număr de câteva milioane de înregistrări (baza de date cu abonații unei
companii de telefonie mobilă).
13
cuantifice, califice și să clasifice o entitate. De asemenea, trebuie precizat faptul că acesta
poate avea o singură valoare.
În cazul anumitor atribute, valoarea acestora se poate modifica constant (cum ar fi
starea financiară a clientului). Aceste atribute sunt numite atribute volatile. În schimb,
anumite atribute nu-și vor schimba valoarea decât foarte rar sau niciodată (cum ar fi adresa
clientului), ele fiind numite atribute nonvolatile.
De asemenea, un atribut poate fi obligatoriu (numele clientului) sau opțional (e-mail-ul
clientului). Dacă atributul este obligatoriu, el trebuie cunoscut și neapărat inclus în baza de
date. În ceea ce privește un atribut optional, în cazul anumitor instanțe el poate lipsi.
Revenind la entități, există două categorii de entități, și anume: entități normale
(puternice, obișuite) și entități slabe (dependente). Entitățile normale au o existență proprie. În
schimb, cele slabe nu pot exista decât dacă există o entitate normală cu care sunt asociate.
O asociere este o legătură sau o conexiune între entități, ce prezintă o anumită
semnificație pentru activitatea modelată. Gradul unei asocieri este dat de numărul de entități
asociate. Astfel asocierile pot fi binare (între 2 entități) sau multiple (între k entități, k > 2). În
ceea ce privește asocierile binare, acestea sunt de trei tipuri:
„unu-la-unu” sau „one-to-one” – asocierea prin care unei instanțe a unei entități,
E1, îi corespunde o singură instanță a unei alte entități, E2, și reciproc. Acest tip
de asociere se notează astfel - 1:1.
„unu-la-multe” sau „one-to-many” – asocierea prin care unei instanțe a unei
entități, E1, îi corespund una sau mai multe instanțe ale unei alte entități, E2, dar
unei instanțe ale entității E2 îi corespunde o singură instanță a entității E1. Acest
tip de asociere se notează astfel – 1:N.
„multe-la-multe” sau „many-to-many” – asocierea prin care unei instanțe a unei
entități, E1, îi corespund una sau mai multe instanțe ale unei alte entități, E2, și
reciproc. Acest tip de asociere se notează astfel – M:N.
Cardinalitatea unei asocieri binare este dată de numărul de instanțe ale entității E1 care
pot stabili o legătură, o conexiune cu o instanță a unei entității E2.
Diagrama Entitate-Asociere (Entity-Relationship Diagram - ERD) nu este altceva decât
o reprezentare a modelului E-A. Notațiile folosite în cadrul acestei diagrame pentru
reprezentarea entităților, atributelor și asocierilor sunt prezentate în Figura 1.1. Trebuie
precizat faptul că există numeroase variante de notații, dar cele prezentate sunt cele mai
folosite.
Așa cum se poate observa și în Figura 1.1, entitatea puternică se reprezintă cu ajutorul
unui dreptunghi în timp ce entitatea slabă tot printr-un dreptunghi în interiorul căruia se afllă
alt dreptunghi. În cazul atributelor unei entități, acestea sunt reprezentate printr-o elipsă care
este conectată la entitate prin intermediul unei linii continue. Iar în ceea ce privește asocierea
dintre două entități, acesta se reprezintă printr-un romb conectat prin link-uri (linii continue)
la entitățile implicate. Asocierea poate avea sau nu un nume, însă dacă acesta există, el trebuie
scris în interiorul rombului sau în vecinătatea acestuia. Și tipul asocierii poate fi menționat
prin scrierea multiplicității în dreptul fiecărui link. De asemenea, trebuie menționat faptul că o
asociere poate să prezinte ea însăși atribute, aceste atribute reprezentându-se și ele prin elipse
care se conectează la asocierea în cauză.
În cazul diagramei ERD, numele unei entități este un substantiv iar al unei asocieri un
verb deoarece asocierea nu reprezintă altceva decît o interacțiune între entități iar o
intercațiune poate fi exprimată printr-un verb.
14
Figura 1.1 Notațiile folosite pentru realizarea ERD
15
caracterizată de mai multe atribute: cod, nume, prenume, adresă, numere de telefon deținute,
stare financiară (plata la zi sau întârziat/restanțier).
În ceea ce privește entitatea „ABONAMENT”, aceasta reprezintă un abonamen sau, cu
alte cuvinte, una din opțiunile pe care un client o poate alege pentru a putea beneficia de
serviciile oferite de o companie de telefonie mobilă și este o entitate puternică. Această
entitate este caracterizată de mai multe atribute: tip abonament (de exemplu: Cangur, etc.),
servicii (servicii oferite: sms, mms, etc.), cost.
Asocierea CARTELĂ-CLIENT este o asociere de tipul „multe-la-multe”, ce se notează
M:N. S-a ales acest tip de asociere datorită faptului că un anumit tip de cartelă (care oferă
anumite servicii) poate fi deținut de mai mulți clienți iar un client poate deține mai multe
cartele, de același tip sau de tipuri diferite.
Asocierea ABONAMENT-CLIENT este o asociere de tipul „multe-la-multe”, ce se
notează M:N. S-a ales acest tip de asociere datorită faptului că un anumit tip de abonament
(care oferă anumite servicii) poate fi deținut de mai mulți clienți iar un client poate deține mai
multe abonamente, de același tip sau de tipuri diferite.
Pentru ambele cazuri de relații: CARTELĂ-CLIENT și ABONAMENT-CLIENT, tipul
de asociere ales a fost cel „multe-la-multe” datorită faptului că nu a fost impusă nicio
constrângere în ceea ce privește numărul de abonamente/cartele ce pot fi deținute de un client
iar un anumit tip de abonament sau cartelă este evident că poate fi deținut de mai mulți clienți.
Trebuie precizat faptul că diagrama ERD prezentată în Figura 1.2 nu reprezintă o unică
soluție datorită faptului că modul de stabilire a entităților și asocierilor dintre ele nu este unul
unic, totul depinzând de felul în care persoana care proiectează baza de date dezvoltă modelul
conceptual. Astfel, o asociere poate fi înlocuită de o entitate așa cum se întâmplă în cazul
asocierilor de tipul „multe-la-multe” dintre CARTELĂ și CLIENT și ABONAMENT și
CLIENT. Aceste asocieri iau naștere între cele două entități participante în urma stabilirii unui
angajament între compania de telefonie mobile și client, cu alte cuvinte, putem spune că în
urma stabilirii unui contract (având în vedere că este cunoscută identitatea unui deținător de
cartelă pre-plătită, putem considera că la achiziționarea cartelei de încheie un fel de contract
între cele două părți implicate). Așadar asocierile pot fi înlocuite de entitatea „CONTRACT”
ce poate avea atribute precum: numărul de telefon asociat abonamentului sau cartelei, codul
clientului, etc. Schimbările survenite în cadrul diagramei ERD în urma înlocuirii asocieririlor
menționate anterior cu entitatea „CARTELĂ” pot fi observate în figurile următoare: Figura
1.3 și Figura 1.4.
16
Figura 1.3 Înlocuirea asocierii M:N dintre entitățile CARTELĂ și CLIENT
18
modelului se explică prin temelia sa științifică. El este riguros din punct de vedere matematic
grație faptului că se sprijină pe teoria matematică a relațiilor și teoria logicii de ordinul unu.
Modelul relational a fost primul exemplu de model de date formal și a fost propus de E.
Codd în 1970. Prin intermediul acestui model, datele utilizatorului sunt reprezentate și
manipulate în mod abstract.
Conform unei sugestii a lui Codd, orice model de date trebuie să se bazeze pet rei
componente:
Structurile de date – sunt definite prin intermediul unui limbaj de definire a
datelor (data definition language). Datele, în modelul relațional, sunt structurate
în relații bidimensionale. Elementele principale ale structurii relaționale sunt
relațiile, tuplurile, atributele, domeniile.
Constrângerile de integritate – prin integritatea datelor se înțelege că datele
rămân stabile, în siguranță și corecte. Integritatea în modelul relational este
menținută de constrângeri interne ce nu sunt cunoscute utilizatorului.
Manipularea datelor – relațiile pot fi manipulate prin intermediul unui limbaj de
manipulare a datelor (data manipulation language). În modelul relational,
limbajul folosește operatorii relaționali bazați pe conceptul algebrei relaționale.
Anterior au fost amintite următoarele concepte: relație, tuplu, atribut, domeniu. În cele
ce urmează se va explica ce noțiuni definesc acestea precum și alte concept.
O relație este un tabel ce conține coloane și rânduri iar un atribut este o coloană a unei
relații și are asociat o anumită denumire.
Domeniul este mulțimea valorilor premise pentru unul sau mai multe atribute. Astfel,
pentru fiecare atribut se va stabili: denumirea domeniului, sensul și domeniul de definiție,
evitându-se, în acest fel, apariția operațiilor incorecte din punct de vedere semantic.
Un tuplu este un rând într-o relație iar intensitatea unei relații reprezintă structura
tabelului, specificarea domeniilor și a altor restricții referitoare la valorile posibile, fiind, în
general, fixă. Trebuie menționat faptul că, există tupluri care se modifică în timp, acestea fiind
numite extensii ale unei relații.
Gradul unei relații nu reprezintă altceva, decât numărul de atribute asociat relației
(numărul de coloane ale unui tabel) iar cardinalitatea, numărul de tupluri asociate relației
(numărul de rânduri ale unui tabel).
În final, poartă numele de bază de date relațională, un set de relații normalizate,
structurate adecvat.
19
20
CAPITOLUL 2
În ceea ce privește etapele proiectării unei baze de date, acestea sunt următoarele:
Proiectarea conceptuală;
Proiectarea logică;
Proiectarea fizică:
21
2.1.1 Identificarea entităților
O entitate poate fi un lucru real, tangibil, precum o persoană sau o cladire sau poate fi
o noțiune abstractă și este descrisă prin intermediul proprietăților sale. Într-o diagram ERD,
prin convenție, entitățile sunt reprezentate prin intermediul unui dreptunghi în interiorul
căruia este scris numele entității, întotdeauna cu litere mari. Trebuie precizat faptul că nu pot
exista două entități cu același nume în cadrul aceleiași diagrame ERD.
Principala modalitate de identificare a entităților, care este folosită și în cazul temei de
față, este: studierea cerinței utilizatorului, practic se caută principalele substantive prezente în
specificație, principalele obiecte de interes, excluzându-se calitățile.
În cazul temei propuse, într-o primă fază, s-au identificat următoarele entități:
CLIENT – această entitate reprezintă persoana care poate beneficia de
serviciile oferite de compania de telefonie mobilă în schimbul achitării unei
anumite sume de bani;
ABONAMENT – reprezintă una dintre ofertele pe care compania de telefonie
mobilă le poate oferi unui client;
CARTELĂ – precizează cealaltă ofertă ce poate fi oferită de compania de
telefonie mobilă.
Având în vedere entitățile identificate anterior, se poate construi o primă formă a
diagramei E-A, prezentată în figura următoare.
22
Asocierile dintre entități se reprezintă prin intermediul arcelor neorientate iar fiecăreo
asocieri i se oferă un nume plasat deasupra arcului sau în mijlocul arcului, în interiorul unui
romb. Cardinalitatea asocierii, ce exprimă numărul minim și maxim de realizări a unei entități
cu cealaltă entitate asociată, se specific și el deasupra arcului neorientat ce reprezintă
asocierea. Maximul unei cardinalități este cunoscut și sub denumirea de: grad de asociere iar
minimul sub numele de: obligativitatea participării entității la asociere
2.1.2.1 Tipuri de asocieri
Clasificare tipurilor de asocieri se poate face în funcție de cardinalitatea asocierii sau
de numărul de entități distincte ce participă la asociere.
În funcție de gradul de asociere (maximul cardinalității) se cunosc următoarele tipuri
de asocieri:
asocieri „unu-la-unu”, care se împart în funcție de gradul de obligativitate al
participării la asociere (minima cardinalității) în:
o asocieri „unu-la-unu” parțiale
o asocieri „unu-la-unu” totale
asocieri „unu-la-multe”, care se împart și ele în:
o asocieri „unu-la-multe” parțiale
o asocieri „unu-la-multe” totale
asocieri „multe-la-multe”, care se împart în:
o asocieri „multe-la-multe” parțiale
o asocieri „multe-la-multe” totale
În funcție de numărul de entități distincte ce participă la asociere se cunosc
următoarele tipuri de asocieri:
binare – între două entități distincte
recursive
complexe – între n entități, unde n>2
În ceea ce privește asocierea „multe-la-multe” trebuie precizat faptul că, în cazul
alegerii unui anumit SGBD, ea poate devini greu de implementat și astfel, va fi transformată,
de regulă, în două asocieri „unu-la-multe”, ce sunt mult mai ușor de implementat.
O asociere parțială este o asociere în cazul căreia nicio entitate vizată nu este obligată
să participe. Practic, entitățile vizate pot participa toate la asociere sau pot participa doar
câteva din ele sau chiar niciuna. Având în vedere acest lucru rezultă faptul că minima
cardinalității este 0.
În cazul în care minima cardinalității este mai mare ca 0 atunci se poate afirma că
entitatea este obligată să participe la asociere și că, astfel, avem de-a face cu o asociere totală.
2.1.2.2 Exemplu practic
În ceea ce privește tema acestei lucrări și având în vedere tipurile de asocieri
menționate anterior, au fost identificate următoarele asocieri între entitățile din Figura 2.1:
CARTELĂ-CLIENT – este o asociere de tipul „multe-la-multe”. Justificarea este
următoarea: Un client poate deține mai multe cartele de același tip sau de tipuri
diferite iar același tip de cartelă poate fi deținut de mai mulți clienți; de asemenea, un
client poate să nu dețină o cartelă, ci un abonament iar un anumit tip de cartelă este
neapărat deținut de un client;
ABONAMENT-CLIENT - este o asociere de tipul „multe-la-multe”. Justificarea este
următoarea: Un client poate deține mai multe abonament de același tip sau de tipuri
23
diferite iar același tip de abonament poate fi deținut de mai mulți clienți; de asemenea,
un client poate să nu dețină un abonament, ci o cartelă iar un anumit tip de abonament
este neapărat deținut de un client;
Prin urmare, a doua formă a diagramei Entitate-Asociere a temei date este prezentată în
figura următoare.
25
cuprinde un set minim de atribute;
este cheia canditat care are cea mai mică probabilitate de modificare a
valorii;
este cheia candidat care are cea mai mică probabilitate de a-și pierde
unicitatea;
este cheia candidat cu cele mai puține caractere;
este cheia candidat care este cel mai ușor de identificat din punct de vedere
al utilizatorului
În cazul de față, pentru entitatea CLIENT, cheile candidat sunt: cod_client și CNP.
Atât numărul de marcă al clientului cât și CNP-ul acestuia îl pot identifica în mod unic, însă
având în vedere că CNP-ul are 13 cifre și că este imposibil ca o companie de telefonie mobilă
să aibă peste un bilion de abonați, se va alege drept cheie primară atributul cod_client
deoarece are mai puține caractere.
În cazul entității ABONAMENT, singura cheie candidat este: tip_abonament și, prin
urmare, atributul tip_abonament va fi cheia primară a acestei entități.
În ceea ce privește entitatea CARTELĂ, singura cheie candidat este: tip_cartelă și,
prin urmare, atributul tip_cartelă va fi cheia primară a acestei entități.
26
minute_roaming
sms_rețea
sms_naționale
sms_roaming
mms_rețea
mms_naționale
mms_roaming
internet
apel_video
Prin urmare, dupa realizarea generalizării se obține o noua entitate numită OFERTĂ
datorită faptului că abonamentul sau cartela pot fi privite ca o ofertă pe care compania de
telefonie mobilă o propune clientului. Iar această nouă entitate prezintă atributele menționate
anterior. Astfel, entitățile și atributele bazei de date dupa realizarea generalizării vor fi
prezentate în Figura 2.4 iar întreaga diagramă Entitate-Asociere în Figura 2.5.
27
2.2 PROIECTAREA LOGICĂ A BAZEI DE DATE
Proiectarea logică a bazei de date este procesul în care se decide structura logică a bazei
de date sau, cu alte cuvinte, este procesul în urma căruia se obține modelul de informații al
bazei de date ce se bazează pe modelul de date dar este independent de particularizările
sistemului de gestiune a bazei de date și a altor considerente fizice. În cadrul acestei etape se
pornește de la modelul conceptual al bazei de date și, prin anumite prelucrări (ce vor fi
menționate în cele ce urmează), se obține modelul logic.
2.2.1 Construirea și validarea modelului de date logic pentru fiecare vedere a
utilizatorului
Așa cum am menționat, se pornește de la modelul comceptual și se efectuează anumite
modificări conform cerințelor unui sistem de gestionare relațional.
2.2.1.1 Transpunerea modelului de date conceptual local într-un model de date
logic local
Se ia modelul conceptual local și se elimină caracteristicile nedorite, urmând mai mulți
pași ce vor fi prezentați în cele ce urmează.
2.2.1.1.1 Eliminarea relațiilor de tip „multe-la-multe”
Datorită faptului că în cazul anumitor sisteme de gestionare a bazei de date relațiile de
tip M:N sunt mai greu de implementat, se urmărește desființarea acestora și înlocuirea lor cu
două relații de tip 1:N („unu-la-multe”).
28
contract asociat unei cartele, el putând avea un abonament, însă un contract întotdeauna va
avea un client.
Și asocierea de tip M:N dintre entitatea ABONAMENT și entitatea CLIENT a fost
înlocuită de către o nouă entitate numită CONTRACT_ABONAMENT și două asocieri de tip
1:N: ABONAMENT – CONTRACT_ABONAMENT și CONTRACT_ABONAMENT –
CLIENT. Relația dintre entitatea CARTELĂ și entitatea CONTRACT_ABONAMENT este
una de tip „unu-la-multe” datorită faptului că un anumit tip de abonament poate figura în
cadrul mai multor contracte, fiind achizițonat de mai mulți clienți, însă un contract este
întocmit pentru un singur abonament și deci pentru un singur tip de abonament. De asemenea,
trebuie precizat faptul că un abonament trebuie să figureze în cadrul unui contract iar într-un
contract trebuie să figureze un anumit tip de abonament. În ceea ce privește relația dintre
entitatea CLIENT și entitatea CONTRACT_ABONAMENT, aceasta este o relație de tip 1:N
deoarece un client poate deține mai multe contracte însă un contract aparține unui singur
client. De asemenea, este de menționat faptul că un client poate să nu dețină un contract
asociat unui abonament, el putând avea o cartelă, însă un contract va avea întotdeauna un
client.
Având în vedere noile entități adaugate, entitățile finale ale bazei de date împreună cu
atributele asociate acestora sunt:
CLIENT cu atributele:
o cod_client – atribut obligatoriu, tipul de date: șir de caractere
o CNP - atribut obligatoriu, tipul de date: șir de caractere, dimensiune: 13
o data_nașterii - atribut obligatoriu, tipul de date: data calendaristică
o nume - atribut obligatoriu, tipul de date: șir de caractere
o prenume - atribut obligatoriu, tipul de date: șir de caractere
o adresa - atribut obligatoriu, tipul de date: șir de caractere
o e-mail - atribut opțional, tipul de date: șir de caractere
ABONAMENT cu atributele:
o tip_abonament - atribut obligatoriu, tipul de date: șir de caractere
o cost - atribut obligatoriu, tipul de date: întreg
o minute_rețea - atribut opțional, tipul de date: șir de caractere
o minute_naționale - atribut opțional, tipul de date: șir de caractere
o minute_roaming - atribut opțional, tipul de date: șir de caractere
o sms_rețea - atribut opțional, tipul de date: șir de caractere
o sms_naționale - atribut opțional, tipul de date: șir de caractere
o sms_roaming - atribut opțional, tipul de date: șir de caractere
o mms_rețea - atribut opțional, tipul de date: șir de caractere
o mms_naționale - atribut opțional, tipul de date: șir de caractere
o mms_roaming - atribut opțional, tipul de date: șir de caractere
o internet - atribut opțional, tipul de date: șir de caractere
o apel_video - atribut opțional, tipul de date: șir de caractere
CARTELĂ cu atributele:
o tip_cartelă - atribut obligatoriu, tipul de date: șir de caractere
o suma_disponibilă - atribut obligatoriu, tipul de date: întreg
o minute_rețea - atribut opțional, tipul de date: șir de caractere
o minute_naționale - atribut opțional, tipul de date: șir de caractere
o minute_roaming - atribut opțional, tipul de date: șir de caractere
o sms_rețea - atribut opțional, tipul de date: șir de caractere
29
o sms_naționale - atribut opțional, tipul de date: șir de caractere
o sms_roaming - atribut opțional, tipul de date: șir de caractere
o mms_rețea - atribut opțional, tipul de date: șir de caractere
o mms_naționale - atribut opțional, tipul de date: șir de caractere
o mms_roaming - atribut opțional, tipul de date: șir de caractere
o internet - atribut opțional, tipul de date: șir de caractere
o apel_video - atribut opțional, tipul de date: șir de caractere
CONTRACT_ABONAMENT cu atributele:
o număr_telefon – atribut obligatoriu, tipul de date: șir de caractere,
dimensiune: 10
o tip_abonament – atribut obligatoriu, tipul de date: șir de caractere
o cod_client – atribut obligatoriu, tipul de date: șir de caractere
o dată_semnare – atribut obligatoriu, tipul de date: dată calendaristică
o dată_expirare_contract – atribut obligatoriu, tipul de date: dată
calendaristică
o stare_financiară_client – atribut obligatoriu, tipul de date: șir de
caractere
CONTRACT_CARTELĂ cu atributele:
o număr_telefon – atribut obligatoriu, tipul de date: șir de caractere,
dimensiune: 10
o tip_cartelă – atribut obligatoriu, tipul de date: șir de caractere
o cod_client – atribut obligatoriu, tipul de date: șir de caractere
o dată_achiziționare_cartelă – atribut obligatoriu, tipul de date: dată
calendaristică
o dată_expirare_credit – atribut obligatoriu, tipul de date: dată
calendaristică
o credit – atribut obligatoriu, tipul de date: întreg
În cazul entității CONTRACT_ABONAMENT, atributul număr_telefon reprezintă
numărul de telefon atribuit clientului și tocmai de aceea acesta este un șir de caractere;
atributul tip_abonament reprezintă tipul abonamentului (de exemplu: Cangur); atributul
cod_client nu reprezintă altceva decât numărul de marcă asociat clientului; atributul
dată_semnare reprezintă data la care a fost semnat contractul; atributul dată_expirare_contract
reprezintă data la care contractul expiră și trebuie realizat un act adițional prin care acesta este
prelungit iar atributul stare_financiară_client poate lua doar două valori: „la zi/restanțier” și
pune în evidență starea plăților clientului.
În ceea ce privește cheile candidat ale entității CONTRACT_ABONAMENT, acestea
sunt: număr_telefon; număr_telefon și tip_abonament; număr_telefon și cod_client;
număr_telefon, cod_client și tip_abonament; orice combinație ce conține număr_telefon.
Dintre toate aceste chei candidat, cheia primară aleasă a fost: număr_telefon deoarece
îndeplinește toate caracteristicile pe care trebuie să le aibă o cheie primară și care au fost
menționate în subcapitolul: 2.1.4 .
Trecând mai departe la entitatea CONTRACT_CARTELĂ, atributul număr_telefon
reprezintă numărul de telefon atribuit clientului și tocmai de aceea acesta este un șir de
caractere; atributul tip_cartelă reprezintă tipul cartelei (de exemplu: Frog); atributul
cod_client nu reprezintă altceva decât numărul de marcă asociat clientului; atributul
data_achiziționare_cartelă reprezintă data la care a fost achiziționată cartela; atributul
30
data_expirare_credit reprezintă data la care creditul expiră dacă nu este folosit și trebuie
reîncărcată cartela iar atributul credit nu reprezintă altceva decât creditul rămas.
În ceea ce privește cheile candidat ale entității CONTRACT_CARTELĂ, acestea sunt:
număr_telefon; număr_telefon și tip_cartelă; număr_telefon și cod_client; număr_telefon,
cod_client și tip_cartelă; orice combinație ce conține număr_telefon. Dintre toate aceste chei
candidat, cheia primară aleasă a fost: număr_telefon deoarece îndeplinește toate
caracteristicile pe care trebuie să le aibă o cheie primară și care au fost menționate în
subcapitolul: 2.1.4 .
În ceea ce privește entitatea CLIENT, s-a ales să se elimine atributul numere_de_telefon
deținute deoarece se pot afla numerele de telefon deținute și prin verificarea contractului
asociat cartelei sau abonamentului. De asemenea, s-a mai eliminat atributul opțional
stare_financiară deoarece și această informație poate fi obținută în alt fel și anume prin
verificarea contractului asociat abonamentului.
În cazul entității CONTRACT_ABONAMENT singura cheie candidat este atributul
număr_telefon și prin urmare acesta va fi cheia primară a entității.
Același lucru și în cazul entității CONTRACT_CARTELĂ singura cheie candidat este
atributul număr_telefon și prin urmare acesta va fi cheia primară a entității.
Figura 2.7 Entitățile și atributele bazei de date proiectate după eliminarea relațiilor M:N
2.2.1.1.2 Eliminarea relațiilor complexe
Numim relație complexă, asocierea dintre m entități, unde m ≥ 3. O astfel de relație
trebuie neapărat înlocuită de către mai multe relații de tip 1:N. Cum în cazul diagramei ERD a
bazei de date proiectate în cadrul acestei lucrări nu avem relații complexe, acest pas va fi sărit.
2.2.1.1.3 Eliminarea relațiilor recursive
O relație recursivă este, de fapt, o asociere dintre o entitate și ea însăși și trebuie
descompusă pentru a se identifica o relație intermediară. Și această etapă va fi sărită datorită
faptului că nu exită relații recursive în cadrul diagramei ERD a bazei de date a operatorului de
telefonie mobilă.
2.2.1.1.4 Eliminarea relațiilor cu atribute
Existența unei astfel de relații indică faptul că nu a fost identificată o anumită entitate și
prin urmare trebuie introdusă această nouă entitate în cadrul diagramei ERD. Cum în cazul
diagramei ERD a bazei de date proiectate în cadrul acestei lucrări nu avem relații ce au
asociate atribute, această etapă va fi sărită.
2.2.1.1.5 Eliminarea atributelor cu valori multiple
31
Atributele cu mai multe valori sunt acele atribute care pot avea mai multe valori în cazul
aceleiași instanțe. Un astfel de atribut trebuie descompus pentru a identfica o nouă entitate. Și
acest pas va fi sărit datorită faptului ca nu există astfel de atribute în cazul bazei de date
proiectate.
2.2.1.1.6 Eliminarea relațiilor redudante
O relație este redundantă atunci când aceeași informație se poate obține și prin alte
relații. Cum în cazul exemplului prezentat în această lucrare nu există astfel de relații această
etapă va fi sărită.
2.2.1.2 Extragerea relațiilor (tipurilor de entități) din modelul de date logic local
Toți pașii efectuați până în acest punct au dus la obținerea modelului de date logic din
modelul de date conceptual.
În continuare, din modelul de date logic se vor extrage relațiile ce vor reprezenta
entitățile ce le compun. Fiecare relație va fi descrisă cu ajutorul unui limbaj de definire a
bazelor de date, astfel: se va denumi relația, apoi, între paranteze atributele simple (ce nu pot
fi descompuse în alte atribute).
Trebuie menționat faptul că relația dintre două entități este exprimată prin asocierea
cheie primară – cheie străină. Cu alte cuvinte, cheia primară din entitatea părinte devine cheie
străină în entitatea copil.
Cheia străină sau cheia externă este reprezentată de un atribut sau un grup de atribute
al unei relații, R1, a cărui valoare sau ale căror valori sunt definite pe același domeniu
respectiv aceleași domenii ca și cheia primară a unei alte relații, R2. O astfel de cheie străină
are rolul de a modela legptura dintre cele două relații (tabele).
În continuare, se vor prezenta relațiile extrase:
Clienți(cod_client, CNP, nume, prenume, data_nașterii, adresa, e-mail)
Cheie primară: cod_client
32
Cartele(tip_cartelă, suma_disponibilă inițial, minute_rețea, minute_naționale,
minute_roaming, sms_rețea, sms_naționale, sms_roaming, mms_rețea, mms_naționale,
mms_roaming, internet, apel_video)
Cheie primară: tip_cartelă
33
Figura 2.8 Etapele normalizării
34
Astfel, o relație se află într-o formă normală dacă satisface o serie de constrângeri, așa
cum se sugerează și în Figura 2.9. De exemplu, o relație se află în a treia formă normală
(3FN) dacă și numai dacă se află în a două formă normal (3FN).
În Figura 2.8 au fost introduce noi concepte precum: atribute atomice. Acestea vor fi
explicate în cele ce urmează.
Un atribut atomic este un atribut ce nu poate fi descompus în alte atribute. Astfel, dacă
atributele din modelul logic sunt atomice se poate spune că baza de date se află în prima
formă normală.
2.2.1.3.1 Prima formă normală (1FN)
Prima formă nomală este legată de noțiunea introdusă mai devreme, și anume: atribut
atomic. De asemenea se mai introduce următoarele noțiuni:
atribut simplu
atribut compus
grupuri repetitive de atribute
Un atribut simplu, sau atribut atomic, este un atribut care nu mai poate fi descompus în
alte atribute (de exemplu, în cazul bazei de date proiectate în această lucrare, atributul „nume”
este un atribut simplu). În caz contrar, avem de-a face cu un atribut compus (atribut
neatomic).
Există câteva exemple de atribute, ce se regăsesc și în cazul exemplului luat în
considerare în această lucrare, care pot fi considerate simple sau compuse, în funcție de
obiectivele bazei de date:
data calendaristică – acesta conține câmpurile: zi, lună, an
adresă – acesta conține câmpurile: stradă, număr, bloc, scară, etaj, apartament,
localitate, județ
Un grup repetitiv este un grup de atribute care apar cu valori multiple pentru o singură
apariție a cheii primare a relației nenormalizate, cu alte cuvinte, care apar cu valori multiple
pentru aceeași instanță a unei entități.
Dintre toate cele cinci forme normale, doar prima formă are character de
obligativitate, prin urmare pentru a putea continua proiectarea este suficient să verificăm dacă
baza de date proiectată până acum conține relații ce se află în prima formă normală.
35
O relație se află în prima formă normală dacă toate atributele asociate acesteia sunt
atribute atomice. De semenea, un tuplu nu trebuie să conțină atribute sau grupuri de atribute
repetitive. Prin urmare, pentru a aduce o relație în prima formă normală trebuie eliminate
atributele neatomice și atributele repetitive.
Etapele de aducere a unei relații în prima formă normală sunt:
pentru fiecare grup repetitiv se construiește câte o relație
fiecărei noi relații obținute în urma pasului anterior i se adaugă și cheia primară
a relației R nenormalizate
cheia primară a noii relații va fi compusă din cheile relației R, la care se adugă
unul sau mai multe atribute proprii.
În figura următoare sunt prezentate relațiile asociate bazei de date proiectate în cadrul
acestei lucrări.
36
2.2.1.4.1 Integritatea datelor cerute
Anumite atribute nu pot avea valoarea Null, aceste atribute fiind, de fapt atribute
obligatorii. În cazul bazei de date proiectate în această lucrare s-a asigurat integritatea datelor
cerute prin specificarea, în dreptul fiecărui atribut, a opționalității acestuia: „obligatoriu” sau
„optional”.
2.2.1.4.2 Constrângerile privind domeniile atributelor
În cazul bazei de date proiectate în cadrul acestei lucrări, constrângerile au fost impuse
în momentul alegerii atributelor.
2.2.1.4.3 Integritatea entităților
Se referă la faptul că o cheie primară a unei entități nu poate avea valoare Null. În
cazul nostru s-a respectat acest lucru datorită faptului că s-au ales drept chei primare atribute
obligatorii.
2.2.1.4.4 Integritatea referențială
Integritatea referențială vizează relația entitate părinte – entitate copil. Trebuie amintit
următorul lucru: cheia primară a entității părinte e copiază în entitatea copil, devenind cheie
străină.
Integritatea referențială înseamnă următorul lucru: o valoare nenulă a cheii străine din
entitatea copil trebuie să coincide cu o valoare nenulă în entitatea părinte. Dacă entitatea copil
prezintă o participare totală în asociere, atunci nu sunt premise Null-uri în câmpul cheie
străină, acestea fiind premise în cazul în care entitatea copil prezintă o participare parțială.
Integritatea referențială se realizează prin constrângeri de existență, ce definesc
condițiile în care poate fi inserată, modificată sau ștearsă o cheie străină.
Se va lua drept exemplu relația: Client are un Contract_Abonament, de cardinalitate
1:N.
Entitatea părinte (Ep): Clienți, cu cheia primară: cod_client.
Entitatea copil (Ec): Contracte_Abonamente, cu cheia străină: cod_client, copie a cheii
primare din Client.
În cazul inserării unei apariții în relația (entitatea) copil, pentru a se asigura
integritatea referențială se verifică dacă atributul cod_client din noua apariție introdusă în Ec
este stabilt ca sau are o valoare existentă în Ep. În cazul nostru, având în vedere că un contract
are asociat întotdeauna un client, cheia străină cod_client nu va avea niciodată valoarea Null.
În ceea ce privește ștergerea unei apariții din relația (entitatea) copil aceasta se poate
efectua fără probleme, integritatea referențială nefiind afectată.
Dacă se reactualizează cheia străină în relația (entitatea) copil trebuie stabilit dacă
aceasta este Null sau are o valoare existentă în relația (entitatea) părinte. În cazul nostru,
având în vedere că un contract are asociat întotdeauna un client, cheia străină cod_client nu va
avea niciodată valoarea Null.
Inserarea unei apariții în relația (entitatea) părinte se poate efectua fără problem
datorită faptului că Ep are o participare parțială. Cu alte cuvinte, poate exista un client care nu
are un contract asociat unui abonament.
37
În ceea ce privește ștergerea unei apariții din relația (entitatea) părinte, dacă acelei
apariții îi corespund una sau mai multe apariții în entitatea copil, atunci integritatea
referențială se pierde. Astfel, se vor lua în considerare următoarele strategii:
NO ACTION – se blochează ștergerea apariției din relația (entitatea) părinte
dacă acesteia îi corespund mai multe apariții în relația (entitatea) copil;
CASCADE – se șterg automant aparițiile corespondente din (entitatea) copil
dacă se șterge o apariție în relația (entitatea) părinte. Dacă relația (entitatea)
copil este o relația (entitatea) părinte pentru o altă relație (entitate), ștergerea se
propagă în cascadă;
SET NULL – se setează valoarea cheii străine la Null, această strategie putând
fi aplicată numai în cazul în care cheia străină acceptă valoarea Null;
SET DEFAULT – se setează cheia străină la o valoare prestabilită.
NO CHECK – nu se verifică integritatea. Cul alte cuvinte, când se realizează
ștergerea nu se garantează menținerea integrității referențiale.
De asemenea se pierde integritatea referențială dacă se dorește reactualizarea unei chei
primare în relația (entitatea) părinte iar acesteia îi corespundeau una sau mai multe apariții în
entitatea copil.
2.2.1.4.5 Constrângerile întreprinderii
Sunt regulile de afaceri care, uneori, pot genera reactualizări ale entităților.
38
CARTELE
min min min sms sms sms mms_ mms_ mms_
tip_cartelă sumă_disp_iniț internet apel_video
_reț _naț _ro _reț _naț _ro reț naț ro
Frog 5 100 50 50 100 50 50 10 10 10 10 nu
FrogXXL 10 1000 500 100 1000 500 500 50 50 50 20 da
CONTRACTE_CARTELE
număr_telefon tip_cartelă cod_client dată_achiziționare_cartelă dată_expirare_credit credit
0744112333 Frog 3800 28.08.2014 02.02.2017 2
0744300200 FrogXXL 2667 01.09.2013 03.03.2017 5
CLIENȚI
cod_client CNP nume prenume data_nașterii adresa e-mail
Giurgiu, N.
3800 2930831424226 Ivan Irina 31.08.1993 Titulescu, nr. ivanirina93@gmail.com
57
Giurgiu, N.
2667 1930601112233 Anghel Ion 01.06.1993 Titulescu, nr. anghelion@gmail.com
50
CONTRACTE_ABONAMENTE
număr_telefon tip_abonament cod_client dată_semnare data_expirare_contract stare_financiară
074411244 Cangur 3800 01.07.2014 02.02.2018 la zi
0744300211 CangurXXL 2667 01.10.2013 03.03.2018 restanțier
ABONAMENTE
min min min sms sms sms mms_ mms_ mms_
tip_abonament cost internet apel_video
_reț _naț _ro _reț _naț _ro reț naț ro
Cangur 10 1000 500 150 1000 250 50 10 10 10 10 nu
CangurXXL 30 2000 500 100 5000 1500 500 50 50 50 20 da
39
40
CAPITOLUL 3
Modelul logic a fost implementat în mediul Oracle Database 11g Express Edition
folosindu-se limbajul SQL. În continuare va fi prezentat modul de implementare.
41
nume_coloană1 tip_date [NULL | NOT NULL],
nume_coloană2 tip_date [NULL | NOT NULL],
nume_coloană3 tip_date [NULL | NOT NULL],
…
nume_coloanăn tip_date [NULL | NOT NULL],
);
Pentru relația CLIENȚI:
42
suma_disponibila_initial number (3) NOT NULL,
minute_retea VARCHAR2 (15),
minute_nationale VARCHAR2 (15),
minute_roaming VARCHAR2 (15),
sms_retea VARCHAR2 (15),
sms_nationale VARCHAR2 (15),
sms_roaming VARCHAR2 (15),
mms_retea VARCHAR2 (15),
mms_nationale VARCHAR2 (15),
mms_roaming VARCHAR2 (15),
internet VARCHAR2 (15),
apel_video VARCHAR2 (2)
);
43
sms_nationale VARCHAR2 (15),
sms_roaming VARCHAR2 (15),
mms_retea VARCHAR2 (15),
mms_nationale VARCHAR2 (15),
mms_roaming VARCHAR2 (15),
internet VARCHAR2 (15),
apel_video VARCHAR2 (2)
);
44
Figura 3.5 Tabelul CONTRACTE_CARTELE implementat
47
Figura 3.10 Cheie primară și chei străine tabel CONTRACTE_ABONAMENTE
48
3.3 INSERAREA DATELOR ÎN TABELE
Sintaxa instrucțiunii folosite pentru popularea tabelelor cu date este următoarea:
INSERT INTO nume_tabel (nume_coloană1, nume_coloană2, nume_coloană3...,
nume_coloanăn)
VALUES (valoare1,valoare2, valoare3 ..., valoaren);
Trebuie menționat faptul că, datele vor fi inserate cu succes dacă se respectă
constrângerile de integritate.
Inserarea datelor în tabelul CARTELE:
INSERT INTO cartele (tip_cartela, suma_disponibila_initial, minute_retea,
minute_nationale, minute_roaming, sms_retea, sms_nationale, sms_roaming,
mms_retea, mms_nationale, mms_roaming, internet, apel_video)
VALUES ('Frog', 5, '1000', '1000', NULL, '1000', '1000', NULL, NULL,
NULL, NULL, '10', 'da');
Pentru a vizualiza înregul tabel populat s-a folosit următoarea comandă: SELECT *
FROM clienti;.
49
Figura 3.14 A doua jumătate a tabelului CARTELE
Inserarea datelor în tabelul ABONAMENTE:
INSERT INTO abonamente (tip_abonament, cost, minute_retea,
minute_nationale, minute_roaming, sms_retea, sms_nationale, sms_roaming,
mms_retea, mms_nationale, mms_roaming, internet, apel_video)
VALUES ('Cangur', 10, '1000', '500', NULL, '1000', '500', NULL, '100', '100',
NULL, '2', 'da');
50
INSERT INTO clienti (cod_client, CNP, nume, prenume, data_nasterii, adresa,
email)
VALUES ('111', '2930831000000', 'Ivan', 'Irina', TO_DATE('31.08.1993',
'DD.MM.YYYY'), 'N. Titulescu, nr. 57, Giurgiu', 'ivanirina@gmail.com');
51
Inserarea datelor în tabelul CONTRACTE_CARTELE:
53
Pentru realizarea vederii s-a procedat în felul următor:
folosindu-se operatorul INNER JOIN (acesta selectează rânduri din două
tabele atât timp cât există o potrivire între anumite coloane ale tabelelor) s-au
selectat clienții care au abonament și sunt în roaming. În cazul exemplului
nostru, a trebuit să existe o potrivire între cheia primară a tabelului părinte și
cheia străină a tabelului copil.
tot folosindu-se operatorul INNER JOIN s-au selectat clienții care au cartelă și
sunt în roaming
pentru a se afișa împreună rezultatele obținute anterior s-a folosit operatorul
UNION (acesta combină rezultatul a două sau mai multe selecții)
Astfel, instrucțiunile folosite au fost următoarele:
CREATE VIEW clienti_roaming AS
SELECT c.cod_client, c.CNP, c.nume, c.prenume, ab.tip_abonament as
nume_oferta, ab.minute_roaming, ab.sms_roaming, ab.mms_roaming FROM clienti c
INNER JOIN contracte_abonamente ca
ON ca.cod_client = c.cod_client
INNER JOIN abonamente ab
ON ab.tip_abonament = ca.tip_abonament
WHERE ab.minute_roaming IS NOT NULL
AND ab.sms_roaming IS NOT NULL
AND ab.mms_roaming IS NOT NULL
UNION
SELECT c.cod_client, c.CNP, c.nume, c.prenume, car.tip_cartela as
nume_oferta, car.minute_roaming, car.sms_roaming, car.mms_roaming FROM clienti
c
INNER JOIN contracte_cartele cc
ON cc.cod_client = c.cod_client
INNER JOIN cartele car
ON car.tip_cartela = cc.tip_cartela
WHERE car.minute_roaming IS NOT NULL
AND car.sms_roaming IS NOT NULL
AND car.mms_roaming IS NOT NULL;
Figura 3.21 Vederea care afișează clienții din roaming, ce au fie abonament, fie cartelă, fie și
abonament și cartelă
54
3.4.2 Vederea care afișează clienții ce au o anumită vechime
Vom presupune că se dorește afișarea clienților ce au o vechime mai mare de 4 ani.
Pentru realizarea vederii s-a procedat în felul următor:
folosindu-se operatorul INNER JOIN s-au selectat clienții care au abonament
și au o vechime de peste 4 ani
tot folosindu-se operatorul INNER JOIN s-au selectat clienții care au cartelă și
au o vechime de peste 4 ani
pentru a se afișa împreună rezultatele obținute anterior s-a folosit operatorul
UNION
55
3.4.3 Vederea care afișează clienții care lunar, în cazul abonamentelor, sau la
reîncărcare, în cazul cartelei, plătesc peste o anumită sumă
Figura 3.23 Vederea care afișează clienții care lunar, în cazul abonamentelor, sau la reîncărcare,
în cazul cartelei, plătesc peste 15 euro
56
BIBLIOGRAFIE
[1]Olteanu, A., Anghel M., Pietraru R. N., „Baze de date și utilizarea acestora”;
[2]„Conceptele fundamentale ale bazelor de date”, http://vega.unitbv.ro/~cataron/Courses/
BD/BD_Cap_1.pdf;
[3]„Proiectarea bazelor de date relaționale”, http://id.inf.ucv.ro/~popirlan/bd/laborator3.pdf;
[4]Galațchi, D., Note de curs
57