Sunteți pe pagina 1din 4

InfoAcademy

Ionut Cristian Morar

Cisco Networking Academy


www.infoacademy.net
rev.55

ENUNTPROIECTFINALSQL/MySQL
Ati fost angajat(a) de administratia unei clinici private pentru a pune ordine in evidentele legate de medici,
pacienti si vizitele acestora. Pana acum, evidenta vizitelor a fost tinuta pe hartie, pentru fiecare pacient fiind
notate numele acestuia, numele medicului, data si ora vizitei si cabinetul in care aceasta a avut loc. Se doreste
ca pe viitor evidenta sa fie informatizata si de aceea toate datele deja existente trebuie introduse intr-o baza de
date MySQL, care sa aiba o structura cat mai bine aleasa. In plus, odata informatiile introduse, administratia
doreste cateva prime rapoarte de activitate pe baza lor.
Vi se furnizeaza urmatoarele fisiere:
- informatiile colectate pe hartie (cele legate de vizitele pacientilor) au fost introduse in format electronic si vi
se pun la dispozitie sub forma unui fisier intr-un format asemanator cu CSV
- administratia va furnizeaza un fisier separat cu lista medicilor, care contine, pe langa numele si prenumele
medicului, statutul sau de medic primar/specialist si specialitatea sa. Aceasta lista include si cativa medici
proaspat angajati si care inca nu figureaza in evidentele legate de vizite.
Cerinte:
1. Se creeaza baza de date pfinal. In cadrul sau se defineste procedura init() care efectueaza urmatoarele
operatiuni:
sterge si recreeaza toate tabelele:
Medici cu coloane pentru nume, prenume, statut (care poate fi doar primar sau specialist) si
specialitate.
Pacienti cu coloane pentru nume, prenume
Cabinete cu coloana pentru denumire
Vizite cu coloane pentru: data si ora (o singura coloana), si chei externe pentru medici, pacienti si
cabinete (vezi mai jos)
o tabela intermediara in care vor fi importate din fisier informatiile legate de vizite, inainte de a fi
distribuite in tabelele finale. Structura tabelei o alegeti pe baza continutului fisierului astfel incat
importul sa se deruleze cu succes.
creeaza indecsi
chei primare pentru tabele (se adauga coloane de tip auto_increment)
indecsi unici pentru combinatia (nume,prenume) in tabelele Medici si Pacienti
index unic pentru numele cabinetului in tabela Cabinete
Vor fi alese tipurile de date cele mai potrivite pentru coloane.
Procedura va putea fi rulata ulterior ori de cate ori este nevoie de-a lungul dezvoltarii proiectului pentru a
reinitializa rapid baza de date.
2. Se importa datele din fisierul medici in tabela Medici
3. Se importa informatiile legate de vizite in tabela intermediara (din care vor migra mai apoi catre tabelele
principale vezi mai jos).
4. Se distribuie informatia din tabela intermediara in tabelele principale deja create, astfel incat sa poata fi
reconstituite relatiile corecte intre inregistrari:
lista de nume unice de pacienti din tabela intermediara se introduce in Pacienti
Studentul poate utiliza prezentul material si informatiile continute in el exclusiv in scopul asimilarii cunostintelor pe care le include, fara a afecta dreptul
de proprietate intelectuala detinut de InfoAcademy.

InfoAcademy
Ionut Cristian Morar

Cisco Networking Academy


www.infoacademy.net
rev.55

lista de nume unice de cabinete din tabela intermediara se introduce in Cabinete


se populeaza tabela Vizite pe baza tabelei intermediara, operatia fiind echivalenta cu inlocuirea
numelor de medici cu id-uri de medici, numelor de pacienti cu id-uri de pacienti etc, astfel incat fiecare
inregistrare din Vizite sa contina referinte la inregistrari din celelalte tabele (Pacienti, Medici si
Cabinete). In acest fel, orice raport viitor va putea fi obtinut printr-un join intre doua sau mai multe
tabele.

Acest ultim pas se poate realiza in mai multe moduri. O posibila idee: puteti crea coloane ajutatoare in tabela
intermediara, calculate pe baza celor existente, ale caror valori apoi doar le copiati in tabelele de destinatie (ex:
id-ul pentru medici, care se poate calcula facand un join intre tabela intermediara si cea de medici cu conditia ca
numele sa fie comun)
5. Odata datele structurate corect si distribuite in tabele, se sterge tabela intermediara. Rapoartele ulterioare vor
fi produse exclusiv pe baza tabelelor principale (Medici, Pacienti, Cabinete, Vizite)
6. Administratia intentioneaza ca pe viitor sa colecteze informatii suplimentare despre pacienti si vizite: data de
nastere a pacientului si durata vizitei. In acest scop:
se va adauga coloana Durata in tabela Vizite
se va adauga coloana DataNasterii in tabela Pacienti
Aceste coloane vor fi populate momentan cu date aleatoare, pentru a putea fi exersate rapoartele ce le vor
implica. Data nasterii va fi generata cu cel putin 20 de ani in urma, iar durata intre 5 si 30 de minute.
7. Se creeaza o procedura care produce urmatoarele rapoarte:
extragere de informatie dintr-o singura tabela
care sunt cei mai varstnici 20 de pacienti (se va afisa numele complet al pacientului si varsta
acestuia)
cati pacienti exista pe segmentul de varsta 60-70 de ani
lista specialitatilor medicale disponibile impreuna cu numarul de medici pentru fiecare dintre ele
(ex: reumatologie 4, cardiologie 2 etc)
extragere de informatie din 2 tabele
care este specialitatea la care s-au prezentat cei mai multi bolnavi
care este pacientul cu cele mai multe vizite la clinica
care sunt medicii care au consultat mai putin de 250 de pacienti in anul 2009
care sunt medicii care nu figureaza in evidente cu nicio vizita
care sunt pacientii care au cel putin 20 de vizite in weekend
istoricul (ordonat cronologic) al vizitelor unui pacient, dandu-se numele acestuia (alegeti voi un
pacient). Se va afisa doar data si ora vizitei
extragere de informatie din 3+ tabele
varsta medie a pacientilor pentru fiecare specialitate in parte in afara de pediatrie
istoricul (ordonat cronologic) al vizitelor unui anume pacient, dandu-se numele acestuia (alegeti voi
un pacient). Pentru fiecare vizita se vor afisa data, ora, numele complet al doctorului si al
pacientului, cabinetul, specialitatea si durata
probleme de gandire pentru avansati (optionale):
primii 3 medici ca numar de vizite pentru fiecare specialitate in parte in anul 2005
Studentul poate utiliza prezentul material si informatiile continute in el exclusiv in scopul asimilarii cunostintelor pe care le include, fara a afecta dreptul
de proprietate intelectuala detinut de InfoAcademy.

InfoAcademy
Ionut Cristian Morar

Cisco Networking Academy


www.infoacademy.net
rev.55

lista de medici impreuna cu numarul de vizite per cabinet al fiecaruia in perioada 01.05.200601.10.2008. Lista trebuie sa includa toti medicii, chiar daca unii dintre ei nu au vizite deloc in acea
perioada
in ce cabinet a primit cele mai multe vizite fiecare medic
care sunt pacientii cu numarul maxim de vizite pentru fiecare specialitate
8. Se realizeaza o a doua implementare a punctului 4, in care popularea tabelelor principale - Vizite, Pacienti si
Cabinete se realizeaza automat cu ajutorul unui trigger, la importarea datelor in tabela intermediara.
Triggerul atasat tabelei intermediara ruleaza automat la introducerea de noi inregistrari si efectueaza
urmatoarele operatiuni:
apeleaza o functie care formateaza corect data (atentie! coloana de data din tabela intermediara trebuie
definita ca varchar, in caz contrar NEW.data va fi 0000-00-00!). Functia va primi ca argument doua
siruri de caractere (data si ora, in formatul in care apar ele in fisier) si va returna o valoare de tip
DATETIME ce reprezinta data+ora vizitei asa cum trebuie ea sa apara in tabela Vizite
adauga inregistrarile corespunzatoare in tabelele Pacienti si Cabinete, determinand valoarea cheii
externe din tabela Vizite folosind LAST_INSERT_ID() sau SELECT
adauga inregistrarea corespunzatoare in tabela Vizite folosindu-se de valorile calculate anterior
Sugestii posibila implementare a triggerului:
se declara variabile in care se care vor memora valorile viitoarelor campuri din Vizite
se declara un handler de tip CONTINUE care se activeaza la incercarea de introducere a unei
inregistrari duplicat. Handlerul seteaza o variabila (un flag) ce indica faptul ca noua inregistrare nu s-a
introdus, fiind duplicat. In acest fel, dupa incercarea de introducere a unei noi inregistrari intr-o tabela,
putem afla daca operatia s-a incheiat cu succes analizand variabila setata de handler
se apeleaza functia care produce data si ora vizitei formatata corect
pentru fiecare dintre tabelele Pacienti si Cabinete:
se incearca introducerea noii inregistrari pacient/cabinet folosind informatiile extrase din
inregistrarea curenta a tabelei intermediare. In cazul in care inregistrarea exista deja (pacientul sau
cabinetul este posibil sa fi fost adaugate deja ca urmare a unei inregistrari anterioare) handlerul va
semnaliza acest lucru prin intermediul variabilei
se determina valoarea cheii externe in felul urmator:
in cazul in care variabila definita de handler indica eroare, inseamna ca pacientul/cabinetul exista
deja si atunci valoarea cheii externe este id-ul inregistrarii deja existente, determinabil cu
SELECT
in cazul in care nu a avut loc o eroare, valoarea cheii externe este id-ul generat automat la
introducerea in tabela principala, determinabil cu LAST_INSERT_ID()
se introduce noua inregistrare in tabela vizite, formata din data/ora si id-urile calculate anterior
Se testeaza noua implementare prin apelarea procedurii init(), crearea triggerului, importul in tabela
intermediara si apoi apelarea procedurii ce produce rapoartele.
9. Se realizeaza o a treia varianta de implementare a punctului 4, sub forma unei proceduri ce foloseste un
cursor pentru a parcurge inregistrarile din tabela intermediara. Procedura poate refolosi functia de la punctul
anterior in scopul formatarii datei.
Se testeaza noua implementare prin apelarea procedurii init(), importul in tabela intermediara, crearea
procedurii ce contine cursorul, apelarea acestei proceduri si apoi apelarea procedurii ce produce rapoartele.
Studentul poate utiliza prezentul material si informatiile continute in el exclusiv in scopul asimilarii cunostintelor pe care le include, fara a afecta dreptul
de proprietate intelectuala detinut de InfoAcademy.

InfoAcademy
Ionut Cristian Morar

Cisco Networking Academy


www.infoacademy.net
rev.55

Proiectul se va crea sub forma unui script SQL cu urmatoarele caracteristici:


se va lucra din MySQL Workbench sau orice alt client grafic care suporta schimbarea delimitatorului (in
scopul definirii de rutine si triggere). Data fiind anvergura proiectului, clientul mysql reprezinta o solutie
incomoda
scriptul sterge baza de date in caz de existenta si o creeaza de la 0, astfel incat sa poata fi rulat in mod
repetitiv fara a genera erori
scriptul nu trebuie sa genereze erori sau warning-uri
datele de importat contin caractere romanesti, de aceea se va folosi setul de caractere UTF-8:
in comunicatia cu serverul
pentru baza de date, tabele si coloanele de tip sir de caractere
la importarea datelor in tabele
inaintea fiecarei operatii majore din fisier se vor include comentarii care clarifica scopul secventei de
cod urmatoare
se poate lucra cu join-uri sau cu subselect-uri, cum vi se pare mai comod. Trebuie insa ca de-a lungul
scriptului fiecare dintre cele doua procedee sa fie folosit de minim 2 ori!
NU se permite folosirea de tabele temporare intermediare, cu exceptia celei in care se importa
informatiile legate de vizite

Studentul poate utiliza prezentul material si informatiile continute in el exclusiv in scopul asimilarii cunostintelor pe care le include, fara a afecta dreptul
de proprietate intelectuala detinut de InfoAcademy.