Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator00b [2015/10/09 04:09]
Andrei Roșu-Cojocaru [Normalizarea]
laboratoare:laborator00b [2015/10/18 19:55] (current)
Andrei Roșu-Cojocaru [Activitate de Laborator]
Line 1: Line 1:
 ====== Laborator 00 (partea a II-a) ====== ====== Laborator 00 (partea a II-a) ======
-====== ​Sistemului ​de Gestiune pentru Baze de Date. MySQL ======+====== ​Sisteme ​de Gestiune pentru Baze de Date. MySQL ======
  
 ===== Obiective ==== ===== Obiective ====
Line 1957: Line 1957:
 Se doreşte proiectarea unei baze de date ce va fi folosită în cadrul unui sistem ERP pentru o librărie care comercializează doar cărţi. Se doreşte proiectarea unei baze de date ce va fi folosită în cadrul unui sistem ERP pentru o librărie care comercializează doar cărţi.
  
-O carte este identificată prin numele autorului ​sau a autorilor săi, titlul volumului, editura unde a fost publicată, anul apariţiei, ediţia, colecţia din care face parte, domeniul în care poate fi încadrată. Totodată, pentru ​fiecare ​carte se reţine o descriere şi informaţii cu privire la stocul existent ​şi la preţ. Este obligatoriu ca informaţiile ediţie, stoc existent şi preţ să fie numere pozitive.+O carte poate avea unul, nici unul sau mai mulți autori, un titlu, un subtitlu și o descriere, fiind caracterizată printr-un număr de ediție, anul în care a fost tipărită și colecția din care face parte. Cartea ​poate fi disponibilă în mai multe formate (tipărit, electronic). Pentru ​fiecare ​format ​se reține un isbn, limba în care este scrisă cartea, ​stocul existent ​precum și prețul. De asemenea, unei cărți i se pot specifica una, nici una sau mai multe categorii. O categorie este definită printr-un nume și o descriere.
  
-Pentru ​fiecare autor se va reţine şi o scurtă biografie.+Este obligatoriu ca informațiile număr de ediție, stoc existent și preț să fie numere pozitive. 
 + 
 +De asemenea, pentru ​fiecare autor se va reţine şi o scurtă biografie. 
 + 
 +O colecție aparține unei edituri, pentru aceasta reținându-se un nume și o descriere. Pentru fiecare editură sunt stocate denumirea, codul unic de identificare,​ descrierea, adresa poștală, codul zip, țara și pagina Internet de unde pot fi obținute informații suplimentare.
  
 Librăria emite comenzi de aprovizionare către edituri şi facturi la clienţi. Atât comanda de aprovizionare cât şi factura vor fi identificate printr-un cod (unic) – spre exemplu serie şi număr –, data la care a fost emisă, starea precum şi entitatea căreia i se adresează (editură / client). Ele pot conţine mai multe produse, pentru fiecare reţinându-se cantitatea. Librăria emite comenzi de aprovizionare către edituri şi facturi la clienţi. Atât comanda de aprovizionare cât şi factura vor fi identificate printr-un cod (unic) – spre exemplu serie şi număr –, data la care a fost emisă, starea precum şi entitatea căreia i se adresează (editură / client). Ele pot conţine mai multe produse, pentru fiecare reţinându-se cantitatea.
  
-O editură ​este caracterizată ​prin denumire, ​cod unic de identificare, descriere, localitatea, regiunea ​şi ţara în care operează.+Un client ​este identificat ​prin cod numeric personal, nume, prenume, adresa, telefon, email. Presupunând că librăria dispune ​şi de o platformă on-line pentru achiziţii, pentru fiecare client se vor reţine tipul (administrator / client) și credențialele sub forma unui nume de utilizator și a unei parole. Cu excepţia numărului de telefon, nici un câmp nu poate fi vid. Pentru email trebuie să se respecte formatul ''​username@domain.country''​.
  
-Un client este identificat prin CNP, nume, prenume, adresa, telefon, email. Presupunând că librăria dispune şi de o platformă on-line pentru achiziţii, pentru fiecare client se vor reţine tipul (administrator / client), precum şi rolul (super-administrator,​ administrator simplu / client inregistrat,​ client verificat). Cu excepţia numărului ​de telefon, nici un câmp nu poate fi vid. Pentru email trebuie să se respecte formatul ''​username@domain.country''​.+O schemă conceptuală a bazei de date descrisă mai sus din punct de vedere funcțional ​poate fi următoarea:
  
-  ​- Să se proiecteze schema conceptuală a bazei de date.\\ Studenţii care nu participă la ora de laborator şi trimit rezolvările prin email, vor ataşa schema conceptuală a bazei de date ca fişier .pdf. +{{ :​laboratoare:​laborator00b:​aipi2015-lab00b-conceptualscheme.png?​nolink&​800 }} 
-  ​- ​Să se implementeze baza de date având schema conceptuală definită folosind sistemul de gestiune ​pentru ​baze de date MySQL.\\ Să se populeze corespunzător ​baza de date.\\ Se vor specifica, pentru fiecare atribut în parte, şi constrângerile indicate folosind clauza ​''​CHECK''​, chiar dacă MySQL nu le implementează încă. + 
-  ​- ​Să se afişeze conţinutul tabelei care conține cărțile comercializate în librărie. Pentru fiecare carte se va afişa identificatorul,​ titlul şi autorii.\\ Întrucât o carte poate avea mai mulţi autori, se va folosi funcţia de grup ''​GROUP_CONCAT'',​ a cărei sintaxă este: <​code>​ GROUP_CONCAT([DISTINCT] expr [,expr ...]+**1.** ​Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://​www.github.com/​aipi2015/​Laborator00|]]. În urma acestei operații, directorul ''​Laborator00''​ va trebui să conțină subdirectoarele ''​samples''​ și ''​labtasks''​, fișierele ''​README.md''​ și ''​LICENSE''​. <​code>​ 
 +student@aipi2015:​~$ git clone https://​www.github.com/​aipi2015/​Laborator00 
 +</​code>​ 
 + 
 +**2.** ​Să se ruleze, în ordine, script-urile:​ 
 +  * ''​aipi2015-lab00b-DDL.sql''​ care conține instrucțiunile necesare ​pentru ​definirea bazei de date ''​bookstore'';​ 
 +  * ''​aipi2015-lab00b-DML.sql''​ care conține instrucțiunile necesare pentru popularea tabelelor din baza de date ''​bookstore''​. 
 +Se poate folosi utilitarul MySQL Workbench sau fișierele se pot încărca cu ajutorul unui client MySQL, fie prin redirectarea intrării, fie prin folosirea comenzilor ​''​source'' ​sau ''​\.''​. 
 + 
 +<note important>​Operația de populare a bazei de date poate dura o perioadă de timp semnificativă datorită numărului mare de înregistrări.</​note>​ 
 + 
 +**3.** ​Să se afişeze conţinutul tabelei care reține cărțile comercializate în librărie. Pentru fiecare carte se va afişa identificatorul,​ titlul şi autorii, denumirea colecției, denumirea editurii, numărul de ediție și anul tipăririi precum și denumirea țării. Întrucât o carte poate avea mai mulţi autori, se va folosi funcţia de grup ''​GROUP_CONCAT'',​ a cărei sintaxă este: <​code>​ GROUP_CONCAT([DISTINCT] expr [,expr ...]
     [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]]     [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]]
     [SEPARATOR str_val])     [SEPARATOR str_val])
 </​code>​ </​code>​
-  - Să se majoreze cu 20% preţul cărţilor ​apărute înainte ​de anul 2010. Ulterior ​se vor lista toate volumele existente în librărie grupate pe ani de apariţie (în ordine cronologică), pentru fiecare an în parte ordonate descrescător în funcţie de preţ. + 
-  ​- ​Să se afişeze toate cărţile unui autor, fie că le-a redactat singur, fie că acestea au mai mulţi autori.\\ Să se identifice ​numărul de volume elaborate, precizându-se numărul celor la care e unic autor şi al celor pe care le-a realizat colaborând cu alţi autori. +**4.** ​Să se majoreze cu 15% preţul cărţilor ​care sunt disponibile în mai mult de trei formate diferite. Să se afișeze cărțile pentru care s-au majorat prețurile, ​grupate pe formate. Informațiile care vor fi vizualizate sunt identificatorul cărții, titlul și subtitlul, denumirea formatului, prețul actualizat. 
-  ​- ​Să se creeze ​două rutine stocate ​pe server (funcții) care determină valoarea ​unei comenzi de aprovizionare,​ respectiv a unei facturi.\\ Folosind ​aceste rutine stocate, să se identifice ​primele trei edituri, respectiv ​primii trei clienţi în funcţie de volumul tranzacţiilor din librărie. + 
-  ​- ​Să se creeze o procedură stocată care calculează suma tuturor facturilor pentru un client, ​afişând lista facturilor şi valoarea lor, ordonată cronologic. +**5.** ​Să se afişeze toate cărţile unui autor, fie că le-a redactat singur, fie că acestea au mai mulţi autori.\\ Să se afișeze, în cadrul aceleiași interogări, ​numărul de volume elaborate, precizându-se numărul celor la care e unic autor şi al celor pe care le-a realizat colaborând cu alţi autori.\\ Vor fi incluși doar autorii care au elaborat mai mult de 4 titluri din care mai mult de 2 sunt individuale. 
-  - Să se identifice lista celor mai profitabile cărţi, ordonate în funcţie ​de suma obţinută din vânzări. + 
-  ​- ​Să se implementeze ​constrângerile cu privire ​la atributele tabelelor folosind triggere. +**6.** Să se șteargă din baza de date acei scriitori pentru care nu se găsește nici o carte în baza de date. 
-  - Să se parcurgă lista de utilizatori folosind un cursor, stabilindu-se vârsta medie a bărbaţilor şi vârsta medie a femeilor.+ 
 +**7.** ​Să se creeze ​o rutină stocată pe server (funcție) care determină valoarea unei facturi.\\ Folosind ​această rutină stocată, să se identifice primii trei clienţi în funcţie de volumul tranzacţiilor din librărie. 
 + 
 +**8.** ​Să se creeze o rutină stocată ​pe server (procedură) ​care calculează suma tuturor facturilor pentru un client, ​aceasta fiind întoarsă sub forma unui parametru. 
 + 
 +**9.** Folosind doar rutina stocată și având acces doar la tabela ​de utilizatori,​ să se determine utilizatorul pentru care suma facturilor este cea mai mare. 
 + 
 +<​spoiler|Indicații de Rezolvare>​ 
 +Este necesar să se folosească un cursor. 
 +</​spoiler>​ 
 + 
 +**10.** ​Să se implementeze ​un trigger ​la actualizarea tabelei ce conține diferitele formate în care sunt dispuse cărțile, astfel încât atunci când este modificat prețul, dacă acesta depășește media prețurilor celorlalte cărți având același format, să se modifice prețul la valoarea mediei, afișându-se și un mesaj corespunzător.
  
 ===== Resurse ====== ===== Resurse ======
Line 1993: Line 2019:
 ===== Soluții ===== ===== Soluții =====
  
-TODO+[[https://​github.com/​aipi2015/​Laborator00/​blob/​master/​solutions/​aipi2015-lab00b-solutions.sql|Rezolvări]]
laboratoare/laborator00b.1444352976.txt.gz · Last modified: 2015/10/09 04:09 by Andrei Roșu-Cojocaru
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0