Documente Academic
Documente Profesional
Documente Cultură
1
Contents
Intorducere .............................................................................................................................................................. 4
Capitolul 1. Bază de date. Noţiuni Teoretice .......................................................................................................... 5
1.1 Definiţie Bază de Date .................................................................................................................................. 5
1.2 Arhitectura unei baze de date ........................................................................................................................ 5
1.3 Sistemul de gestiune al bazei de date ............................................................................................................ 6
1.3.1 Componentele unui sistem de baze de date ........................................................................................... 6
1.3.2 Exemple de SGBD ................................................................................................................................. 7
1.4 Modele de date .............................................................................................................................................. 7
1.5 Bază de Date Relaţională. Definiţie. ............................................................................................................. 8
1.6 Proiectarea unei Baze de Date ...................................................................................................................... 8
Capitolul 2 Proiectarea Bazei de Date................................................................................................................... 10
2.1 Etapa I. Colectarea şi analiza cerinţelor. ..................................................................................................... 10
2.2 Etapa a II-a. Proiectarea conceptuală a bazei de date.................................................................................. 11
2.2.1 Descrierea cerinţelor utilizatorului. ...................................................................................................... 11
2.2.2. Aspecte teoretice. ................................................................................................................................ 13
2.3. Etapa a III-a. Proiectarea logică a Bazei de Date ....................................................................................... 29
2.4. Etapa a IV-a. Alegerea SGBD-ului ............................................................................................................ 30
Capitolul 3. Implementarea fizică a bazei de date................................................................................................ 31
3.1. Crearea Administratorului şi Utilizatorilor ................................................................................................ 31
3.2. Crearea tabelelor ........................................................................................................................................ 33
3.2.1 Crearea tabelului Abonaţi..................................................................................................................... 34
3.2.2. Crearea tabelului DateDeContact ........................................................................................................ 36
3.2.3. Crearea tabelului Contracte ................................................................................................................. 37
3.2.4. Crearea tabelului Facturi ..................................................................................................................... 38
3.2.5. Crearea tabelului Abonamente ............................................................................................................ 39
3.2.6. Crearea tabelului Tarife ....................................................................................................................... 40
3.2.7. Crearea tabelului NumereTelefon ....................................................................................................... 41
3.2.8. Crearea tabelului Servicii .................................................................................................................... 42
3.2.9. Crearea tabelului CartelePrepay .......................................................................................................... 43
3.3. Introducerea constrângerilor Foreign Key (Cheie Străină) ........................................................................ 44
3.3.1. Introducerea cheii străine IdAbonat în tabelul DateDeContact ........................................................... 44
3.3.2. Introducerea cheilor străine IdAbonat, NumarTelefon în tabelul Contracte ...................................... 44
2
3.3.3. Introducerea cheii străine IdAbonat în tabelul Facturi ........................................................................ 45
3.3.4. Introducerea cheilor străine IdServiciu, IdTarif în tabelul Abonamente ............................................ 46
3.3.5. Introducerea cheilor străine IdAbonat, IdAbonament şi IdPrepay în tabelul NumereTelefon. ......... 46
3.3.6. Introducerea cheii străine IdServiciu în tabelul CartelePrepay ........................................................... 48
3.4. Introducerea datelor în tabele .................................................................................................................... 48
3.4.1. Introducerea datelor în tabela Abonaţi ................................................................................................ 48
3.4.2. Introducerea datelor în tabela Servicii................................................................................................. 50
3.4.3. Introducerea datelor în tabela Tarife ................................................................................................... 51
3.4.4. Introducerea datelor în tabela DateDeContact .................................................................................... 52
3.4.5. Introducerea datelor în tabela Facturi .................................................................................................. 54
3.4.6. Introducerea datelor în tabela Abonamente......................................................................................... 55
3.4.7. Introducerea datelor în tabela CartelePrepay ...................................................................................... 57
3.4.8. Introducerea datelor în tabela NumereTelefon .................................................................................... 58
3.4.9 Introducerea datelor în tabela Contracte .............................................................................................. 59
3.5. Crearea vederilor ........................................................................................................................................ 60
3.5.1. Crearea vederii cu clieţii în Roaming .................................................................................................. 62
3.5.2. Crearea vederii cu clienţii care plătesc peste o anumită sumă. ........................................................... 64
Concluzii ............................................................................................................................................................... 69
Bilbliografie .......................................................................................................................................................... 70
3
Intorducere
În prezent bazele de date prezintă o largă răspândire, fiind necesare în aproape toate domeniile de
activitate actuale. Baza de date reprezintă acum cadrul fundamental al unui sistem informaţional şi a modificat
radical modul de operare al multor organizaţii. În particular, dezvoltarea acestei tehnologii de-a lungul ultimilor
ani a dus la crearea unor sisteme mai puternice, ce pot fi utilizate într-un mod mai intuitiv. Rezultatul a fost că
sistemele de baze de date au devenit din ce în ce mai accesibile pentru o mai largă varietate de utilizatori.
Dimensiunea acestora poate varia de la câteva zeci de înregistrări la câteva zeci de milioane (spre exemplu baze
de date care ţin evidenţa populaţiei ). Prin urmare sunt necesare mecansime şi metode de stocare a unor blocuri
masive de date cât şi de acces rapid la acestea.
Un sistem de baze de date este în principiu un sistem computerizat de păstrare a evidenţelor. Iar baza de
date este cea care înglobează aceste evidenţe şi le stochează într-o colecţie de date. Utilizatorii unui sistem de
baze de date pot efectua o serie de operaţii asupra acestor date. Printre ele se numără: adăugarea de date noi în
baza de date (insert), actualizarea datelor memorate (update), ştergerea unora din datele existente (delete),
interogarea bazei de date (query).
Caracteristica principală a aplicaţiilor de baze de date constă în faptul că accentul este pus pe operaţiile
de memorare şi regăsire , efectuate asupra unor volume mari de date, şi mai puţin asupra operaţiilor de
prelucrare a acestora asa cum este cazul în alte domenii de aplicare a informaticii.
Lucrarea prezentă se doreşte a fi o introducere în domeniul bazelor de date, prin care se evidenţiază
conceptul teoretic al unei baze de date şi paşii necesari în proiectarea şi crearea propriu-zisă a acesteia. Totodată,
fundamentul teoretic va fi susţinut de o parte aplicativă realizată în mediul Oracle Database 10g Express
Edition. Această parte constituie un exemplu practic de dezvoltare a unei baze de date destinate unei companii
de telecomunicaţii mobile. Pornind de la cerinţele utilizatorului, se va prezenta pas cu pas metodologia de
proiectare a bazei de date dorite şi se vor introduce noţiunile necesare conceperii si dezvoltării acesteia.
4
Capitolul 1. Bază de date. Noţiuni Teoretice
O bază de date reprezintă o colecţie logică coerentă de date, creată şi menţinută computerizat, în scopul
prelucrării datelor în contextul unui set de aplicaţii.
Simpla memorare a datelor în fişiere pe disc sau în colecţii de fişe nu va fi suficientă pentru ca acestea
să fie considerate baze de date, deoarece pe lângă stocare, o bază de date permite operaţii de interogare
complexe, care selectează anumite informaţii după un criteriu ales. De exemplu datele stocate într-un fişier de
tipul Microsoft Excel ce foloseşte principii asemănătoare cu cele ale bazelor de date relaţionale , fiind o aplicaţie
de calcul tabelar, nu vor fi considerate ca făcând parte din o bază de date, deoarece Excel nu permite operaţii de
query.
Faţă de vechile metode de înregistrare a datelor privind diferite activităţi pe fişe (documente scrise) sau
chiar în fişiere pe disc, sistemele de baze de date oferă avantaje considerabile, ceea ce explică extinsa utilizare a
acestora. Câteva dintre avantajele oferite sunt:
Asigurarea independenţei fizice şi logice a datelor impune adoptarea unei arhitecturi de baze de date
organizate pe cel puţin trei nivele:
- nivelul intern: colecţie de fişiere conţinând datele fizice, la care se adaugă diverse structuri auxiliare
menite să asigure accesul la date. Structurile auxiliare pot fi: directoare, indecsi, pointeri etc. Baza de date fizică
este rezidentă în memoria secundară a calculatorului, în general pe harddisk.
5
- nivelul conceptual: abstractizare a unei parţi din lumea reală ce constă în descrierea structurii logice a
datelor dintr-o bază de date, integrând viziunile tuturor utilizatorilor asupra acesteia.
- nivelul extern: corespunde viziunii unui utilizator sau a unui grup de utilizatori. Este modelul cel mai
apropiat de utilizator, fiind derivat din modelul conceptual, dar poate prezenta deosebiri substanţiale faţă de
acesta. Termenul tehnic adesea folosit pentru modelul extern este acela de vedere. Vederile au mai multe
utilizări în cadrul bazelor de date, cum ar fi asigurarea securităţii bazei de date, prin limitarea accesului la date a
anumitor categorii de utilizatori.
Un sistem de gestiune al bazei de date (SGBD) reprezintă un ansamblu de componente software care
asigură crearea, utilizarea şi întreţinerea uneia sau mai multor baze de date. Un SGBD cuprinde:
SGBD-ul cuprinde două facilităţi importante pentru proiectarea şi exploatarea bazelor de date:
- facilităţi de descriere a datelor: prin limbajul de definire al datelor LDD (Data Definition Languages -
DDL), care serveşte pentru descrierea modelelor externe, al modelului conceptual şi a inerfeţelor dintre cele trei
nivele de organizare a bazei de date.
- facilităţi de manipulare a datelor: prin limbajele de manipulare a datelor – LMD (Data Manipulation
Languages–DML) , acestea constituind interfaţa dintre SGBD şi utilizatori. Limbajul de manipulare a datelor
constă dintr-un set de comenzi care corespund operatiilor de exploatare a bazei de date (precum formularea
cererilor de acces la date (interogări), adăugarea, ştergerea şi actualizarea datelor).
1.3.1.1 Hardware
Calculatoarele pe care sunt instalate de obicei sistemele de baze de date sunt PC standard, dar şi
calculatoare multiprocesor foarte puternice. Cea mai importantă caracteristică a calculatorului pe care
funcţionează sistemul de baze de date este capacitatea harddisk-ului, utilizat pentru memorarea datelor din baza
de date.
1.3.1.2 Software
Sisteme de operare, biblioteci, instrumente de dezvoltare, interfeţe.
Sistemul de Gestiune a Bazelor de Date(SGBD) (Database Management System –DBMS) -
recepţionează cererile utilizatorilor de acces la baza de date, le interpretează, execută operaţiile
corespunzătoare şi returnează rezultatul.
Aplicaţii de baze de date: (Database Applications)–sunt programe care oferă anumite utilizări ale
unei baze de date.
6
1.3.1.3 Utilizatorii
Utilizatorii unui sistem de baze de date se împart în câteva categorii:
Programatorii de aplicaţii sunt cei care dezvoltă aplicaţiile de baze de date în anumite medii de
programare.
Utilizatorii obişnuiţi sunt acei utilizatori care accesează baza de date prin intermediul unei aplicaţii
de baze de date. Aceşti utilizatori au drepturi limitate asupra accesului la datele din baza de date, ei
neavând cunoştinţe aprofundate asupra structurii şi a datelor din acea bază de date.
Administratorul bazei de date (DataBase Administrator) care este o persoană autorizată, care are ca
sarcină administrarea resurselor, autorizarea accesului la baza de date, a coordonării şi monitorizării
utilizatorilor acelei baze de date.
Microsoft SQL Server este sistemul de gestiune a bazelor de date relaţionale multi-utilizator dezvoltat
de firma Microsoft pentru sistemele de operare Windows.
Microsoft Access este unul din cele mai cunoscute sisteme de gestiune a bazelor de date relaţionale pe
platforme de calculatoare personale.
Sistemul Oracle este un sistem de gestiune al bazelor de date multi-utilizator foarte puternic, cu
implementări pe toate platformele (Windows, Linux, Unix), care oferă atât performanţe de execuţie ridicate, cât
şi un grad mare de protecţie şi securitate a datelor.
MySQL este un sistem de gestiune a bazelor de date relaţionale cu implementări pentru sistemele de
operare Linux, Unix, Windows. Acest sistem se poate utiliza gratuit, fiind open source.
Visual FOX PRO este un limbaj de programare complet, care acceptă un mediu interactiv şi un mediu
compilat la rulare.
IBM DB2 este un sistem de gestiune al bazelor de date al firmei IBM. Acest sistem asigură integritatea
datelor, oferă o securitate sporită pentru date, are o interfaţă grafică pentru gestionarea bazei de date.
7
• Modele conceptualede nivel înalt(modelul Entitate-Asociere, modelul Entitate-Asociere Extins)–
descriu concis colectiile de date care modelează activitatea dorită fără să detalieze modul de
reprezentare sau de prelucrare a datelor.
• Modele specializate (modelul ierarhic, modelul reţea, modelul relaţional, modelul obiect-orientat,
modelul obiect-relaţional) -descriu reprezentarea mulţimilor de entităţi şi a asocierilor dintre acestea
prin structuri de date specifice.
• fiecare relaţie reprezintă o mulţime (tip) de entităţi sau o mulţime (tip) de asocieri
• fiecare relaţie este unică într-o bază de date
relaţia se defineşte prin intermediul atributelor sale
Atributele unei relaţii corespund atributelor tipului de entitate sau de asociere pe care îl reprezintă relaţia
respectivă.
Un exemplu potrivit pentru a ilustra aceste concepte teoretice ar fi tipul de entitate „Abonat” (al unei
companii de telecomunicaţii) ce reprezintă orice persoană care a încheiat un contract cu compania de
telecomunicaţii pentru un anumit abonament si care beneficiază de serviciile oferite de companie pe baza acelui
contract. Din acest exemplu se mai poate deduce existenţa a cel puţin două tipuri de entităţi relevante pentru o
astfel de bază de date: tipul de date „Abonamente” şi tipul de date „Servicii” precum şi ideea de asociere între
acestea: asocierea dintre Abonat şi Abonamente şi asocierea dintre Abonamente şi Servicii.
Revenind la relaţia Abonat, aceasta poate fi descrisă prin mai multe atribute, dintre care o parte pot fi
folosite pentru identificarea persoanei precum: Nume, Prenume, CNP, Adresa etc. iar altele pot corespunde
asocierii acestuia cu compania respectivă precum Tip Abonament, Numar Contract etc.
O bază de date relaţională este în esenţă o muţime de tabele legate între ele prin diverse asocieri. În cazul
expus în exemplul nostru, baza de date referită ar putea avea în componenţa sa tabelele Abonat, Abonamente,
Servicii .
În general, vom considera că proiectarea corectă a unei baze de date trebuie să parcurgă următoarele etape:
Înainte de a se proiecta efectiv o bază de date (in cadrul unui sistem informatic – sistem de baze de
date), este necesar să se cunoască:
Toate acestea sunt informaţii slab structurate, în general în limbaj natural. Din aceste informaţii trebuie să
fie extrase date precise de proiectare a bazelor de date şi a aplicaţiilor. Deşi este o fază puternic consumatoare de
timp, această etapă este deosebit de importantă. Implementarea bazei de date trebuie să se facă în conformitate
cu cerinţele utilizatorilor. De regulă cel care concepe şi crează baza de date nu este şi acela care o va utiliza în
final. Prin urmare, aceasta ar putea fi respinsă de eventualii utilizatori dacă cerinţele nu au fost satisfacute
corespunzător.
Având cerinţele formulate precis şi concis se poate trece la elaborarea schemei conceptuale utilizând un
model de nivel înalt. Schema conceptuală reprezintă o descriere concisă a datelor utilizatorului, incluzând
descrierea detaliată a tipurilor de date, a relaţiilor şi restricţiilor acestora.
Alegerea unui SGBD se bazează pe factori de tip tehnici, economici şi administrativi. Factorii tehnici se
referă în special la modelul de date folosit, capacitatea de stocare a datelor, configuraţia hardware-software
necesară etc. Factorii economici şi administrativi sunt de regulă costul de achiziţie a software-ului, costul de
întreţinere şi costul de pregătire a personalului.
Pentru proiectarea logică a bazei de date se porneşte de la schema coneceptuală şi se realizează schema
logică (diagrama logică) şi schemele (vederile) externe pentru sistemul SGBD ales. În mod frecvent, etapele de
proiectare conceptuală şi proiectarelogică se efectuează împreună, proiectând schema (diagrama) logică a bazei
de date cu ajutorul toolset-urilor de dezvoltare oferite de SGBD-ul utilizat.
În faza de proiectare fizică a bezelor de date se creează obiectele principale ale bazei de date (tabele, vederi,
indexuri), pe baza proiectului logic, folosind limbajul de descriere a datelor (LDD) oferit de sistemul SGBD
ales, sau toolset-uri grafice (de ex. table editor) sau prin executia scriptului generat de un toolset de proiectare.
9
Capitolul 2 Proiectarea Bazei de Date
În acestă lucrare vom exemplifica procedura de proiectare a unei baze de date destinată unei companii de
telecomunicaţii mobile. Vom parcurge fiecare etapă de proiectare în care vom detalia şi exemplifica aspectele
necesare construcţiei bazei de date propuse. Pe parcurs, vor mai fi evidenţiate anumite aspecte teoretice pentru o
mai bună înţelegere. Trebuie menţionat faptul că, lucrarea prezentă este pur didactică, şi are scopul de a pune în
practică partea teoretică în scopuri educative. Prin urmare conceptul bazei de date din cadrul acestui proiect va fi
mult simplificat. Baza de date prezentată aici nu se va putea compara cu o baza de date destinată în realitate unei
companii de telecomunicaţii mobile, ce poate avea milioane de înregistrări. Totodată, aş dori să atrag atenţia
asupra faptului că SGBD-ul ales este Sistemul Oracle, aplicaţia de gestiune a bazei de date fiind Oracle
Database 10g Express Edition. Un alt aspect important este acela că proiectarea conceptuală a bazei de date şi
proiectarea logică a acesteia se vor realiza într-o singură etapă.
Aşteptările potenţialilor utilizatori cu privire la baza de date sunt acelea de a avea acces rapid la informaţii
caracteristice abonaţilor respectiv clienţilor prepay. Spre exemplu se doreşte crearea de 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 etc.
Baza de date va fi orientata spre doua structuri de date principale. Una pune în evidenţă abonaţii.
Cea de-a doua se referă la cartelele prepay respectiv clienţii prepay din cadrul companiei.
Structura pentru abonaţi va conţine numele, codul clientului, număr telefon, tipul de abonament,
servicii oferite (voce, sms, mms, video call, internet, roaming), cost, stare plati (la zi sau restanţier),
vechime în reţea.
Structura pentru clienţi prepay va conţine număr telefon, servicii oferite (voce, sms, mms, video
call, internet, roaming), suma disponibilă, vechime în reţea.
Potenţialele aplicaţii ce vor folosi baza de date sunt aplicaţii de gestiune a clienţilor companiei de
telecomunicaţii. Un exemplu de astfel de aplicaţie este o aplicaţie web , baza de date poate fi accesată de
personalul autorizat (administrator şi utilizatori) folosind o pagină web.
10
2.2 Etapa a II-a. Proiectarea conceptuală a bazei de date.
1. Descrierea cerinţelor utilizatorului. În cadrul acestei subetape, se vor analiza cerinţele utilizatorului şi în
funcţie de acestea se vor lua decizii asupra tabelelor folosite şi a relaţiilor dintre acestea, se vor realiza
totodată diagramele entitate relaţie.
2. Introducerea anumitor aspecte teoretice necesare înţelegerii modelului Entitate-Relaţie şi a termenilor:
tabel, entitate, atribut, tip de dată, relaţie, cheie candidată, cheie primară, cheie străină (externă) etc .
3. Proiectarea logică a bazei de date.
4. Arhitectura generală a bazei de date
Structura pentru clienţi prepay va conţine număr telefon, servicii oferite (voce, sms, mms, video call,
internet, roaming), suma disponibilă, vechime în reţea.
În structura de date pentru clienţi prepay vom avea următoarele tabele: CartelePrepay, NumereTelefon,
Servicii.
Observaţii:
11
2.2.1.3 Descrierea tabelelor
Tabela Abonaţi reprezintă tabela de identificare a abonaţilor companiei de telefonie mobilă. Această
tabelă va fi cuprinsă din următoarele coloane: IdAbonat, Nume, Prenume, CNP.
Tabela DateDeContact reprezintă tabela în care sunt detaliate datele de contact ale abonaţilor. Aceasta
va cuprinde coloanele: IdContact, Adresă, Email, NumărTelefonDeContact şi IdAbonat. * Coloana IdAbonat
este folosită pentru a identifica abonatul în cauză din cadrul tabelei Abonaţi. Acest câmp are o semnificaţie
specială ce va fi dezvăluită în următoarea etapă.
Tabela Contracte reprezintă tabela în care sunt înregistrate contractele dintre companie şi abonaţi.
Coloanele tabelei sunt următoarele: IdContract, DatăÎnceput, DatăSfârşit, IdAbonat, NumărTelefon. * La fel ca
şi în cazul tabelei DateDeContact, coloana IdAbonat identifcă abonatul, iar coloana NumărTelefon va identifica
numărul de telefon pentru care a fost iniţiat contractul. Acest ultim câmp face legătura cu tabela NumereTelefon.
Tabela Facturi reprezintă tabela ce deţine informaţiile referitoare la plăţile efectuate de către clienţi. În
această tabelă sunt stocate facturile clienţilor. Coloanele tabelei Facturi sunt următoarele: IdFactură,
DataFacturare, DataScadentă, TotalulDePlată, IdAbonat.
Tabela Abonamente conţine tipurile de abonamente oferite de compania de telefonie mobilă. Această
tabelă cuprinde coloanele: IdAbonament, TipAbonament, Cost, IdServiciu, IdTarif. * Din sturctura de date cerută
de client se regăsesc câmpurile: tipul de abonament şi cost.
Tabela Tarife cuprinde tarifele standard pentru convorbiri în reţea sau în afara reţelei atât pentru
abonamente cât şi pentru cartele prepay. În această tabelă se regăsesc următorele coloane: IdTarif, Apeluri
Reţea, ApeluriExtraReţea, SMSReţea, SMSExtraReţea, MMSReţea, MMSExtraReţea, TraficInternet. Tarifele
vor fi introduse în €/minut, €/SMS, €/MMS şi €/MB.
Tabela Servicii reprezintă tabela cu informaţii referitoare la serviciile oferite de compania telecom.
Aceasta este alcătuită din următoarele coloane: IdServiciu, MinuteGratuite, SMSGratuite, MMSGratuite,
Internet, VideoCall, Roaming.
Tabela CartelePrepay reprezintă tabela ce cuprinde datele legate de cartele prepay. Coloanele acestei
tabele sunt următoarele: IdPrepay, SumăDisponibilă, IdServiciu.
12
2.3.1.5 Relaţiile între tabele
Relaţie de tipul unul-la-unul– Tabela DateDeContact cu Tabela Abonaţi, Tabela Abonamente cu Tabela Tarife,
Tabela CartelePrepay cu Tabela NumereTelefon.
Relaţie de tipul unul-la-multe – Tabela Abonaţi cu Tabela Facturi, Tabela Abonaţi cu Tabela Contracte, Tabela
Abonaţi cu Tabela NumereTelefon , Tabela NumereTelefon cu Tabela Contracte, Tabela Servicii cu Tabela
Abonamente, Tabela Abonamente cu Tabela NumereTelefon, Tabela Servicii cu Tabela CartelePrepay.
Relaţie de tipul multe-la-multe – Tabela Abonaţi cu Tabela Abonamente folosind ca tabelă de legătură tabela
NumereTelefon.
13
2.2.2.2. Noţiunea de Entitate. Definiţie
O entitate este un obiect al lumii reale, cu o existenţă independentă şi poate reprezenta un obiect fizic, o
activitate, un concept. O entitate este un obiect cu existenţă fizică , de exemplu: persoană particulară, automobil,
companie, activitate, curs universitar. Orice entitate are o serie de proprietăţi numite atribute, ce descriu
entitatea respectivă. Cu toate că nu reprezintă acelaşi lucru, pentru denumirea de entitate se mai foloseşte şi
denumirea de tabel al bazei de date, iar pentru atribute câmpurile tabelului.
Pentru baza de date propusă, toate tabelele menţionate în etapa anterioară reprezintă entităţi. Prin urmare
entităţile ce copun baza de date sunt: Abonaţi, DateDeContact, Contracte, Abonamente, Facturi,
NumereTelefon, Servicii şi CartelePrepay. Fiecare dintre aceste există în realitate şi pot fi identificate într-un
mod distinctiv. Spre exemplu un Abonat este o persoană reală, în cadrul bazei de date entitatea Abonaţi
reprezintă indivizi care beneficiază de serviciile companieie de telecomunicaţii contra cost.
Spre exemplu IdAbonament este un număr care identifică în mod unic un tip de abonament oferit de
compania de telefonie mobilă. Pe când atributul TipAbonament este un nume dat abonamentului respectiv
pentru a putea fi mai uşor de reţinut. Atributul Cost identifică preţul unui tip de abonament iar IdServiciu
reprezintă un atribut care face trimitere la tabela Servicii unde se regăsesc informaţii despre serviciile şi
beneficiile oferite de către acel abonament.
Unele atribute pot fi divizate în mai multe părţi cu semnificaţie independentă. Un astfel de atribut este un
atribut complex.
Un exemplu este cel al atributului Adresă care poate fi divizat în mai multe atribute : Oras, Cod Postal,
Stradă, Număr, Bloc etc.
Atributele care nu sunt compuse se numesc atribute atomice. Valoarea atributelor complexe se formează
prin concatenarea valorilor atributelor atomice.
Multe atribute au valoare unică pentru o entitate particulară şi sunt numite atribute cu o singură valoare. De
exemplu CNP-ul unei persoane. Există atribute ce pot lua mai multe valori dintr-un set dat, cum ar fi tipurile de
abonamente, stare plaţi (la zi sau restanţier), roaming (activat, dezactivat) etc. Aceste atribute sunt atribute cu
mai multe valori.
Atributele derivate sunt atributele ce se pot determina din alte atribute, cum ar fi vârsta unei persoane se
poate calcula din data curentă minus data naşterii persoanei respective.
În anumite situaţii, o entitate poate să nu aibă valori pentru toate atributele asociate ei, în acest caz
folosindu-se o valoare specială numită atributul null.
Fiecare atribut are un nume şi un domeniu de definiţie. Domeniul de definiţie al unui atribut este domeniul
în care atributul poate lua valori. Cu alte cuvinte, domeniul de definiţie reprezintă un tip de dată. Tipurile de date
cunoscute sunt: caractere, numere întregi, numere zecimale, boolean, data, datetime etc. Fiecărui atribut i se
14
atribuie şi o anumită dimensiune maximă. Spre exemplu atributul Adresă este o dată de tip caracter de
dimnesiune maximă 50 caractere.
Revenind la exemplul nostru, să ne definim toate entităţile din baza de date Telecom.
Abonaţi
15
Linie (tuplu):
1 Popescu Andreea 2881218180051
Înregistrare
Un tabel (o tabelă) este compusă din înregistrări sau rânduri. Fiecare înregistrare este tratată ca o simplă
unitate. Fiecare înregistrare se poate lega de înregistrări ale altei tabele. Înregistrările sunt constituite din
câmpuri (coloane) . Un câmp este o particulă atomică a bazei de date ce reprezintă cea mai mică cantitate de
informaţie care poate fi manipulată. Toate înregistrările dintr-o tabelă au aceleaşi câmpuri.
O relaţie este o corespondenţă între entităţi din una sau mai multe mulţimi de entităţi. Gradul unei relaţii
este dat de numărul de mulţimi de entităţi asociate. Relaţiile pot fi binare (între 2 mulţimi de entităţi) sau
multiple (între mai mult de 2 entităţi). În lucrarea de faţă se lucrează doar cu mulţimi binare.
Pentru a realiza efectiv această relaţie trebuie introdus atributul IdAbonat în tabela DateContact.
Informaţiile stocate aşa sunt şi mai uşor de manipulat.
Un exemplu al acestui tip de relaţie din cadrul aplicaţiei pe care o proiectăm este cazul relaţiei dintre tabela
Servicii şi tabela CartelePrepay. Tabela Servicii este tabela cu informaţii referitoare la serviciile oferite de
compania telecom. Adică la numărul de minute oferite, numărul de mesaje SMS sau MMS, dacă se dispune de
Internet, Videocall sau Roaming. Fiecare tip de servici este unic. Nu vom avea tupluri identice. Un serviciu (o
înregistrare în tabela Servicii) poate corespunde mai multor cartele prepay. Adică o serie de cartele pot dispune
de aceeaşi ofertă de servicii ale companiei. Cazul invers nu va fi valabil. Unei cartele nu i se pot asocia mai
multe tipuri de servicii. Prin urmare relaţia dintre cele două entităţi este de tipul unul-la-multe.
16
Pentru a realiza efectiv această relaţie trebuie introdus atributul IdServiciu şi în tabela CartelePrepay, pentru
a identifica tipul de serviciu (tuplul) din tabela Servicii.
Un exemplu al acestui tip de relaţie din cadrul bazei de date pe care o proiectăm este cea dintre tabelele
Abonaţi şi Abonamente. Un abonat poate deţine mai multe abonamente (tipuri de abonamente), iar un
abonament (tip de abonament) este alocat mai multor abonaţi.
Pentru a crea această relaţie am introdus o tabelă suplimetară numită NumereTelefon, care va face
legătura între tabelele Abonaţi şi Abonamente. Între tabele Abonaţi, NumereTelefon şi Abonamente
NumereTelefon există o relaţie de tipul 1 la m. Un abonat poate avea mai multe numere de telefon, iar acelaşi tip
de abonament poate fi folosit pentru mai multe numere de telefon.
Pentru a realiza efectiv această relaţie în tabelul NumereTelefon au fost introduse câmpurile: IdAbonat
şi IdAbonament.
Constrângerile din cadrul unei tabele sunt reguli care se impun în cadrul unei singure tabele şi asigură
integritatea datelor acesteia. Ele sunt de 3 categorii:
constrângeri de domeniu. Aceste constrângeri sunt condiţii care se impun valorilor atributelor şi asigură
integritatea domeniilor atributelor.
constângeri de tuplu (de înregistrare din tabelă). Aceste constrângeri sunt condiţii care se impun
înregistrărilor din tabelă şi asigură identificarea corectă a tuplurilor prin intermediul cheilor primare.
constrângeri impuse de dependenţe de date(dependenţe funcţionale). Acestea sunt constrângeri prin care
valorile unor atribute ale unei entităţi (câmpuri ale tabelei) determină valorile altor atribute ale aceleiaşi
entităţi.
Constrângerile între tabele sunt reguli care se impun între două sau mai multe relaţii. Cele mai importante sunt
constrângerile de integritate referenţială, care se realizează prin intermediul cheilor străine şi asigură asocierea
corectă a tabelelor.
17
2.2.2.6.1. Constrângerile de domeniu
Constrângerile de domeniu sunt condiţii impuse valorilor atributelor pentru ca acestea să corespundă
semnificaţiei pe care o au în realitatea modelată. În reprezentarea unei entităţi printr-un tabel, valorile atributelor
sunt reprezentate pe coloane. Din această cauză aceste constrângeri se mai numesc şi constrângeri de coloană.
• Constrângerea NOT NULL. Valoarea NULL este o valoare particulară, care nu reprezintă valoarea 0, ci lipsă
de informaţie. Această valoare NULL poate apărea când nu se cunosc respectivele informaţii, ca de exemplu, în
cazul bazei de date Telecom, în tabela DateDeContact nu se cunoaşte numărul de telefon alternativ, ori această
informaţie nu este esenţială deorece clientul poate fi contactat folosind alte mijloace şi alte informaţii din acea
tabelă (precum Adresă sau Email). Nu orice atribut poate lua valoarea NULL, ca exemplu, numele unui abonat,
pentru că nu ar avea sens înregistrarea unui abonat al cărui nume nu se cunoaşte. Alte exemple pentru atribute ce
nu pot lua valoarea NULL ar fi numărul de telefon, tipul de abonament, suma datorată, suma disponibilă a
cartelei etc. În astfel de situaţii la definirea relaţiilor se impune atributului constrângerea NOT NULL,
însemnând că acest atribut nu poate lua valoare NULL în orice înregistrare din tabelă .
• Constrângerea DEFAULT. Această constrângere este folosită pentru stabilirea unei valori implicite
(DEFAULT) pentru un atribut al entităţii. În cazul în care la inserarea unei înregistrări nu se specifică valoarea
unui atribut (câmp), atunci acesta primeşte valoarea implicită (dacă a fost definită) sau valoarea NULL (dacă nu
a fost definită o valoare implicită pentru atributul respectiv, dar sunt admise valori NULL). Dacă nu a fost
definită o valoare implicită şi nici nu sunt admise valori NULL se generează o eroare.
• Constrângerea CHECK. Constrângerea CHECK este după cum îi spune şi numele o constrângere de
verificare. În limbajul SQL, domeniile în care pot lua valori atributele se pot stabili ca tipuri de date predefinite.
Pentru fiecare atribut se pot adăuga constrângeri de verificare la definirea tabelului.
O cheie candidată reprezintă o submultime de atribute ale unei entităţi care prezintă proprietatea de
unicitate, adică orice combinaţie de valori ale atributelor supercheii este unică pentru orice stare a relaţiei şi
proprietatea de ireductibilitate, adică nu exista nici o submulţime proprie, nevidă a cheii care sa aibă proprietatea
de unicitate. O cheie candidata poate sa fie simpla (alcatuita dintr-un singur atribut), sau compusa (alcatuita din
mai multe atribute).
Atunci când exista mai multe chei candidate, una dintre ele se alege ca si cheie primara, celelalte chei
candidate fiind numite chei secundare, alternative sau unice.
Exemplu. În cadrul bazei de date pe care dormi să o proiectăm avem o serie de entităţi. Pentru fiecare
dintre acestea pot exista cel puţin o combinaţie ireductibilă de atribute care să identifice unic entitatea şi care să
formeze cheia candidată.
Cea de-a doua submulţime alcătuită din atributele Nume şi Prenume ar putea fi considerată o cheie
candidată. Dacă este divizată în cele două elemente constituente nici unul nu vor putea identifica unic abonatul.
Prin urmare acestă submulţime nu se poate reduce. Problema care se pune este dacă acestă combinaţie de
atribute prezintă proprietatea de unicitate, adică dacă pot exista abonaţi cu acelaşi nume şi prenume. În mod
evident există şanse, deşi acestea sunt destul de mici. Indiferent, submulţimea în discuţie nu beneficiază de
această proprietate. Aşadar, nu este o cheie candidată.
În următorul tabel sunt prezentate cheile candidate pentru fiecare entitate în parte:
19
Pentru tabela DateDeContact am considerat cheile candidat IdContact, Email,
NumărTelefonDeContact, deoare fiecare dintre acestea se bucură de proprietăţile unei asfel de chei (sunt
indivizibile şi unice pentru entitate în cauză). Atributul Adresă a fost elimant din lista de posibile chei deoarece
doi abonaţi pot locui la aceeaşi adresă. Prin urmare înregistrările în tabela DateDeContact pentru adresa celor
doi abonaţi vor fi aceleaşi.
Pentru tabela Contracte cheia candidată considerată este IdContract. Nici un alt atribut, sau
combinaţie de atribute nu prezintă proprietatea de unicitate. Pot exista mai multe contracte cu aceleaşi date de
început şi date de încheiere.
Tabela Tarife are drept chei canditate o cheie simplă IdTarif şi una compusă Apeluri Reţea,
ApeluriExtraReţea, SMSReţea, SMSExtraReţea, MMSReţea, MMSExtraReţea, TraficInternet . Cele două
submulţimi alcătuiesc mulţimea totală de atribute a tabelului Tarife. Pentru atributul IdTarif lucrurile sunt clare.
Celelalte atribute luate ca întreg formează o submulţime care este unică pentru fiecare înregistrare în tabelul
Tarife şi care este totodată o submulţime ireductibilă din punctul de vedere al proprietăţii de unicitate. Fiecare
element al submuţimii nu va putea fi unic pentru entitatea în discuţie. Considerând însă combinaţia de elemente,
nu vor exista două planuri tarifare cu aceleaşi valori pentru atributele respective. Prin urmare submuţimea de
atribute ApeluriReţea, ApeluriExtraReţea, SMSReţea, SMSExtraReţea, MMSReţea, MMSExtraReţea,
TraficInternet este o cheie candidată.
Pentru tabela Facturi cheia candidată este IdFactură. Nici un alt atribut, sau combinaţie de atribute nu
prezintă proprietatea de unicitate. Acest lucru este valabil şi în cazul tabelelor NumereTelefon şi CartelePrepay
cu cheile candidat NumărTelefon respectiv IdPrepay.
La tabela Servicii întâlnim un caz similar cu cel al tabelei Tarife. Aceasta are drept chei candidate o
cheie simplă IdServiciu şi o cheie compusă MinuteGratuite, SMSGratuite, MMSGratuite, Internet,
VideoCall, Roaming . Combinaţia de atribute a cheii compuse este ireductibilă şi unică pentru tabelul Servicii.
Observaţie. În analiza cheilor candidat nu am considerat atributele care fac legătura dintre tabele
precum IdAbonat din tabela DateDeContact sau IdServiu, IdTarif din tabela Abonamente. Aceste atribute
reprezintă un alt tip de chei .
O cheie primară (primary key) este o cheie candidată căreia proiectantul îi conferă un rol special de
accesare şi identificare a tuplurilor relaţiei. În plus, se impune ca atributelor cheii primare să nu admită valori de
NULL şi să nu fie modificate prin operaţii de actualizare a datelor.
O cheie secundară (alternativă, unică) (secondary, alternate, unique key) este o cheie candidată care nu a
fost desemnată de proiectant ca şi cheie primară. Cheile secundare admit valori NULL pentru unele din
atributele lor dacă se respectă condiţia de unicitate a valorilor.
O cheie primară compusă din atributele existente ale tipului de entitate se numeşte cheie naturală. În
general, cheile naturale sunt compuse din mai multe atribute (ceea ce produce scăderea eficienţei operaţiilor
20
relaţionale) şi de cele mai multe ori se folosesc chei artificiale . O cheie primara artificială este un atribut care se
adaugă în schema relatiei pentru identificarea unică a tuplurilor.
Un exemplu de cheie primară naturală este cheia NumărTelefon. Am considerat că în acest caz este mai
util şi mai uşor să se păstreze cheia naturală, pentru un lucru mai eficient cu baza de date. Introducerea unui
câmp IdNumărTelefon ar fi fost mai degrabă un dezavantaj decât un avantaj.
Printre cheile candidat existau spre exemplu şi chei naturale compuse din mai multe atribute precum
cheia Apeluri Reţea, ApeluriExtraReţea, SMSReţea, SMSExtraReţea, MMSReţea, MMSExtraReţea,
MesagerieVocală, TraficInternet . Folosirea unei astfel de chei drept cheie primară ar fi fost dificlă, luând în
considerare relaţia tabelei Tarife cu tabela Abonamente şi faptul că în tabela Abonamente există un câmp de
identificare a tabelei Tarife (IdTarif), câmp ce corespunde cheii primare a acestei tabele. Cum ar fi fost dacă în
loc de atributul IdTarif s-ar fi folosit submulţimea Apeluri Reţea, ApeluriExtraReţea, SMSReţea,
SMSExtraReţea, MMSReţea, MMSExtraReţea, TraficInternet . În primul rând ineficient, având în vedere
numărul de atribute iar în al doilea rând tabela Tarife ar fi fost redundantă.
În următorul tabel sunt ilustrate cheile primare pentru fiecare din entităţile bazei de date:
21
2.2.2.6.3. Constrângeri între tabele
Relaţiile dintre tipurile de entităţi definite în modelul conceptual al unei baze de date se realizează în modelul
relaţional prin intermediul cheilor străine.
O cheie străină (cheie externă ) este o submulţime de atribute ale unei entităţi E1 care referă entitatea E2 şi
îndeplineşte următoarele condiţii: atributele cheii străine din E1 sunt definite pe domenii compatibile cu cele ale
atributelor cheii din entitatea E2, şi cheia din entitatea E2 este cheie primară în această relaţie. Această cheie
străină determină o asociere între câmpurile unor tabele cu cele ale altei tabele şi creează abilitatea de realizare
a unirii tabelelor respective prin intermediul operaţiilor JOIN.
Integritatea referenţială este proprietatea bazei de date care garantează că oricare valoare a unei chei străine se
regăseşte printre valorile cheii corespunzătoare din relaţia referită, sau cheia străină are valoarea NULL (dacă
atributele acesteia nu sunt supuse constrângerii NOT NULL).
Exemplu:
Revenind la baza de date ce se doreşte a fi proiectată, numită Telecom vom analiza fiecare relaţie în parte şi
totodată vom evidenţia cheile străine corespunzătoare.
Se vor analiza mai întâi relaţiile unul-la-unul. Unui element din mulţimea E1 îi corespunde un singur element
din mulţimea E2 şi reciproc.
Relaţia dintre tabela DateDeContact şi tabela Abonaţi este o relaţie de tipul 1-1. Tabela DateDeContact referă
tabela Abonaţi prin atributul DateDeContact.IdAbonat. *Observaţie. Această notaţie se foloseşte în limbajul
SQL în momentul în care două tabele au acelaşi atribut şi se doreşte să se facă diferenţerea dintre cele două.
Atributul IdAbonat din cadrul tabelei DateDeContact va fi cheia străină în această relaţie. Aceasta corespunde
practic cheii primare din tabela Abonaţi. Aşadar, cele două vor avea acelaşi domeniu de definiţie şi valoarea
atrbutului DateDeContact.IdAbonat se va regăsi printre una din valorile atributului Abonaţi.IdAbonat. Pentru o
mai bună înţelegere vom considera un exemplu practic.
Să presupunem că în tabela Abonaţi şi în tabela DateDeContact avem o serie de înregistrări. Relaţia dintre cele
două este evidenţiată în următoarea figură.
Observaţii
22
Valorile pentru câmpul IdAbonat din cadrul tabelului DateDeContact corespund celor pentru câmpul
IdAbonat din cadrul tabelului Abonaţi.
Aşadar prima înregistrare din tabelul DateDeContact corespunde primei înregistrări din tabela Abonaţi,
adică abonatul Popescu Andreea are drept date de contact adresa Str. Aleea Plopilor, emailul
andreea.popescu@yahoo.com şi numărul alternativ de telefon 0740000886. Cea de-a doua înregistrare
în tabelul DateDeContact corespunde celei de-a treia înregistrări din tabela Abonaţi. Cea de-a treia
înregistrare din tabelul DateDeContact corespunde celei de-a doua înregistrări din tabela Abonaţi.
Din acest exemplu reiese deasemenea tipul de relaţie dintre cele două tabele. Fiecărei înregistrări din un
tabel îi corespunde câte o înregistrare şi numai una din tabelul celălalt.
Cheia străină pentru această relaţie este IdAbonat.
Relaţia dintre tabela Abonamente şi tabela Tarife. Această relaţie este deasemenea o relaţie de tipul 1-1.
Tabela Abonamente referă tabela Tarife prin atributul Abonamente.IdTarif, acesta fiind practic cheia străină în
cazul acestei relaţii. Fiecărui tip de abonament îi va corespunde un tarif şi numai unul. Tabela tarife nu se referă
la costul efectiv al abonamentului ci la costul suplimentar care se adaugă pentru folosirea anumitor servicii.
Atributul IdTarif este cheie primară pentru tabela Tarife şi corespunde cheii străine din tabelul Abonamente. Ca
şi în cazul precedent vom evidenţia această relaţie prin un exemplu.
Să presupunem că în tabela Tarife şi în tabela Abonamnete avem înregistrări. Relaţia dintre cele două tabele este
ilustrată în figura următoare:
Observaţii
Valorile atributului IdTarif din cadrul tabelei Abonamente se regăsesc printre valorile atributului IdTarif
din cadrul tabelei Tarife.
Fiecarei înregistrări din tabela abonamente îi corespunde câte o înregistrare din tabela Tarife şi reciproc
rezultând o relaţie de tipul 1-1
Abonamentul VoceNaţional dispunde de planul tarifar cu Id-ul 2 unde tarifele pentru covorbirile din
cadrul reţelei cât şi pentru cele din afara acesteia sunt asemănătoare.
Cheia străină în cazul acestei relaţii va aparţine tabelei Abonamente şi va fi IdTarif.
În tabela Abonamente există o a doua chei străină ce face referire la tabela Servicii. Relaţia dintre cele
două tabele va fi analizată în cele ce urmează.
23
Relaţia dintre tabela CartelePrepay şi tabela NumereTelefon. (Relaţie 1-1) Tabela NumereDeTelefon face
referinţă la tabela CartelePrepay prin atributul IdPrepay, care este de altfel cheia străină. Se observă că la fel ca
în cazurile precedente IdPrepay este cheie primară pentru tabelul CartelePrepay şi cheie străină pentru
NumereTelefon. Relaţia dintre cele două tabele este totuşi mai complexă faţă de cazul precedent. În tabela
NumereTelefon se mai regăsesc încă două chei străine. Aceasta este practic tabela de legătură în relaţia multe-
la-multe dintre Abonaţi şi Abonamente. Se pleacă de la premisa că un abonat poate avea mai multe numere de
telefon, acestea putând fi folosite fie doar pentru abonamente, fie pentru abonamente şi pentru caretele prepay.
Aşadar un abonat poate deţine şi un abonament şi o cartelă, lucru ce este posibil în realitatea de zi cu zi. Un
număr de telefon poate fi alocat unei cartele fără a se cunoaşte clientul. Acest lucru se întâmplă atunci când
clientul respectiv nu deţine un abonament şi nu se cunosc alte informaţii despre acesta. În cazul de faţă vom
considera următorul exemplu:
Observaţii
Valorile atributului IdPrepay din tabela NumereTelefon se regăsesc printre valorile atributului IdPrepay
din tabela CartelePrepay.
Cheia străină este IdPrepay
Din acest exemplu se poate deduce faptul că numerele de telefon pot fi alocate în trei moduri:
o Unui abonat ce deţine un abonament fără să deţină o cartelă preapy. Este cazul primelor 3
înregistrări din tabel. Adică abonatul cu Id-ul 2, deţine abonamentul cu Id-ul 1 şi nu deţine
cartelă prepay.
o Unei cartele prepay ce este deţinută de un abonat (are şi un abonament).
o Unei cartele prepay pentru care nu se cunosc date despre deţinător.
Tabela CartelePrepay mai are o cheie externă (străină) şi anume IdServiciu care face legătura 1-n cu
tabela Servicii.
Vom analiza în continuare relaţia de tipul multe-la-multe dintre tabelele Abonaţi şi Abonamente.
Tabela intermediară este NumereTelefon. Între tabelele Abonaţi respectiv Abonamente şi tabela NumeTelefon
există relaţii de tipul unul-la-multe. Pentru această analiză vom considera tabelele Abonaţi, Abonamente şi
NumereTelefon exemplificate mai sus.
24
În cadrul relaţiei Abonaţi-NumereTelefon (relaţie 1-n) unui abonat îi va corespunde mai multe numere de
telefon. Cheia străină definitorie pentru această relaţie face parte din tabela NumereTelefon şi este IdAbonat.
În cadrul relaţiei Abonamente-NumereTelefon (relaţie 1-n) unui abonament i se vor aloca mai multe numere de
telefon. Cheia străină definitorie pentru această relaţie face parte din tabela NumerTelefon şi este IdAbonament.
Din exemplele de înregistrări reiese că unui abonat (abonatul cu Id-ul 2) îi poate corespunde mai multe numere
de telefon (0771502506 şi 0771956525). Acelaşi număr de telefon nu poate fi alocat însă mai multor abonaţi.
Prin urmare am dovedit că relţia dintre cele două este de tipul 1-n.
Un abonament poate fi alocat mai multor numere de telefon aşa cum este cazul numerelor de telefon
0771502506 şi 0771771177 cărora li se alocă abonamentul cu Id 1. Un număr de telefon corespunde însă unui
singur abonament. Prin urmare relaţia dintre cele două tabele este de tip 1-n.
Tot din exemplele de mai sus se poate deduce relaţia de tip n-m dintre tabelele Abonaţi şi Abonamente. Un
abonat poate deţine mai multe abonamente aşa cum este cazul abonatului 2 ( Luiza Vișan ) căreia îi corespund
abonamentele cu Id-urile 1 şi 3 (VoceNaţional respectiv VoceStandard). Iar un abonament poate fi alocat mai
multor clienţi aşa cum apare în cazul abonamentului cu Id 1 (VoceNaţional) ce aparţine atât clientului cu Id 1
(Andreea Popescu) cât şi clientului cu Id 3 (Razvan Barb).
Observaţii
Cum am menţionat anterior tabela NumereTelefon este asociată şi cu tabela CartelePreapay şi cuprinde
pe lângă cheile străine IdAbonat şi IdAbonament cheau străină IdPrepay.
Modul de alocare a numerelor de telefon poate diferi. Numerele de telefon pot corespunde fie unui
abonament fie unui prepay. Primele trei înregistrări din tabela prepay corespund unei alocări de
abonament. Următorele două corespund alocării numerelor respective unor cartele prepay. În acest caz,
pentru un număr de telefon se cunoaşte şi deţinătorul cartelei respective iar pentru celălalt nu se cunosc
informaţii suplimentare despre client.
Lipsa de informaţie corespunde introducerii unei valori NULL în câmpul respectiv.
25
Se vor considera deasemenea în continuare şi relaţiile de tipul unul-la-multe.
Relaţia Servicii-Abonamente . Este o relaţie de tipul 1-n, un serviciu poate corespunde mai multor abonamente
iar un abonament poate avea un singur serviciu. Cheia străină (externă) pentru această asociere este IdServiciu şi
aparţine tabelei Abonamente. Atributul IdServiciu este pentru tabela Servicii cheia primară.
Observaţii
Valorile atributului IdServiciu din tabela Abonamnete se regăsesc printre valorile atributului IdServiciu
din tabela Servicii.
Se observă de asemenea tipul de relaţie existentă prin faptul că abonamentele cu Id-urile 1 şi 2 dispun de
acelaşi serviciu, serviciul cu Id 1
Relaţia Servicii-CartelePrepay . Este o relaţie de tipul 1-n, un serviciu poate corespunde mai multor cartele
prepay iar o cartelă prepay poate dispune de un singur serviciu. Cheia străină (externă) pentru această asociere
este IdServiciu şi aparţine tabelei CartelePrepay. Atributul IdServiciu este pentru tabela Servicii cheia primară.
Observaţii
Valorile atributului IdServiciu din tabela CartelePrepay (cheie străină) se regăsesc printre valorile
atributului IdServiciu din tabela Servicii (cheia primară a tabelului Servicii).
26
Clientul prepay cu IdPrepay 1 beneficează de serviciul cu IdServiciu 1 iar clientul cu IdPrepay 2
dispune de serviciul cu IdServiciu 2.
Acest exemplu nu evidenţiază tipul de relaţie, însă în tabelul cartele prepay se mai pot insera date
corespunzătoare unei noi cartele care să beneficieze de serviciul cu Id-ul 1. În acest caz relaţia a fost
exemplificată prin faptul că un serviciu se poate oferi mai multor cartele prepay.
Relaţia Abonaţi-Facturi. Această relaţie este la rândul său o relaţie de tipul unul-la-multe. Asocierea dintre
cele două tabele este realizată prin folosirea în tabelul Facturi a cheii străine IdAbonat. Această relaţie este o
relaţie tipică 1-n în care unui abonat îi corepunde mai multe facturi în funcţie de vechimea acesteia. Pentru a
exemplifica vom folosi tabelele Abonaţi şi Facturi.
Observaţii
Valorile atributului IdAbonat din tabela Facturi(cheie străină) se regăsesc printre valorile atributului
IdAbonat din tabela Abonaţi (cheia primară a tabelului Abonaţi).
Prin acest exemplu se pune în evidenţă tipul de relaţie. Abonatul cu IdAbonat 1 are asociate 2 facturi cu
dăţi de facturare respectiv scadente diferite. Factura cu Id 1 este o factură mai veche, iar cea cu Id 2 este
mai recentă.
Relaţia Abonaţi-Contracte. Această relaţie de tipul unul-la-multe. Asocierea dintre cele două tabele este
realizată prin folosirea în tabelul Contracte a cheii străine IdAbonat. Tabele sunt exemplificate mai jos.
27
Observaţii
Un abonat, cu mai multe numere de telefon, încheie câte un contract pentru fiecare dintre acestea. Prin
urmare un abonat poate avea mai multe contracte iar un contract este asociat unui singur abonat.
Din cele două tabele putem deduce tipul de relaţie dintre acestea. Abonatul cu IdAbonat 2 are două
contracte cu Id-urile 1 şi 2 pentru două numere de telefon.
Tabela Contracte mai cuprinde o altă cheie străină NumărTelefon ce leagă tabela NumereTelefon de
tabela Contracte în o relaţie de tipul unul-la-multe.
Observaţii
Valorile introduse în câmpul NumărTelefon al tabelului Contracte corespund celor din câmpul
NumărTelefon al tabelului NumereTelefon.
Faţă de exemplu precedent, în tabela Contracte s-a mai adăugat o nouă înregistrare pentru a demonstra
tipul de relaţie dintre cele două tabele. Noua înregistrare corespunde unui contract mai vechi (data de
început şi de sfârşit anterioare) al abonatului cu IdAbonat 3 pentru numărul de telefon 0771897887.
Pentru acelaşi număr de telefon în tabelul Contracte există şi înregistrarea cu IdContract 4 care deţine
cele mai recente informaţii despre contractul pentru numărul respectiv. Rezultă, deci, că şi acestă relaţie
este de tipul 1-n, având cheia străină NumărTelefon.
28
2.3. Etapa a III-a. Proiectarea logică a Bazei de Date
În acestă etapă vom face o anliza a schemei coceptuale create şi vom determina dacă schema propusă poate
fi transpusă într-o schemă logică. Proiectarea logică a bazei de date ar presupune anumiţi paşi importanţi
precum:
transpunerea modelului conceptual local în modelul de date logic local (eliminarea relațiilor M:N prin
înlocuirea cu relații de tip 1:M sau alte metode;
eliminarea relațiilor recursive prin înlocuirea cu relații dependente;
eliminarea atributelor multiple;
reexaminarea relațiilor 1:1, eliminarea relațiilor redundante;
O parte din aceşti paşi au fost deja luaţi în considerare deoarece cele două etape de proiectare (conceptuală şi
logică) au fost oarecum contopite într-o singură etapă. S-a pornit încă de la început cu o idee asupra tipurilor de
relaţii ce vor fi folosite şi s-a analizat necesitatea fiecări entităţi în parte. Această etapă are însă scopul de a
analiza mai în detaliu schema prezentată şi de a o valida în cazul în care aceasta varintă corespunde cerinţelor
utilizatorului şi este optimă din punctul de vedere al relevanţei şi al relaţiilor dintre tabele.
Primul pas de eliminare a relaţiilor M-N a fost abordat . Singura relaţie de tipul M-N din cadrul schemei este
relaţia dintre Abonaţi şi Abonamente , relaţie tranpusă în două folosind tabela intermediară Numere Telefon.
Sigur, puteau exista şi alte alegeri însă aceasta este una dintre cele mai potrivite. Nu numai că tabela
NumereTelefon leagă abonaţii de abonamente, ci aceasta face deopotrivă legătura dintre abonaţi şi cartele
Prepay, relaţie de tipul 1-N.
O relaţie recursivă apare atunci când o entitate depinde de ea însăşi. Un exemplu bun pentru a asfel de relaţie
este entitatea Angajat (persoană care lucrează într-o companie). Acesta poate fi conduce alţi angajaţi şi poate fi
condus la rândul său de un alt angajat. Prin urmare se crează o relaţie recursivă. Astfel de relaţii nu sunt întâlnite
în cadrul schemei conceptuale propuse în această lucrare. Spre exemplu entitatea Abonaţi prezintă numai relaţii
dependente, precum cele cu entităţile DateDeContact, Facturi, Contracte, NumereTelefon (Abonamente,
CartelePrepay).
Schema Conceptuală propusă nu deţine atribute multiple. Un exemplu în care acest lucru ar fi fost posibil ar fi
folosirea atributelor din cadrul tabelei Servicii ca atribute în tabele Abonamente şi CartelePrepay. Fiecare dintre
aceste două entităţi dispune de anumite servicii oferite de compania de telefonie mobilă. Însă folosirea acestor
atribute în dublu exemplar în ambele tabele ar fi redundantă şi ar complica foarte mult schema. Prin urmare s-a
preferat crearea unei tabele comune numită Servicii care sa încorporeze atributele comune celor două entităţi.
Relaţiile de tipul unul-la-unul propuse sunt relaţiile dintre Tabela DateDeContact şi Tabela Abonaţi, Tabela
Abonamente şi Tabela Tarife, Tabela CartelePrepay şi Tabela NumereTelefon. Dintre acestea, relaţiile care ar
putea fi considerate redudante ar fi relaţia dintre Abonaţi şi DateDeContact şi relaţia dintre Abonamente şi
Tarife. Relaţia dintre CartelePrepay şi NumerTelefon este o relaţie specială care leagă totodată tabela
CartelePrepay de tabela Abonaţi.
29
O analiză a relaţiei 1-1 dintre tabelel Abonaţi şi DateDeContact ar putea conduce la ideea că aceasta este o
relaţie redundantă şi atributele din cadrul tabelei DateDeContact ar putea fi transferate în tabelul Abonaţi.
Acelaşi lucru poate fi dedus şi pentru cea de-a doua relaţie dintre Abonamente şi Tarife. Problema care se pune
însă este aglomerarea tabelelor în loc sa avem un tabel cu câteva coloane avem unul cu un număr dublu sau
chiar triplu de coloane. În cazul relaţiei Abonamente-Tarife ar putea exista posibilitatea ca tabelul Tarife să fie
asociat cu un alt tabel, spre exemplu tabelul CartelePrepay. Ori dacă acest lucru are loc şi în loc de tabeulul
Tarife avem un singur tabel Abonamente ce cuprinde şi atributele acestuia ne vom afla în situaţia unor atribute
multiple. Totodată, separea celor două tabele este necesară pentru cazurile în care utilizatorul nu este interesat de
tipul de tarif folosit ci de numele sau costul abonamentului sau de serviciile de care abonamentul dispune. Şi
atunci o supraîncărcare a tabelului cu coloane nu este o idee prea bună. Acelaşi lucru se poate spune şi despre
relaţia Abonaţi-DateDeContact. Separarea în două entităţi diferite este mai avantajoasă decât păstrarea unei
etităţi singulare. Astfel informaţiile referitoare la datele personale a clientului sunt separate de informaţiile
referitoare la acesta ca abonat al unei companii de telefonie mobilă.
Vom lucra cu baza de date relaţională Oracle Database 11g Express Edition.
Baza de date Oracle 11g a fost proiectată pentru a stoca şi administra datele unei întreprinderi. Această bază
de date reduce costurile de management şi asigură servicii de înaltă calitate. Oracle Database XE este uşor de
instalat şi de administrat. Se foloşte o interfaţă de tipul Home-Page accesată prin intermediul browser-ului, cu
ajutotul căreia se pot crea tabele , vederi şi alte obiecte, se pot importa/exporta date, se pot crea ineterogări şi
scripturi SQL.
Serverul de aplicaţii Oracle 10 g asigură o platformă completă pentru dezvolatarea şi implementarea aplicaţiilor
enterprise, integrând multe funcţii incluzând J2EE, Servicii Web etc.
Serverul Oracle are suport atât pentru modelul de date relaţional cât şi pentru cel obiect-relaţional.
30
Capitolul 3. Implementarea fizică a bazei de date
Pentru a implementa baza de date TELECOM am instalat pentru început mediul Oracle Database 10g
Express Edition. Cum orice bază de date are administratori şi utilizatori vom începe cu crearea acestora.
Pentru a crea contul de administrator şi conturile de utilizatori se vor accesa Administration> Database Users>
Create User.
În cazul contului de administator se va selecta căsuţa DBA, care va indica că userul AdminTelecom are drepturi
de administrator. Parola pentru admin va fi „oracle” .
31
După apăsarea butonului create, în lista cu utilizatori va apărea contul nou creat.
Acelaşi procedeu se aplică şi pentru crearea conturilor de utilizator, numai că, în acest caz nu se va mai
selecta casuţa DBA. Aceştia vor fi în număr de trei. Parola pentru useri va fi „oracle” .
32
În final lista cu utilizatori va arata în felul următor:
Cel de-al doilea pas în crearea bazei de date este crearea tabelelor. Tablele pe care le vom crea au fost prezentate
în secţiunile precedente. Acestea sunt în număr de nouă şi poartă numele: Abonaţi, DateDeContact, Contracte,
Abonamente, Tarife, Facturi, NumereTelefon, Servicii, CartelePrepay.
Comenzile de creare şi interogare a bazei de date se vor da în linie de comandă. Acest lucru se poate face prin
accesarea SQL -> SQL Commands -> Enter command.
33
Observaţie. În sintaxa prezentată, nu au fost incluse contrângeri (de domeniu, de tuplu, constrângeri impuse de
dependenţe de date). Acestea se pot defini fie odată cu crearea tabelului, fie pot fi adăugate în tabel după ce
acesta a fost creat, folosind comanda SQL “ALTER TABLE ADD CONSTRAINT...”. Ambele situaţii vor fi
prezentate în cele ce urmează.
Comanda ALTER TABLE poate fi folosită în general pentru eventualele modificări ce se aduc într-un tabel.
Sintaxa pentru comanda SQL de modificare a tabelelor poate fi una din cele menţionate mai jos:
Cum am menţionat mai sus există cazul în care se doreşte adăugarea constrângerilor după crearea tabelului.
34
CREATE TABLE Abonati (
IdAbonat NUMBER(10) NOT NULL,
Nume VARCHAR(45) NOT NULL ,
Prenume VARCHAR(45) NOT NULL ,
CNP NUMBER(13) NOT NULL );
Observaţii.
Tipurile de date pentru atributele folosite sunt number și varchar(variable-length caracter data). Tipul de
dată number este folosit pentru codul de identificare a abonatului şi pentru CNP. Precizia acestuia
pentru atributul IdAbonat este de 10, în ideea că compania de telefonie mobilă are un număr
impresionant de abonaţi. Pentru CNP, numărul de cifre folosite este de 13, atât cât este şi lungimea unui
cod numeric personal.
Tipul de dată varchar reprezintă un şir de caractere de lungime variabilă, dimensiunea a fost aleasă
arbitrar 45 de caractere. Numărul maxim de carctere este de 4000, iar numărul minim 1 caracter.
Varchar a fost folosit pentru atributele nume şi prenume.
Cheia primară nu a fost introdusă încă. Pentru a introduce în tabel cheia primară vom folosi o comanda
de alterare a tabelului, prin care vom adăuga contrângerea de cheie primară. Comanda este: ALTER
TABLE Abonati ADD CONSTRAINT pkAbonati PRIMARY KEY (IdAbonat)
35
Dacă se doreşte se poate adăuga şi o cheie candidat folosind costrângerea UNIQUE. Dorim spre
exemplu ca atributul CNP să fie unic, prin urmare vom da comanda: ALTER TABLE Abonati ADD
CONSTRAINT uniqueCNP UNIQUE (CNP)
36
Observaţii.
Cheile străine vor fi introduse după ce au fost create toate tabelele pentru a nu întâmpina probleme.
37
străine iar constrângerile pentru chei străine vor fi adăugate ulterior. Cheia primară a acestui tabel este
IdContract
38
3.2.5. Crearea tabelului Abonamente
Tabelul Abonamente conţine tipurile de abonamente oferite de compania de telefonie mobilă. Această tabelă
cuprinde coloanele: IdAbonament, TipAbonament, Cost, IdServiciu, IdTarif. Cheia primară a acestei tabele este
IdAbonament. Tabela se află într-o relaţie de tipul unul-la-multe cu tabela Servicii, asociere definită prin cheia
străină IdServiciu şi într-o relaţie unul-la-unul cu tabela Tarife, asociere definită prin cheia străină IdTarif. Se
poate defini de asemena o constrângere de tip UNIQUE în cazul atributului TipAbonament.
39
Observaţii.
Am uitat să introduc coloana IdTarif. Pentru a introduce această coloană folosim comanda: ALTER
TABLE Abonamente ADD IdTarif NUMBER(10) NOT NULL;
40
Observaţii.
Am introdus din greşeală coloana MesagerieVocală. Pentru a scoate această coloană din tabel se
foloseşte următoarea comandă: ALTER TABLE Tarife DROP COLUMN MesagerieVocală;
41
IdPrepay NUMBER(10),
CONSTRAINT pkNumereTelefon
PRIMARY KEY (NumarTelefon) );
Observaţie.
Pentru coloanele IdAbonat, IdAbonament, IdPrepay nu am mai pus contrângerea NOT NULL. Motivul
este acela că aceste câmpuri pot lua valoarea NULL atunci când un număr de telefon este asociat cu un
anumit tip de client (abonat, client prepay sau abonat cu cartela prepay). Aşa cum am exemplificat în
capitolele anterioare atributul IdPrepay poate lua valoarea NULL în cazul în care numărul de telefon
este asociat unui abonat care deţine abonamnetul X. Totodată, atributele IdAbonat şi IdAbonamenete
pot fi NULL atunci când numărul de telefon este asociat cu o cartelă prepay.
42
3.2.9. Crearea tabelului CartelePrepay
Tabela CartelePrepay reprezintă tabela ce cuprinde datele legate de cartele prepay. Coloanele acestei tabele sunt
următoarele: IdPrepay, SumaDisponibila, Valabilitate, VechimeInRetea, IdServiciu. Cheia primară ce identifică
unic tuplurile acestei tabele este IdPrepay. Cheia străină corespunzătoare relaţiei dintre această tabelă şi tabela
Servicii este IdServiciu.
43
3.3. Introducerea constrângerilor Foreign Key (Cheie Străină)
Constrângerea FOREIGN KEY desemnează o coloană sau o combinaţie de coloane drept cheie străină şi
stabileşte legătura cu cheia primară sau unică din acelaşi tabel sau dintr-un tabel diferit.
Observaţii.
Cuvântul cheie FOREIGN KEY defineşte coloana din tabelul ce referă cheie străină (În acest caz
IdAbonat)
Cuvântul cheie REFERENCES identifică tabelul şi coloana referite (În acest caz Abonaţi(IdAbonat))
Cuvântul cheie ON DELETE CASCADE presupune că atunci când un rând este şters din tabelul referit,
rândul din tabelul ce referă va fi de asemenea şters. Fără acest cuvânt cheie sau fără cuvântul cheie ON
DELETE SET NULL (converteşte valorile cheii străine dependentă în NULL) rândul din tabelul referit
nu va putea fi şters.
44
3.3.3. Introducerea cheii străine IdAbonat în tabelul Facturi
Tabela Abonaţi cu tabela Facturi se află într-o relaţie de tipul 1-n. Comanda pentru introducerea constrângerii
este: ALTER TABLE Facturi ADD CONSTRAINT fkFacturi FOREIGN KEY (IdAbonat)
REFERENCES Abonati(IdAbonat) ON DELETE CASCADE ;
45
3.3.4. Introducerea cheilor străine IdServiciu, IdTarif în tabelul Abonamente
Tabelul Servicii cu tabelul Abonamnete sunt asociate prin o relaţie de tipul 1-n. Tabelul Tarife cu tabelul
Abonamente sunt asociate prin o relaţie 1-1. Comenzile pentru introducerea constrângerilor sunt:
47
3.3.6. Introducerea cheii străine IdServiciu în tabelul CartelePrepay
Între tabela Servicii şi tabela CartelePrepay există o relaţie de tipul 1-n. Comanda pentru introducerea
constrângerii este: ALTER TABLE CartelePrepay ADD CONSTRAINT fkCartelePrepay FOREIGN
KEY (IdServiciu) REFERENCES Servicii(IdServiciu) ON DELETE CASCADE ;
Pasul cu numărul patru în implementarea bazei de date este popularea tabelelor cu date
Vom insera mai întâi datele în tabelele care nu conţin chei străine pentru a evita orice neconcordanţe. Aceste
tabele sunt Abonaţi, Servicii şi Tarife.
Pentru a vedea rezultatul comnzii de inserare vom folosi comanda SELECT * FROM nume_tabel, comandă ce
are ca rezultat selecţia tuturor tuplurilor din cadrul tabelului. Operatorul * este folosit pentru a simboliza toate
coloanele ce alcătuiesc tabelul . Prin urmare se vor selecta valorile din tabel pentru toate coloanele acestuia.
În acest caz specific, pentru a introduce date în tabela Abonaţi folosim comanda:
INSERT ALL
INTO Abonati (IdAbonat, Nume, Prenume, CNP) VALUES ('1', 'Popescu', 'Andreea',
'2881218180051')
INTO Abonati (IdAbonat, Nume, Prenume, CNP) VALUES ('2', 'Vișan', 'Luiza',
'2900624030155')
INTO Abonati (IdAbonat, Nume, Prenume, CNP) VALUES ('3', 'Barb', 'Răzvan',
'1830415232254')
Pentru a verifica introducerea corectă a datelor în tabelul Abonaţi vom folosi comanda: SELECT * FROM
Abonati. Rezultatul rulării comenzii este redat în imaginea de mai jos. Se poate observa ca datele au fost corect
introduse.
49
3.4.2. Introducerea datelor în tabela Servicii
Introducerea datelor în tabela Servicii se execută utilizând comanda:
INSERT ALL
INTO Servicii (IdServiciu, MinuteGratuite, SMSGratuite, MMSGratuite, Internet,
VideoCall, Roaming) VALUES ('1', '100', '100', '10', 'Activ', 'Inactiv', 'Inactiv')
INTO Servicii (IdServiciu, MinuteGratuite, SMSGratuite, MMSGratuite, Internet,
VideoCall, Roaming) VALUES ('2', '150', '50', '5', 'Activ', 'Inactiv', 'Activ')
INTO Servicii (IdServiciu, MinuteGratuite, SMSGratuite, MMSGratuite, Internet,
VideoCall, Roaming) VALUES ('3', '1000', '1000', '100', 'Activ', 'Activ', 'Activ')
INTO Servicii (IdServiciu, MinuteGratuite, SMSGratuite, MMSGratuite, Internet,
VideoCall, Roaming) VALUES ('4', '500', '250', '20', 'Activ', 'Activ', 'Inactiv')
INTO Servicii (IdServiciu, MinuteGratuite, SMSGratuite, MMSGratuite, Internet,
VideoCall, Roaming) VALUES ('5', '100', '100', '10', 'Activ', 'Inactiv', 'Activ')
INTO Servicii (IdServiciu, MinuteGratuite, SMSGratuite, MMSGratuite, Internet,
VideoCall, Roaming) VALUES ('6', '50', '50', '0', 'Inactiv', 'Inactiv', 'Inactiv')
SELECT 1 FROM DUAL
50
Pentru a verifica introducerea corectă a datelor în tabelul Servicii vom folosi comanda: SELECT * FROM
Servicii. Rezultatul rulării comenzii se poate observa în imaginea de mai jos.
INSERT ALL
INTO Tarife (IdTarif , Apeluri Reţea, ApeluriExtraReţea, SMSReţea, SMSExtraReţea,
MMSReţea, MMSExtraReţea, TraficInternet) VALUES ('1','5', '7', '3', '5', '10', '20', '10')
51
Rezultatul inserării poate fi observat în imaginea de mai jos:
52
Comanda pentru introducerea datelor în tabela DateDeContact este:
INSERT ALL
INTO DateDeContact (IdContact, Adresă, Email, NumărTelefonDeContact , IdAbonat)
VALUES ('1', ' Str. Aleea Plopilor ', ' andreea.popescu@yahoo.com ', '0740000886', '1')
INTO DateDeContact (IdContact, Adresă, Email, NumărTelefonDeContact, IdAbonat)
VALUES ('2', ' Bld. Iuliu Maniu nr 50 ', ' luiza.vișan@yahoo.com ', '0731218414', '2')
INTO DateDeContact (IdContact, Adresă, Email, NumărTelefonDeContact, IdAbonat)
VALUES ('3', ' Str. Clucerului ', ' razvan.barb@yahoo.com ', '0768900001', '3')
Observaţie. În imaginea de mai sus se poate vedea că cifra 0 din faţa numărului de telefon nu apare. Acest lucru
se datorează faptului că atributul NumarTelefonContact a fost definit ca tip de dată number, iar SGBD a
considerat că cifra 0 în faţa unui număr este irelevantă. Pentru a evita acest lucru coloana NumarTelefonContact
ar fi trebuit definita drept tip de date caracter. Pentru a nu complica lucrurile, tipul de data în acest exemplu şi în
53
exemplele ce vor urma nu vor fi modificate, întrucât nu este vorba de o bază de date reală, ci doar de un
exemplu teoretic.
INSERT ALL
INTO Facturi (IdFactura, DataFacturare, DataScadenta, TotalulDePlata, IdAbonat)
VALUES ('1', ' 10/09/2014', ' 20/09/2014', '10', '1')
54
Observaţie. Pentru a pune în evidenţă, totuşi, tipul de relaţie dintre tabele Abonaţi şi tabela Facturi (1-n) s-a
considerat introducerea unei înregistrări pentru o factură anterioară corespunzătoare abonatului cu Id 1. Prin
urmare, în acest exemplu acest abonat deţine 2 facturi, cea din luna curentă şi cea din luna anterioară, conturând
astfel ideea de relaţie unul-la-multe.
INSERT ALL
INTO Abonamente (IdAbonament, TipAbonament, Cost, IdServiciu, IdTarif) VALUES
('1', 'VoceNational ', '6', '1', '2')
INTO Abonamente (IdAbonament, TipAbonament, Cost, IdServiciu, IdTarif) VALUES
('2', 'VoceReţea ', '6', '2', '3')
INTO Abonamente (IdAbonament, TipAbonament, Cost, IdServiciu, IdTarif) VALUES
('3', 'VoceStandard ', '6', '1', '1')
INTO Abonamente (IdAbonament, TipAbonament, Cost, IdServiciu, IdTarif) VALUES
('4', 'VoceExcelent', '25', '3', '5')
INTO Abonamente (IdAbonament, TipAbonament, Cost, IdServiciu, IdTarif) VALUES
('5', 'VoceInternet', '15', '4', '4')
INTO Abonamente (IdAbonament, TipAbonament, Cost, IdServiciu, IdTarif) VALUES
('6', 'VoceMini', '4', '6', '6')
SELECT 1 FROM DUAL
55
Rezultatul comenzii este următorul:
Observaţie. La fel ca în exemplul teoretic folosit pentru a pune în evidenţă relaţiile dintre tabelele Abonaţi,
Servicii şi Tarife se poate observa că tipul de relaţie este respectat. În cazul relaţiei 1-1 dintre tabelele
Abonamnete şi Tarife observăm că toate valorile pentru IdTarif din tabelul tarife corespund abonamnetelor în
cauză, fiecărui tip de abonamnet fiindu-i asociat un tip de tarif. Relaţia dintre Abonamnete şi Servicii (n-1) este
de asemenea evidenţiată în acest exemplu. Se poate observa că abonamnetele cu Id-urile 1 şi 3 dispun de acelaşi
tip de serviciu (IdServiciu 1).
56
3.4.7. Introducerea datelor în tabela CartelePrepay
Comanda de introducere a datelor în tabela Prepay este:
INSERT ALL
INTO CartelePrepay (IdPrepay, SumaDisponibila, Valabilitate, IdServiciu) VALUES ('1',
'5 ', '10/12/2014', '1')
INTO CartelePrepay (IdPrepay, SumaDisponibila, Valabilitate, IdServiciu) VALUES ('2',
'10 ', '10/01/2015', '2')
INTO CartelePrepay (IdPrepay, SumaDisponibila, Valabilitate, IdServiciu) VALUES ('3',
'15', '11/02/2015', '1')
INTO CartelePrepay (IdPrepay, SumaDisponibila, Valabilitate, IdServiciu) VALUES ('4',
'7', '25/12/2014', '5')
INTO CartelePrepay (IdPrepay, SumaDisponibila, Valabilitate, IdServiciu) VALUES ('5',
'6', '17/03/2015', '4')
INTO CartelePrepay (IdPrepay, SumaDisponibila, Valabilitate, IdServiciu) VALUES ('6',
'2', '24/02/2015', '6')
SELECT 1 FROM DUAL
57
3.4.8. Introducerea datelor în tabela NumereTelefon
Comanda de introducere a datelor în tabelul NumereTelefon este:
INSERT ALL
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771502506', '2', '1')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771771177', '1', '1')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771956525', '2', '3')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771897887', '3', '2')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771056978', '4', '3')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771322884', '5', '4')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771156982', '6', '5')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771568456', '7', '4')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771458596', '8' , '6')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771051122', '9', '6')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdAbonament) VALUES ('0771063222', '10', '2')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdPrepay) VALUES ('0775001122', '1','1')
INTO NumereTelefon (NumarTelefon, IdPrepay) VALUES ('0775256232','2')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdPrepay) VALUES ('0775215669', '10','3')
INTO NumereTelefon (NumarTelefon, IdAbonat, IdPrepay) VALUES ('0775693256', '4', '4')
INTO NumereTelefon (NumarTelefon, IdPrepay) VALUES ('0775214522','5')
INTO NumereTelefon (NumarTelefon, IdPrepay) VALUES ('0755423562','6')
SELECT 1 FROM DUAL
Observaţii. Numerele de telefon sunt asociate fie unui abonat cu abonament şi atunci nu s-a inserat nici o
valoare în tabel pentru câmpul IdPrepay, fie unei cartele prepay, şi atunci nu s-au inserat valori pentru câmpurile
IdAbonat şi IdAbonament sau fie unui abonat care deţine şi cartelă prepay caz în care nu s-au inserat valori
pentri IdAbonament. Abonaţii care deţin cartele prepay sunt abonaţii cu IdAbonat 1, 4 şi 10.Totodată un abonat
poate avea mai multe numere de telefon folosind pentru acestea abonamente diferite sau identice. Abonatul cu
IdAbonat 2 deţine două numere de telefon respectiv două abonamente diferite. Rezultatul inserării va fi:
58
3.4.9 Introducerea datelor în tabela Contracte
Comanda pentru inserarea datelor în tabela Contracte este:
INSERT ALL
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('1',
'03/03/2014', '03/03/2016', '2', '0771502506')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('2',
'03/03/2014', '03/03/2016', '2' , '0771956525')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('3',
'05/07/2014', '05/07/2016', '1' , '0771771177')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('4',
'24/05/2014', '24/05/2016', '3' , '0771897887')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('5',
'24/05/2012', '23/05/2014', '3' , '0771897887')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('6',
'03/03/2014', '03/03/2016', '4' , '0771056978')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('7',
'03/07/2014', '03/07/2016', '5', '0771322884')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('8',
'03/09/2014', '03/09/2016', '6', '0771156982')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('9',
'17/03/2014', '18/04/2016', '7' , '0771568456')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('10',
'24/02/2014', '24/02/2016', '8', '0771458596')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('11',
'11/02/2014', '10/02/2016', '9', '0771051122')
INTO Contracte (IdContract, DataInceput, DataSfarsit, IdAbonat, NumarTelefon) VALUES ('12',
'20/12/2014', '17/12/2016', '10', '0771063222')
SELECT 1 FROM DUAL
59
Rezultatul inserării va fi:
O vedere este în esenţă o relaţie virtuală care nu este de fapt de sine stătătoare, ci este derivată în mod
dinamic din una sau mai multe relaţii de bază. O vedere are aspectul unui tabel continând coloane si linii care
pot fi actualizate si în care se pot efectua inserări sau eliminări .O vedere este de fapt un tabel logic care nu
stocheaza date. Ea îsi preia datele din tabelele sau vederile pe care se bazează. Toate operaşiile efectuate asupra
unei vederi afecteaza practic tabelele de bază ale vederii.
O vedere este creata folosind o interogare şi prin urmare poate fi privită ca fiind un tabel virtual sau o
interogare stocată.Vederile sunt dinamice si afiseaza întotdeauna informatiile curente ale tabelelor. Atunci când
tabelele vederii sunt manipulate, aceste modificari sunt reflectate instantaneu în vedere.
Vederile permit sa afişarea datelor într-o formă diferită de cea în care sunt stocate în tabele. Vederile permit
adaptarea prezentării datelor în conformitate cu cerinţele specifice ale diverselor tipuri de utilizatori.
60
În general, vederile sunt create în urmatoarele scopuri:
Pentru a asigura un nivel mai înalt de securitate al bazei de date prin restrângerea accesului la un
număr predeterminat de coloane şi linii ale unui tabel. Acest lucru permite utilizatorilor sa vadă un
subset restrâns al datelor.
Pentru simplificarea prezentării datelor prin ascunderea structurilor reuniunilor şi tabelelor care
stau la baza vederii.
Pentru afişarea datelor într-o altă reprezentare decât cea a tabelelor de bază.
Pentru a crea o vedere, se foloseşte comanda SQL CREATE VIEW. O vedere se poate defini folosind orice
interogare care face referire la tabele sau alte vederi. Sintaxa pentru crearea unei vederi este următoarea:
Înlocuirea vederilor
Pentru a modifica definitia unei vederi, vederea trebuie înlocuita. Vederile pot fi înlocuite în doua moduri:
Utilizarea vederilor
Vederile sunt tratate similar cu tratarea tabelelor în instructiunile SQL. Adică, pentru a interoga o vedere se
foloseşete tot instrucţiunea select. Exemeplu: SELECT coloana1, coloana2 FROM nume_vedere. Pentru a insera
o valoare în vedere se foloseşte instrcţiunea INSERT, ca şi la tabele. Exemplu INSERT INTO nume_vedere
VALUES (...)
Nu se poate folosi o vedere pentru a efectua operatii de inserare , actualizare sau ştergere atunci când
interogarea vederii conţine o operatie JOIN, operatorii SET sau DISTINCT, o clauza GROUP BY sau o
functie GROUP.
Nu se poate utiliza o vedere definită cu clauza WITH CHECK OPTION pentru a insera sau a actualiza
tabelele de bază.
Nu pot fi inserate linii în tabele utilizând o vedere care a fost creată folosind expresia DECODE.
61
Dezavantajul utilizării unei vederi este că aceasta adaugă unul sau mai multe nivele de procesare atunci când
un utilizator interoghează sau manipulează datele prin intermediul vederii. Utilizarea vederilor necesită un timp
suplimentar de procesare înainte ca datele sa fie citite, reducând puţin viteza de raspuns a serverului Oracle.
Distrugerea vederilor
În continuare vom exemplifica procesul de creare a trei vederi. Prima vedere se referă la abonaţii/clienţii
prepay care sunt în Roaming, adica cei care au în tabela Servicii Roamingul activ. A doua vedere va fi una
pentru clieţii care plătesc peste o anumită sumă, iar a treia va fi pentru clienţii care au o anumită vechime.
Vederea pentru clienţii prepay care sunt în Roaming va purta numele PrepayRoaming iar instrucţiunea de
creare a vederii este următoarea:
62
Rezultatul va putea fi vizualizat folosind comanda SELECT * FROM PrepayRoaming
Observaţii.
1. Utilitatea vederilor în cauză se poate deduce foarte uşor. În cazul în care doream sa vedem abonaţii care sunt
în roaming spre exemplu, ar fi trebuit să ne uităm mai întâi în tabeul Servicii pentru a vedea care din serviciile
oferite au valoarea pentru câmpul Roaming 'Activ'. Ar fi trebui apoi să ne uităm în tabela Abonamente pentru a
vedea care abonamente folosesc serviciile pentru care roamingul este activ. Apoi ar fi trebuit sa vizualizăm
tabela NumereTelefon pentru a vedea căror abonaţi le sunt alocate aceste aboanamente. Iar în final ar fi trebuit
sa vizualizăm tabela Abonaţi pentru a cunoaşte numele şi prenumele abonaţilor care satisfac această condiţie.
Ori în acest caz avem date despre abonatii cu tipurile de abonament deţinute şi codul serviciului utilizat ce sunt
în roaming folosind un simplă comandă de SELECT. Acelaşi lucru este valabil şi pentru clieţii preapay, chiar
daca în acest caz este mai simplu deoarece folosim doar 3 tabele CartelePrepay, NumereTelefon, Servicii, ideea
de bază este aceea ca avem acces la astfel de informaţii folosind o instructiune simpla de SELECT şi nu una aşa
complexă precum cea folosită la crearea vederii.
2. Intrucţiunea de interogarea a bazei de date folosită în crearea tabelelor este o instructiune destul de complexă.
Pentru a exemplifica modul de cocepere a unei astfel de comenzi alegem ca exemplu vederea AbonaţiRoaming
pentru care comanda de SELECT este:
Prima parte a comenzii selectează coloanele care se doresc a fi incluse în vedere. În acest caz, am considerat ca
id-ul abonatului, numele şi prenumele acestuia, numărul de telefon, tipul de abonament şi serviciul utilizat
împreună cu coloana Roaming din cadrul tabelului Servicii sunt suficiente pentru a avea informaţii legate de
abonaţii care sunt în roaming. Se observa că anumite coloane au în faţa lor numele tabelului din care fac parte.
Acest lucru este datorită faptului că anumite câmpuri se regăsesc în mai multe tabele, aşa cum este cazul
63
atributului IdServiciu, care este cheie primară pentru tabelul Servicii şi cheie externă pentru tabelul
Abonamente.
A doua parte a coemnzii începe cu cuvântul cheie FROM cu ajutorul căruia alegem tabelele din care am luat
coloanele şi care contribuie la relaţia dintre tabelele Abonaţi şi Servicii.
Cea de-a treia parte a instrucţiunii reprezintă condiţia impusă. Aşa cum am menţionat în prima observaţie
trebuie să vizualizăm potrivirile din cadrul fiecărui tabel. Pornim de la un capăt cu tabelul Abonaţi şi ajungem la
celălalt şi anume tabelul Servicii. Considerăm mai întâi aboanţii pentru care există înregistrări în tabela
NumereTelefon prin Abonati.IdAbonat=NumereTelefon.IdAbonat, la această condiţie se adaugă condiţia ca
aceşti abonaţi să aibă în tabela NumereTelefon abonamente prin AND NumereTelefon.IdAbonament =
Abonamente.IdAbonament, la acestea trebuie să se facă legătura dintre tabelele Abonamente şi Servicii AND
Abonamente.IdServiciu = Servicii.IdServiciu şi să se adauge condiţia finală AND Roaming='Activ'. Această
comandă reprezintă ceea ce se numeşte joncţiune naturală între tabele.
O joncţine naturală este în esenţă o relaţie care se obţine în felul următor: se calculează produsul cartezian al
celor doua relatii, din tuplurile produsului cartezian se selecteza acele tupluri care au valori egale pentru
atributele comune şi apoi se face proiecţia rezultatului pe mulţimea de atribute corespunzătoare tabelelor
participante. Produsul cartezian dintre două relaţii reprezintă concatenarea valorilor atributelor fiecărui tuplu
din prima relaţie cu valorile atributelor tuturor tuplurilor din a doua relaţie.
La fel ca şi în cazul precedent coamanda reprezintă o jocţiune între tabelele CartelePrepay, NumereTelefon
şi Servicii. În acest caz tabelele în cauză sunt în relaţie directă, nemaifiind nevoie de tabele adiţionale
intermediare. Coloanele care intră în structura tabelei sunt IdPrepay, NumarTelefon, Servicii şi Roaming.
Puteam să creem vederea fără a mai folosi tabela NumereTelefon deoarece tabelele CartelePrepay şi Servicii
sunt într-o relaţie directă n:1. Am considerat însă că într-un asfel de caz ar putea exista situaţia în care şi
numărul de telefon ar fi necesar pentru cel care utilizează vederea. Condiţia impusă este la fel ca şi în cazul
precedent, clienţii prepay ce folosesc servicii pentru care roamingul este activ vor fi introduşi în vedere alături
de numărul de telefon corespunzător.
În cazul abonaţilor se pot folosi 2 tabele, tabela Facturi sau tabela Abonamente. În tabela Facturi avem
informaţii privitoare la cât au plătit sau au de plată abonaţii. Această sumă este un total între costul
abonamentului şi eventualele cheltuieli suplimentare. În tabele Abonamente avem informarţii referitoare la
costul abonamentului. Deşi tabela Facturi cuprinde informaţii şi din tabela Abonamente vom exemplifica
ambele cazuri.
64
Vederea pentru abonaţii care plătesc facturi cu suma de peste 7 Euro va fi creată folosind comanda
următoare:
Vederea pentru abonaţii care plătesc abonamente cu suma de peste 7 Euro va fi creată folosind comanda
următoare:
65
Rezulatul se observă folosind coamanda SELECT * FROM AbonatiPlati2.
În cazul clienţilor prepay, vom căuta acei clienţi care au în cont sume de peste 7 euro.
Vederea pentru clienţii prepay care au sume disponibile pe cartelele prepay de peste 7 Euro va fi creată
folosind comanda următoare:
66
Observaţii.
Ca şi în cazul vederilor pentru clienţii din roaming pentru crearea acestor vederi s-au folosit
joncţiuni naturale.
În cazul vederii AbonatiPlati1 am folosit o joncţiune simplă între tabelele Abonaţi şi Facturi
folosind ca atribute datele de identificare a abonatului şi cele pentru factură.
În cazul vederii AbonaţiPlati2 am folosit o joncţiune între tabelele Abonaţi, Abonamente şi
NumereTelefon. Deşi nu am folosit nici o coloana din tabelul NumereTelefon, acest tabel era
necesar pentru a face legătura dintre Abonaţi şi Abonamente.
În cazul vederii PrepayPlati am folosit o joncţiune naturală între tabelele Abonaţi şi NumereTelefon
pentru a avea în cadrul vederii informaţii legate de numărul de telefon al clientului prepay. Aceasta
nu era însă necesară, pentru a pune în eveidenţă clieţii care plătesc peste o anumită sumă se putea
folosi o instrucţiune de interogare simplă SELECT * FROM CartelePrepay WHERE
SumaDisponibila>7.
67
68
Concluzii
Scopul acestei lucrări este acela de a de a evidenţia conceptul teoretic al unei baze de date şi paşii necesari
în proiectarea şi crearea propriu-zisă a acesteia.
Baza de Date creată în cadrul acestui proiect se numeşte TELECOM şi poate fi folosită de un operator de
telefonie mobilă pentru o administrare uşoară şi rapidă a clienţilor. În construcţia bazei de date s-a pornit de la
cerinţele clienţilor referitoare la baza de date dorită, ca mai apoi să se continue cu proiectarea conceptuală,
logică şi fizică a acesteia. Accentul a fost pus în special pe entităţile bazei de date, atributele corespunzătoare şi
relaţiile dintre entităţi.
Implementarea fizică a bazei de date a fost realizată în mediul Oracle Database 11g Express Edition
69
Bilbliografie
Note de curs
70