Sunteți pe pagina 1din 19

PROIECT BAZE DE DATE

EVALUARE/RATING PRODUSE SI SERVICII


Scenariu initial

O baza de date este un mod flexibil si usor accesibil de a superviza


activitati din diferite domenii de lucru.

Am creat o bază de date care detine informații despre produsele pe care o cafenea le
ofera, precum și despre recenziile utilizatorilor pentru acestea. Misiunea cafenelei este de a
aduce pe piata o gama variata de cafea, din diferite colturi ale lumii  Directorii si personalul de
pe diverse nivele din cadrul localului sunt reprezentaţi în mod obligatoriu de persoane calificate
în cele două tipuri de profesii.

Tabelul Clienții stochează toate informațiile despre clienți. Informațiile esențiale sunt definite ca
NOT NULL. De exemplu, fiecare client trebuie să aibă o adresă de expediere. Cu toate acestea, clienții
din tabel nu gestionează relația dintre un client și comanda lui de achiziție. Deci, această relație trebuie
gestionată de comenzile de masă, pe care le definim ca subtipuri, fiecare dintre acestea prezentand
attribute unice specifice. Entitatea preparator are in plus atributul specializare, entitatea ospatar
atributul pregatire,
iar entitatea manager atributul experienta. Subtipurile trebuie să se
excludă reciproc. Aceasta regula se traduce pe exemplul de mai sus prin faptul ca un angajat nu poate fi
si preparator si ospatar in acelasi timp.

Fiecare client poate scrie cât mai multe comentarii despre produsele pe care le-a
cumpărat împreună cu data și ora trimiterii recenziei. Utilizatorii pot evalua produsul folosind
sistemul de examinare de 5 stele. Revizuirea va conține un cod unic. De asemenea, clientul
poate da rating de la 1 la 5, acesta fiind ilustrat prin stele strălucitoare de aur. Deci, site-ul web
poate fi o zonă deschisă pentru a discuta despre cea mai bună opțiune de cumpărare.
Diagrama ERD

Angajat
Clienti
#id
#id
*nume
*nume
Preparator *prenume
*prenume
*cnp
*oras *specializare
*data_nasterii

*sex

*adresa

email

Produs
Ospatar Manager
#id
*pregatire *experienta
*tara
*denumire ------
*prêt email

Recenzie

#id

*produs_id

- - -------------p *recenzor_id

*comentariu - - - -
*valoare_rating
ERD FINAL
*data_publicarii
Tabele de mapare

Tabela produs:

Numele coloanei Tip Tip cheie Optionalitate


id Number Pk *
denumire Varchar2 *
pret Number *

Tabela clienti:

Numele coloanei Tip Tip cheie Optionalitate


id Number Pk *
nume Varchar2 *
prenume Varchar2 *
oras Varchar2 *

Tabela comanda:

Numele coloanei Tip Tip cheie Optionalitate


id Number Pk *
idclient Number Fk *
data Date *

Tabela angajati:

Numele coloanei Tip Tip cheie Optionalitate


id Number Pk *
nume Varchar2 *
prenume Varchar2 *
cnp Number *
data_nasterii Date *
sex Varchar2 *
strada Varchar2 *
oras Varchar2 *
tara Varchar2 *
email Varchar2
Tabela recenzie:

Numele coloanei Tip Tip cheie Optionalitate


id Number Pk *
produs_id Number Fk *
recenzor_id Number Fk *
comentariu Varchar *
valoare_rating Number *
Data_publicarii Timestamp *
Diagrama normalizata

Clienti

#id

*nume
Angajat
*prenume
#id
*oras
*nume

*prenume

*cnp

Ospatar *data_nasterii
Comanda
*sex
*pregatire
#id
*strada
*idclient - - - -
*oras
*data *tara

email

Preparator Manager
Produs
*specializare *experienta
#id
- - - -
*denumire

*pret

Recenzie

#id

*produs_id

*recenzor_id
- - - - - - - - -
*comentariu

*valoare_rating

*data_publicarii
Pentru că adresa este de forma "str. Florilor, bl. 45, sc. A, ap. 28, etaj 3, Braşov, cod
123123", formă care de fapt conţine mai multe informaţii elementare, acest atribut ar trebui
impartit în mai multe atribute care se refera la adresa.O entitate se găseşte în prima formă
normală dacă şi numai dacă:- nu există atribute cu valori multiple;- nu există atribute sau
grupuri de atribute care se repetă. Cu alte cuvinte toate atributele trebuie să fie atomice, adică
să conţină o singură informaţie.

Relatia M:M dintre client si produs a fost rezolvata prin introducerea entitatii de
intersectie, Comanda O entitate se găseşte în a treia formă normală dacă nici un atribut care nu
este parte a UID-ului nu depinde de un alt atribut non-UID. Cu alte cuvinte nu se acceptă
dependenţe tranzitive, adică un atribut să depindă de UID în mod indirect. Astfel se tine evident
fiecarui produs comandat de catre client. Se creaza o relatie 1:M intre entitatile client si produs.

Relatii:

One-to-many:

Fiecare manager poate coordona unul sau mai multi angajati, iar fiecare angajat trebuie
sa fie coordonat de un manager.

Un client poate comanda mai multe produse, dar un produs poate apartine doar unui
client

FIecare ospatar trebuie sa ia una sau mai multe comenzi, iar o comanda poate fi luata de
catre un ospatar

Fiecare client poate avea una sau mai multe comenzi, iar fiecare comanda trebuie sa
apartina unui client.

Fiecare comanda trebuie sa contina un produs, iar fiecare produs trebuie sa apartina
uneia sau mai multor comenzi.

Un produs poate avea mai multe recenzii, iar o recenzie apartine unui produs.
Un client poate face mai multe recenzii, iar o recenzie apartine unui client.

 Many-to-many:

Fiecare preparator trebuie sa efectueze unul sau mai multe produse, iar fiecare produs
trebuie la randul lui sa fie facut de unul sau mai multi preparatori.
Creare tabele

CREATE TABLE produs (

id NUMBER (5) PRIMARY KEY,

denumire VARCHAR2 (30) NOT NULL,

pret NUMBER (5) NOT NULL

);

CREATE TABLE clienti (

id NUMBER(5) PRIMARY KEY,

nume VARCHAR2 (30) NOT NULL,

prenume VARCHAR2 (30) NOT NULL,

oras VARCHAR2 (20) NOT NULL

);

CREATE TABLE comanda (

id NUMBER (5) PRIMARY KEY,

idclient NUMBER(3) NOT NULL REFERENCES clienti,

data DATE

);

Am configurat o cheie străină în tabelul Comanda care face referire la cheia primara din
tabelul Clienti, astfel tinandu-se evidenta fiecarui produs comandat de fiecare client.

CREATE TABLE angajati (

id NUMBER (5) PRIMARY KEY,

nume VARCHAR2 (20) NOT NULL,


prenume VARCHAR2 (20) NOT NULL,

cnp NUMBER(13) NOT NULL,

sex VARCHAR2 (10) NOT NULL,

strada VARCHAR2 (20),

oras VARCHAR2 (20) DEFAULT 'Timisoara',

email VARCHAR2 (30) UNIQUE,

specializare VARCHAR2 (30),

pregatire VARCHAR2 (30),

experienta VARCHAR2 (30),

CONSTRAINT cnp_uk UNIQUE (cnp),

CONSTRAINT sex_ck CHECK(sex IN('feminin', 'masculin'))

);

CREATE TABLE recenzie (

id NUMBER (5) PRIMARY KEY,

produs_id NUMBER (5) NOT NULL REFERENCES produs(id),

recenzor_id NUMBER(5) NOT NULL REFERENCES clienti(id)

comentariu VARCHAR(255),

valoare_rating NUMBER(1) CHECK (valoare_rating between 1 and 5),

data_publicarii TIMESTAMP

);

Am configurat o cheie străină în coloana Recenzii care face referire la cheia primară din
tabelul Produs si o cheie straina care face referire la cheia primara din tabelul clienti. Astfel,
fiecare revizuire este legată de produsul corespunzător si de comentariul dat de cel care face
recenzia, păstrându-se în același timp integritatea referențială.
Modificari de structura:

 Adaugare coloana noua in tabelul angajati:

ALTER TABLE angajati

ADD varsta NUMBER(2)

- coloana nou creată va deveni ultima coloană a tabelei si va fi completată cu NULL în toate
liniile existente deoarece contine déja date.

 Stergerea coloanei varsta:

ALTER TABLE angajati DROP COLUMN varsta

Actualizari de continut:

 Inserare rand nou in tabelul recenzie:

INSERT INTO recenzie (id, produs_id, recenzor_id, comentariu, valoare_rating) VALUES

('5652', '54', '5', 'atmosfera ambianta', '5');

 Stergerea unei linii din tabela clienti:

DELETE FROM clienti WHERE oras='Cluj Napoca'

 Modificarea unei inregistrari din tabela angajati:

UPDATE angajati

SET prenume='Emilian' WHERE id=27


Vedere din doua tabele:

CREATE OR REPLACE VIEW

produs_recenzii(denumire,

pret, recenzor_id, valoare_rating)

AS SELECT p.denumire, MIN(p.pret), AVG(r.valoare_rating)

FROM produs p, recenzie r

WHERE p.id = r.id

GROUP BY p.denumire;
Interogari:

1. SELECT * FROM produs


WHERE pret>8

2. SELECT * FROM comanda


ORDER BY data

3. SELECT sum(pret) as suma


FROM produs
4. SELECT id, nume, prenume, pregatire, specializare, experienta
FROM angajati
WHERE pregatire IS NOT NULL OR
specializare IS NOT NULL OR
experienta IS NOT NULL
ORDER BY oras;
5. select *
from (select * from produs
order by denumire)
where pret>=12

6. SELECT produs_id, recenzor_id, comentariu, valoare_rating FROM recenzie


WHERE valoare_rating IN ( 5, 4 )

7. select * from recenzie


where valoare_rating >ALL ( select valoare_rating
from recenzie
where recenzor_id='4' )

8.

SELECT nume, prenume, oras FROM clienti

WHERE nume like '%a%'

9. Produs cartezian
SELECT c.id, c.data, t.nume, t.prenume
FROM comanda c CROSS JOIN clienti t
10.

SELECT recenzie.produs_id, recenzie.data_publicarii, produs.id, produs.denumire,


recenzie.valoare_rating

FROM recenzie INNER JOIN produs ON (recenzie.produs_id=produs.id)

11.
SELECT id, denumire
FROM produs
WHERE pret > ( SELECT pret
FROM produs
WHERE id='78' )

12. SELECT AVG(valoare_rating) AS medie

FROM recenzie