Documente Academic
Documente Profesional
Documente Cultură
GESTIUNEA PERSONALULUI
Proiect la
BAZE DE DATE IN ECONOMIE
Pascalau Damian-Stefan
IE ID, an 2, gr 2
2020
1
Scenariu
Am realizat acest proiect pentru a surprinde activitatea legata de gestiunea personalului din cadrul
unei organizatii de tip fabrica cu o singura filiala. Organigrama prevede 5 departamente:
- Conducere
- Vanzari
- Productie
- Resurse Umane
- Economic
si 8 tipuri de posturi:
- CEO
- Asistent
- Director departament
- Sef de linie
- Muncitor calificat
- Muncitor necalificat
- Angajat incepator
- Angajat senior
Intr-un mod similar, informatia legata de posturi este pastrata intr-un tabel separat numit
posturi, cu campurile id_post (conditionat ca obligatoriu si unic la fiecare inserare), nume_post. Am
organizat informatia despre posturi in tabel astfel incat sa contina un barem minim si maxim
recomandat legat de salariul pe care il oferim pentru fiecare post. Aceasta informatie se afla sub
coloanele salariu_min si salariu_max. Aceste valori nu impun conditionari ci servesc functia de
etalon la negocierea salariala. Aceste valori pot fi de asemenea folosite si la generarea unor rapoarte
legate de costurile organizatiei cu salariile oferite angajatilor.
De asemenea, pentru gestiunea personalului am creat tabela personal unde, pentru fiecare
angajat, trebuie introduse date in coloanele cnp_angajat, nume, prenume, data_angajare_pe_post,
id_post, id_departament si salariu. Folosim CNPul angajatului ca si cheie primara cu ajutorul careia
identificam angajatii.
Tot in tabela personal pot fi salvate informatii de contact importante precum numarul de telefon
si adresa de email, dar care nu sunt obligatorii.
Acest proiect permite documentarea istoricului personalului, precum functiile ocupate in trecut
in organizatie: tabela istoric_personal contine data la care a inceput angajatul sa lucreze pe un anume
post (data_start) si data la care a avansat pe alt post sau a parasit compania(data_sfarsit), pe langa
cnp_angajat, id_post si id_departament care sunt tratate ca si chei straine. Toate campurile acestei
tabele sunt obligatorii.
2
Diagrama ERD
Tabelele de mapare
ANGAJAŢI
Tip cheie Opţionalitate Nume coloană Observaţii
CP * Cnp_angajat Obligatoriu, cheie primara
* nume Obligatoriu
* prenume Obligatoriu
O email Optional
O telefon Optional
* data_angajare_pe_post Obligatoriu
CS * id_post Obligatoriu, cheie in relatia cu POSTURI
CS * id_departament Obligatoriu, cheie in relatia cu DEPARTAMENTE
* salariu Obligatoriu
POSTURI
Tip cheie Opţionalitate Nume coloană Observaţii
CP * id_post Obligatoriu, cheie primara
O nume_post Optional
O salariu_min Optional
O salariu_max Optional
3
DEPARTAMENTE
Tip cheie Opţionalitate Nume coloană Observaţii
CP * id_departament Obligatoriu, cheie primara
O nume_post Optional
ISTORIC_ANGAJATI
Tip cheie Opţionalitate Nume coloană Observaţii
CS * cnp_angajat Obligatoriu, cheie in relatia cu ANGAJATI
* data_start Obligatoriu
* data_sfarsit Obligatoriu
4
Constrângeri legate de câmpuri
In tabela angajati, CNP-ul angajatilor este unic si obligatoriu, el serveste
la identificarea salariatilor, si poate fi de maxim 13 cifre. La datelor inserarea in
BD, trebuie specificate valori si pentru campurile: nume, prenume,
data_angajare_pe_post, id_post, id_departament, salariu. Id_post si
id_departament sunt chei straine care trebuie sa existe deja in posturi, respectiv
in departamente.
In tabela posturi nu pot exista doua posturi cu acelasi id, si campul nu
poate fi lasat gol la inserarea in BD. Un id post poate lua valori intre 0 si 999.
In tabela departamente nu pot exista doua departamente cu acelasi id, si
campul nu poate fi lasat gol la inserarea in BD. Un id post poate lua valori intre
0 si 999.
In tabela istoric_angajat pot fi introduse valori care deja exista in posturi,
departamente, si angajati, fiind legate prin chei straine campurile cnp_angajat,
id_post, id_departament.
--Modificari structura
-- adauga foreign key id_post in tabela angajati
ALTER TABLE ANGAJATI ADD CONSTRAINT "ANG_ID_POS_POS_FK1" FOREIGN KEY
("ID_POST") REFERENCES POSTURI ("ID_POST");
--Modificari structura
-- adauga foreign key cnp_angajat in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_CNPANG_ANG_FK1" FOREIGN KEY
("CNP_ANGAJAT") REFERENCES ANGAJATI ("CNP_ANGAJAT");
-- adauga foreign key id_post in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_ID_POS_POS_FK1" FOREIGN KEY
("ID_POST") REFERENCES POSTURI ("ID_POST");
-- adauga foreign key id_departament in tabela istoric_angajati
ALTER TABLE ISTORIC_ANGAJATI ADD CONSTRAINT "ist_ID_DEP_DEP_FK1" FOREIGN KEY
("ID_DEPARTAMENT") REFERENCES DEPARTAMENTE ("ID_DEPARTAMENT");
Popularea tabelelor
8
9
Modificări de structură
1. La tabela angajaţi am adaugat constrângerea de tip cheie străină pe
atributul id_post.
-- adauga foreign key id_post in tabela angajati
ALTER TABLE ANGAJATI ADD CONSTRAINT "ANG_ID_POS_POS_FK1" FOREIGN KEY
("ID_POST") REFERENCES POSTURI ("ID_POST");
11
Interogări
12
4. Să se afişeze numele si prenumele tuturor angajatilor care sunt noi pe post
in anul 2020
--afiseaza toti angajatii noi pe post in 2020
SELECT nume, prenume from angajati where DATA_ANGAJARE_PE_POST>'01-JAN-2020';
13
6. Să se afişeze numele si prenumele tuturor angajatilor din departamentul
de productie, descrescator dupa salariu
-- afiseaza nume prenume si salariul angajatilor din departamentul de productie, aranjat
descrescator dupa salariu
select nume, prenume, salariu from angajati where id_departament=3 order by salariu desc;
14
8. Să se afişeze numele, prenumele, postul si departamentul, de asemenea
data de start si de sfarsit a tuturor angajatilor din istoric angajati, ordonat
dupa nume.
-- join: afiseaza nume, prenume, post, departament, din data, pana la data pentru toti
angajatii din istoric_angajati, ordonati dupa nume
select a.nume, a.prenume, c.nume_post as post, b.nume_departament as departament,
d.data_start as "din data", d.data_sfarsit as "pana la data"
from angajati a
join departamente b on b.id_departament = a.id_departament
join posturi c on c.id_post= a.id_post
join istoric_angajati d on d.cnp_angajat = a.cnp_angajat
order by a.nume;
15
16