Documente Academic
Documente Profesional
Documente Cultură
Grupa 142
Adăpost de Animale
1) Introducere
Exemplele din acest capitol se referă la proiectarea unui model de date ce
furnizează informații despre un adăpost de animale .
Vom prezenta adăpostul, acesta este locuința mai multor animale cum ar fi:
câini, pisici, păsări, hamsteri, castori, porcușori de guineea si chiar reptile (șerpi,
gușteri, șopârle) etc.
3) Entități
4) Relații
5) Atribute
sex = variabilă de tip șir de caractere, de lungime maximă 1, care reprezintă sexul
unui animal.
descriere = variabilă de tip șir de caractere, de lungime maximă 50, care descrie
situația animalului (dacă a fost abandonat, donat, etc)
id_adoptant = variabilă de tip întreg, care reprezintă id-ul persoanei care a adoptat
animalul. Atributul trebuie să corespundă la o valoare a cheii primare din tabelul
ADOPTANT. (Daca e null înseamnă că animalul nu a fost adoptat).
id_mancare = variabilă de tip întreg, nu poate fi nula și care reprezintă id-ul mâncării
pe care o consumă animalul. Atributul trebuie sa corespunda la o valoare a cheii
primare din tabelul MANCARE.
data_inmatriculare = variabilă de tip dată calendaristica, care reprezintă data in care
animalul a fost adus la adapost.
id_angajat = variabila de tip intreg, care reprezinta id-ul angajatului care se ocupa de
ingrijirea animalului. Atributul trebuie sa corespunda la o valoare a cheii primare din
tabelul ANGAJAT. (Daca e null inseamna ca nu are nevoie de ingrijiri medicale);
id_mancare = variabila de tip întreg, care nu poate fi nulă si reprezintă id-ul mâncării.
tip_mancare = variabilă de tip șir de caractere, de lungime maximă 10, care reprezintă
tipul mâncării.
pret = variabilă de tip întreg, nu poate fi nulă și care reprezintă prețul unui aliment.
brand = variabilă de tip șir de caractere, de lungime maximă 15, care reprezintă
brand-ul unui aliment (cine l-a produs).
denumire = variabila de tip șir de caractere, de lungime maximă 30, care reprezintă
numele asociației.
telefon = variabilă de tip șir de caractere, de lungime maximă 10 care reprezintă
numărul de telefon al adoptantului.
strada = variabilă de tip șir de caractere, de lungime maximă 25 care reprezintă strada
unde se afla asociația.
oras = variabilă de tip șir de caractere, de lungime maximă 20 care reprezintă orașul
unde se află asociația.
numar = variabilă de tip întreg, care reprezintă numărul de pe stradă a asociației.
suma_donata = variabilă de tip întreg, care reprezintă suma pe care asociatia o
doneaza adapostului.
id_adapost = variabilă de tip întreg, nu poate fi nulă și care reprezintă id-ul
adăpostului pe care-l finanțează asociația. Atributul trebuie să corespundă la o valoare
a cheii primare din tabelul ADAPOST.
judet = variabila de tip sir de caractere, de lungime maxima 20 care reprezinta judetul
in care se afla adapostul.
strada = variabilă de tip șir de caractere, de lungime maximă 25 care reprezintă strada
unde se afla adăpostul.
oras = variabilă de tip șir de caractere, de lungime maximă 20 care reprezintă orașul
unde se află adăpostul.
numar = variabilă de tip întreg, care reprezintă numărul de pe stradă al adăpostului.
id_adapost = variabilă de tip întreg, nu poate fi nulă și care reprezintă id-ul
adăpostului din locația curentă. Atributul trebuie să corespundă la o valoare a cheii
primare din tabelul ADAPOST.
6) Diagrama ER
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
7) Diagrama Conceptuală
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
8) Scheme relaționale
FN1
Prima formă normal (FN1) este o formă normală utilizată în normalizarea
bazelor de date. Prima formă normală exclude posibilitatea existenței grupurilor
repetitive cerând ca fiecare câmp într-o bază de date să cuprindă numai o valoare
atomică. De asemenea, prima formă normală cere și ca fiecare înregistrare să fie
definită astfel încât să fie identificată într-un mod unic prin intermediul unei chei
primare.
ADAPOST(NON-FN1)
Id_adapost# Id_angajat#
1007 403, 405, 407
1002 404
Acesta este un exemplu de NON-FN1, întrucât unui atribut ii corespund mai multe
valori, respectiv adăpostului cu id-ul 1007 ii corespunde angajații cu id-ul 403, 405 si
407.
FN2
A doua formă normal (FN2) cere ca toate elementele unei tabele să fie
dependente funcțional de totalitatea cheii primare. Dacă unul sau mai multe elemente
sunt dependente funcțional numai de o parte a cheii primare, atunci ele trebuie să fie
separate în tabele diferite. Dacă tabela are o cheie primară formată din numai un
atribut, atunci ea este automat în FN2 (a 2- a formă normală).
Exemplul de mai sus este unde exemplu NON-FN2, deoarece atributele
denumire_ad, telefon_ad, email_ad nu depind de toata cheia primara, ci doar de
#id_adapost, iar data_angajarii depinde doar de id_angajat. Astfel #id_adapost
determina functional denumire_ad, numar_ad, email_ad, iar id_angajat determina
functional, data_angajarii.
Astfel avem:
{#id_adapost} -> {denumire_ad, numar_ad, email_ad}
{#id_angajat} -> {data_angajarii}
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
ADAPOST(FN3)
adapost(#id_adapost, denumire_ad, numar_ad, email_ad);
ANGAJAT(FN3)
angajat(#id_angajat, data_angajarii)
DETALII_ANGAJARE(FN2)
detalii_angajare(#id_adapost, #id_angajat, nume_aj, prenume_aj, salariu, functie,
strada_aj, oras_aj, numar_aj)
FN3
O relație respectă forma normală FN3, dacă respectă forma normală FN2 și
niciun atribut care nu face parte din cheia primară nu este dependent tranzitiv de cheia
primară. Adică, spre exemplu, dacă atributul Y este dependent funcțional de atributul
X și atributul Z este dependent funcțional de atributul Y, atunci spunem că atributul Z
este dependent tranzitiv de atributul X. Verificarea aplicării corecte a procesului de
normalizare se realizează astfel încât uniunea acestora să producă relația inițială, cu
alte cuvinte, descompunerea este fără pierderi și dependențele se păstrează,
reconstituirea lor făcându-se cu ajutorul operațiilor de tip JOIN, fapt observat și la
modelul proiectat.
In exemplul de mai sus ADAPOST si ANGAJAT sunt in FN3 întrucât sunt în
FN2 și toate atributele depind stric de cheia primară, neexistând niciun caz de
dependență tranzitivă. În relația DETALII_ANGAJARE, atributule nume_aj,
prenume_aj, strada_aj, oras_aj, numar_aj depind direct de cheia primară id_angajat.
Pentru a aduce relatia DETALII_ANGAJARE in FN3 aplicam regula Casey-
Delobel si relatia se descompune in proiectiile DETALII_ANGAJARE1 si
DETALII_ANGAJARE2.
DETALII_ANGAJARE1 (FN3)
detalii_angajare1(#id_adapost, #id_angajat, functie, nume_aj, prenume_aj, strada_aj,
oras_aj, numar_aj)
detalii_angajare2(functie, salariu).
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
INSERT INTO LOCATIE VALUES (178, 'Sibiu', 'Aleea Artileristilor', 'Sibiu', 47,
1000);
INSERT INTO LOCATIE VALUES (189, 'Ilfov', 'Budislavu', 'Bucuresti', 124,
NULL);
INSERT INTO LOCATIE VALUES (202, 'Olt', 'Crisan', 'Slatina', 14, 1002);
INSERT INTO LOCATIE VALUES (493, 'Arad', 'Bujorului', 'Arad', 2, 1007);
INSERT INTO LOCATIE VALUES (138, 'Oradea', 'Avram Iancu', 'Oradea', 35,
1009);
INSERT INTO LOCATIE VALUES (59, 'Constanta', 'Cantonului', 'Costinesti', 947,
1012);
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
INSERT INTO ANIMAL VALUES(1000, 'Caine', 5.6, 'M', 'Negru', NULL, 5005,
to_date('13-04-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1001, 'Pisica', 2.3, 'F', 'Alba', 3012, 5006,
to_date('05-02-2021', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1002, 'Canar', 0.5, 'F', 'Culori: galben si verde',
NULL, 5009, to_date('21-08-2020', 'dd-mm-yyyy'));
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
INSERT INTO ANIMAL VALUES(1003, 'Hamster', 0.6, 'M', NULL, 3020, 5008,
to_date('22-08-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1004, 'Papagal', 0.4, 'M', 'Culori:rosu si verde',
3020, 5009, to_date('23-08-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1005, 'Caine', 4.5, 'F', NULL, 3013, 5007,
to_date('22-04-2019', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1006, 'Broasca', 1.6, 'F', NULL, 3005, 5008,
to_date('09-07-2017', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1007, 'Sarpe', 1.6, 'M', 'Maro cu pete galbene',
NULL, 5005, to_date('03-02-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1008, 'Veverita', 1.3, 'F', 'NULL', 3000, 5005,
to_date('17-12-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1009, 'Pisica', 8.6, 'M', 'Gri inchis, cu ochii
negri', 3001, 5001, to_date('28-11-2019', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1010, 'Caine', 7.6, 'F', 'Alb', 3005, 5007,
to_date('23-1-2018', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1011, 'Sarpe', 1.1, 'F', 'Negru, cu dungi gri',
NULL, 5006, to_date('14-04-2021', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1012, 'Canar', 0.3, 'M', 'Maro deschis cu dungi
galbene', NULL, 5009, to_date('28-02-2019', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1013, 'Papagal', 0.7, 'M', 'Are dungi rosii', 3012,
5009, to_date('28-1-2018', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1014, 'Hamster', 0.25, 'F', 'Alb', NULL, 5000,
to_date('20-02-2020', 'dd-mm-yyyy'));
INSERT INTO ANIMAL VALUES(1015, 'Pisica', 6.6, 'F', 'Alba', 3005, 5000,
to_date('07-05-2019', 'dd-mm-yyyy'));
update animal
set id_angajat = 401
where id_animal = 1001;
update animal
set id_angajat = 402
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
update animal
set id_angajat = 404
where id_animal = 1005;
update animal
set id_angajat = 405
where id_animal = 1006;
update animal
set id_angajat = 435
where id_animal = 1010;
update animal
set id_angajat = 404
where id_animal = 1014;
update animal
set id_angajat = 407
where id_animal = 1008;
update animal
set id_angajat = 400
where id_animal = 1012;
update animal
set id_angajat = 400
where id_animal = 1015;
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
MODIFICARE:
Cod sql:
MODIFICARE:
Cod sql:
MODIFICARE:
Cod sql:
3) --Sa se afiseze Angajatii care au avut grija de animale si numele adapostului in care
-- lucreaza
select concat(angajat.nume_aj, angajat.prenume_aj) "Nume si prenume",
animal.id_animal, adapost.denumire_ad
from angajat
inner join animal on animal.id_angajat = angajat.id_angajat
inner join adapost on adapost.id_adapost = angajat.id_adapost;
6) ---S? se afi?eze tipul hranei pentru animale în func?ie de pre?ul acesteia, astfel:
-- Dac? pre?ul este < 40, s? se afi?eze: hran? cu pre?uri mici
-- Dac? pre?ul este între 40 ?i 80, s? se afi?eze: hran? cu pre?uri medii
-- Dac? pre?ul este > 80, s? se afi?eze: hran? cu pre?uri mari
select pret, case when pret < 40 then 'Hrana cu preturi mici'
when pret between 40 and 80 then 'Hrana cu preturi medii'
else 'Hrana cu preturi mari'
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
end as tip_de_hrana
from mancare;
8) --Sa se afiseze informatii despre angajatii al caror salariu depaseste valoarea medie
--a salariilor celorlalti angjati, afisandu-se numele, prenumele angajatului
--numele adapostului, numarul de angajati si numarul de adaposturi
--SUBCERERE NESINCRONIZATA
9) --Sa se afiseze id-ul, tipul animalelor care au fost adoptate, altfel 'Animalul nu a
--fost adoptat';
select id_animal, tip_animal, nvl(to_char(id_adoptant),'Animalul nu a fost adoptat')
"Adoptat"
from animal
order by id_animal desc;
10) --Sa se afiseze data animalului cand s-a imbolnavit si id-ul acestuia, altfel
Animalul nu a fost bolanv;
select a.id_animal, nvl(to_char(f.data_fisa), 'Animalul nu a fost bolnav') as
Sanatos_Bolnav
from animal a, fisa_medicala f
where a.id_animal = f.id_animal;
12) Actualizare/Suprimare:
Observație! Am folosit un update la punctul 10 (am scris greșit codul pentru tabela
ANIMAL si când am observat era foarte mult de modificat așa ca am folosit update,
sper ca nu este nicio problema).
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
update mancare
set commision_pct = 0.25
where upper(brand) like '%HEALTHY%';
update mancare
set commision_pct = 0.54
where lower(brand) like '%granulli%';
--Sa se stearga din tabela fisa_medicala id-ul animalului care a fost adoptat
--Sa se mareasca salariul Veterinarilor din adapostul Smeura sau Bragadiru care au salariul mai mic
decat 800;
update angajat
set salariu = salariu+salariu*0.10
where id_adapost in (select id_adapost
from adapost
where denumire_ad = 'Smeura' or denumire_ad = 'Bragadiru')
and (functie = 'Veterinar' and salariu < 800);
Pentru VIZITATOR:
CREATE SEQUENCE seq_viz
increment by 1
start with 1
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
maxvalue 100
nocycle;
Pentru ASOCIATIE:
create sequence seq_as
increment by 1
start with 100
maxvalue 150
nocycle;
Pentru ANGAJAT:
create sequence seq_aj
increment by 1
start with 400
maxvalue 450
nocycle;
--Outer-join
select aj.id_angajat, ad.id_adapost, aso.id_asociatie, lol.id_locatie
from adapost ad
full outer join angajat aj on aj.id_adapost = ad.id_adapost
full outer join adapost ada on ada.id_adapost = ad.id_adapost
full outer join asociatie aso on aso.id_adapost = ad.id_adapost
full outer join locatie lol on lol.id_adapost = ad.id_adapost
where id_asociatie is not null and ad.id_adapost is not null and id_angajat is not null
and id_locatie is not null;
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
--Sa se obtina id-ul, numele de familie si data angajarii a angajatilor care lucreaza in
--acelasi adapost
-- cu angajatul avand codul 402 si sa se listeze dupa data_angajarii
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
Cerere SQL:
--Sa se afle judetul si orasul adapostului unde lucreaza angajatul cu id-ul 404
select l.judet, l.oras_l
from locatie l join adapost a on (l.id_adapost = a.id_adapost)
join angajat aj on (aj.id_adapost = l.id_adapost)
where aj.id_angajat = 404;
Expresie algebrica:
Arbore algebric:
Autor Nationalitate
William Britanic
Shakespeare
Ion Creanga Roman
Autor Titlu_carte
William Comedia erorilor
Shakespeare
Ion Creanga Harap-Alb
Forma normala 4
O relație este în a patra formă normală dacă și numai dacă relația este în BCNF
și nu conține relații m:n independente.
Fie o companie de taxiuri care are mai multi angajati si mai multe masini, de
diferite tipuri. Un angajat poate cunoaste mai multe limbi straine si poate conduce mai
multe masini. In legatura cu sosirea unei delegatii de persoane straine in oras
managerul companiei cere o situatie cu soferii angajati, cunostintele de limbi straine si
masinile de care dispun.
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
Cod_angajat Limba_straina
A1 Engleza
A1 Franceza
A1 Italiana
A2 Spaniola
A2 Rusa
Cod_angajat Automobil
A1 Cielo
A1 Tico
A2 Matiz
Forma normala 5
O relație este în a cincea formă normală dacă și numai dacă relația este în FN4 și
nu conține dependențe ciclice.
Luand ca exemplu urmatoarele relatii:
Un vanzator poate gestiona mai multe comenzi si un client solicita mai multe
comenzi
Ene Marius-Andrei Proiect Baze de Date
Grupa 142
b) Denormalizarea