Sunteți pe pagina 1din 8

Proiectarea Bazelor de Date

Dumitru Andrei, CAL IV


Enunțul problemei:

Să se creeze o bază de date care să ţină evidenţa unor edituri.


Fiecare editură are un director şi publică o serie de reviste. Fiecare
revistă apare de cateva ori pe an. Fiecare revistă conţine articole ale
unor autori. Un autor poate scrie unul sau mai multe articole, şi un
articol poate fi scris de unul sau mai mulţi autori. Ficare articol are
un titlu şi un paragraf explicativ. Un articol poate apare în una sau
mai multe reviste.

Cerințe:
1. Să se realizeze modelul entitate-legătură
2. Să se facă trecerea la modelul relaţional (să se detalieze operaţiile
effectuate pentru fiecare entitate în parte)
3. Să se creeze o bază de date care să conţină:
3.1. Minim 9-10 tabele, volum mare de informaţii reale –
minim 20 înregistrări în fiecare tabel
3.2. Legături între tabele;
3.3. Integritatea referenţială pentru a efectua corect operaţiile de
actualizare (adăugare, ştergere, modificare);
3.4. Chei primare şi chei externe;
3.5. Reguli de ştergere şi modificare în cascadă pentru entităţile
cu chei externe.
4. Să se verifice calitatea proiectării bazei de date cu ajutorul
formelor normale (se va normaliza baza de date până la FNBC -
inclusiv).
5. Să se indexeze baza de date creată (crearea minim a unui index).
6. Să se facă testarea bazei de date prin efectuarea de diferite operaţii
asupra ei. Trebuie să existe cel puţin o interogare din fiecare tip (în
total minim 15 interogări), 2 funcţii diferite (care să nu facă un
simplu select), 2 proceduri stocate, şi 1 trigger.
Rezolvare:
1&2:
Modelul entitate-legătură
Database diagram
3:

Tabele:
→ edituri: conține următoarele informații despre o editură: id-ul, id-
ul directorului, numele, data înființări, adresa
→ directori: conține următoarele informații despre un director: id,
nume, vârsta, adresa
→ reviste: stochează informații despre o revistă precum: id-ul, id-ul
editurii, numele, descrierea, genul, data și numărul
→ revista_articol: tabelă de legătură între revistă și articol
→ articol: informații despre un articol: id-ul, id-ul categoriei, titlul,
text-ul paragrafului
→ categorii: conține următoarele informatții despre o categorie: id-
ul și numele
→ autori: conține următoarele informatții despre un autor: id-ul, id-
ul funcției, numele și vârsta
→ autor_articol: tabelă de legătură între autor și articol
→ functii: conține următoarele informatții despre o funcție: id-ul și
numele acesteia
5:
Indecși:
→ CREATE INDEX UNIQUE_EDITURA ON edituri (nume,
data_infiintare)
→ CREATE INDEX UNIQUE_ARTICOL ON articole
(id_categorie, titlu)
→ CREATE INDEX UNIQUE_REVISTA ON edituri (nume,
descriere)

6:

Funcții:
→ CREATE FUNCTION NumarDeRevistePerioada
( @nume_revista VARCHAR(50) )

RETURNS TABLE
AS
RETURN (
SELECT COUNT(*) as result FROM revista_articol where
id_revista = (select id from reviste where nume = @nume_revista)
);

→ CREATE FUNCTION NumarDeArticoleRevista


(@nume_revista VARCHAR(50), @start datetime2, @final
datetime2)

RETURNS TABLE
AS

RETURN (
SELECT COUNT(*) as result FROM reviste where nume =
@nume_revista and data between @start and @final)
);

Proceduri Stocate:
→ CREATE PROCEDURE UpdateOldArticlesTitle
AS
DECLARE @id int

DECLARE cursorT CURSOR


FOR
SELECT id
FROM articole
WHERE YEAR(data) < YEAR(GETDATE()) -1

OPEN cursorT
FETCH NEXT FROM cursorT INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE dbo.articole SET titlu ='OLD' + titlu where id= @id;
FETCH NEXT FROM cursorT INTO @id
END
CLOSE cursorT
DEALLOCATE cursorT
→ CREATE PROCEDURE DetaliiRevista
(@id int
@nume varchar(50) OUTPUT,
@descriere varchar(5) OUTPUT,
@gen varchar(50) OUTPUT)

AS
BEGIN
SELECT @nume = nume, @descriere=descriere, @gen = gen from reviste where id= @id;
END

Triggere:
→ create trigger reminder ON dbo.edituri
after insert as
RAISERROR ('Nu uita sa adaugi un director nou', 16, 10);
Interogari:
1) select id from edituri where nume like ‘Niculescu’;
2) delete from categorii where nume = ‘SF’;
3) update edituri set name = ‘Editura Politehnica’ where id = 3;
4) select count(*) from reviste_articol where id_revista > 10;
5) select * from edituri join directori on
edituri.id_director=directori.id limit 10;
6) update reviste set numar = numar + 1 where id between 10 and
15;
7) delete from functii where nume like ‘%asistent%’;
8) select nume, numar, data from reviste where id between 5 and 9;
9) select count(id) as numar_autori from autori;
10) select nume, descriere from reviste where numar > 2;
11) select * from revista_articol join reviste on
revista_articol.id_revista = reviste.id
12) delete from revista_articol where id_articol > 15 and id >35;
13) update articole set titlu = ‘test’ where id in (15,16,17);
14) update directori set nume = ‘Popescu Mihai’ where id =4;
15) delete from autor_articol where id in (8,9);

S-ar putea să vă placă și