Bazy Danych egzamin poprawkowy, 2012 rozwiazania 1 Zadania 1. (20p) Stwórz diagram ER dla następującego opisu bazy danych. W szczególności oznacz słabe encje, klucze, rodzaje związków (czy wiele do jednego, integralność referencyjną). Szpitale posiadają nazwę i adres. Sale w szpitalach posiadają numery. Osoby posiadają imię, nazwisko oraz numer pesel. Niektóre osoby to pacjenci. Niektóre osoby to lekarze. Lekarze posiadają specjalizaje, pacjenci posiadają wiek. Każdy lekarz pracuje w dokładnie jednym szpitalu. Każdy pacjent przechodzi w szpitalu przynajmniej jedną konsultację z lekarzem. Konsultacja taka ma unikalną datę. Każdy pacjent znajduje się w jednej z sal szpitala. 2. (10p) Przekształć stworzony w poprzednim zadaniu diagram ER na projekt relacyjny. W przypadku trudności proszę o stworzenie projektu relacyjnego na podstawie samego opisu w zadaniu powyżej. 3. (10p) W relacji R(A, B, C, D, E, F ) występują następujące zależności funkcyjne: AC B, BD F, F C, F E. Wyznacz wszystkie klucze w relacji R. Wskaż, które klucze są minimalne. 4. Mamy dane tabele Zwierzeta(id, gatunek, nr_klatki), Klatki(numer, max_liczba), Pozwolenia(nazwisko, gatunek), Opiekunowie(nazwisko,nr_klatki). Klucze relacji są podkreślone. max_liczba określa maksymalną liczbę zwierząt w klatce (bez rozróżnienia na gatunki). Pozwolenia określa kto może opiekować się danym gatunkiem zwierząt a Opiekunowie określa, kto jest odpowiedzialny za zwierzęta w danej klatce. W jednej klatce mogą znajdować się zwierzęta różnych gatunków, wiele osób może opiekować się tą samą klatką. Uwaga. Liczba gatunków nie jest ograniczona. Jeśli jednak, ktoś będzie potrafił poprawnie napisać część z kwerend dla ustalonej liczby gatunków ( goryl, mysz, kot ) to otrzyma połowę punktów. Napisz zapytania SQL dla: (a) (3p) listę klatek, w których przebywają jednocześnie koty i myszy, (b) (3p) lista klatek, które nie są zapełnione (liczba zwierząt jest mniejsza od maksymalnej), 1
(c) (3p) lista osób i zwierząt, którymi dana osoba mogłaby się opiekować, gdyż ma odpowiednie pozwolenie, (d) (3p) liste osób i klatek, takich że w danej klatce znajdują się zwierzęta, którymi mogłaby opiekować się dana osoba, (e) (3p) usunie z tabeli Opiekunowie wszystkie wiersze, dla których osoba nie posiada pozwolenia na opiekowanie się żadnym gatunkiem zwierzęcia, które znajduje się w danej klatce. 5. (15p) Napisz program PL/SQL, który zmniejszy o 1 wartość max_liczba we wszystkich klatkach, w których znajdują się zwierzę z gatunku goryl, a zwiększy o 1 wartość max_liczba we wszystkich klatkach, w których występuje zwierzę z gatunku mysz (jeśli w klatce występuje zarówno goryl jak i mysz, to wartość max_liczba nie powinna się zmienić). 6. (15p) Napisz wyzwalacz, który po usunięciu pozwolenia na opiekę nad danym gatunkiem, usunie z tabeli Opiekunowie wszystkie rekordy, dla których osoba nie może opiekować się żadnym gatunkiem występującym w klatce. 7. Rozważmy relacje R(A,B) oraz S(B,C). (a) (10p) Napisz równoważne zapytanie bez zagnieżdżonego select: select R.A S.B, S.C from R, S where R.B=S.B and S.C <= all (select S1.C from S S1 where S1.B= S.B) ; (b) (5p) Zoptymalizuj powyższe zapytanie, wiedząc, że B jest kluczem w S. 2 Rozwiazania Poniżej zaprezentowano przykładowe rozwiązania części zadań. Nie zawsze są to rozwiązania optymalne. 1. Poniżej przykładowy diagram. Encja Sale jest słabą encją gdyż różne sale w różnych szpitalach mają te same numery. Dlatego część klucza dla encji Sale jest brana z klucza encji Szpitale poprzez relację w. Encja Osoby dzieli się na Lekarze i Pacjenci jednak część atrybutów jest wspólnych dla obu tych grup. 2
numer sali nazwa adres Szpitale w Sale pracuje w imie nazwisko Osoby pesel leży na ISA Lekarze Pacjenci specjalizacja konsultuje wiek data 3
2. Przekładając powyższy diagram na relacje w bazie danych na początku tworzymy relację Szpitale(nazwa, adres). Następnie, tworzymy relację Sale(numer_sali, nazwa_szpitala). Zamiast jednej relacji Osoby możemy stworzyć dwie relacje: Lekarze(pesel, imie, nazwisko, specjalizacja, nazwa_szpitala) oraz Pacjenci(pesel, imie, nazwisko, wiek, numer_sali, nazwa_szpitala). Ponieważ pracuje w oraz leży na były funkcyjne, możemy nie tworzyć dla nich odrębnych relacji a wszystkie istotne informacje umieszczamy w powyższych dwóch relacjach (bez redundancji informacji). Na koniec tworzymy relację opisują konsultuje jako: Konsultacja(pesel_lekarza, pesel_pacjenta, data). 3. W skład każdego klucza muszą wchodzic atrybuty A i D one same nie pozwalają wyznaczyć jeszcze wartości pozostałych atrybutów. Jednym z kluczy minimalnych jest zbiór A, B, D. Znając B i D wyznaczymy wartość F. Znając F wyznaczymy wartość C i E. W ten sposób wyznaczyliśmy wartość każdego atrybutu w relacji. Inny klucz minimalny to zbiór A, C, D. Znając A i C wyznaczymy wartość B a znając B możemy już wyznaczyć wartość każdego innego atrybutu jak poprzednio. Ostatni klucz minimalny to zbiór A, D, F. 4. (a) s e l e c t Z1. n r _ k l a t k i from Z w i e r z e t a Z1, Z w i e r z e t a Z2 where z1. n r _ k l a t k i = z2. n r _ k l a t k i and z1. g a t u n e k = mysz and z2. g a t u n e k = kot ; (b) s e l e c t K. numer from K l a t k i K where k. m a x _ l i c z b a > ( s e l e c t c o u n t ( ) from z w i e r z e t a Z where z. n r _ k l a t k i = K. numer ) ; (c) (d) (e) d e l e t e from opiekunowie o where n o t e x i s t s ( s e l e c t z. i d from z w i e r z e t a z, p o z w o l e n i a p where o. n r _ k l a t k i =z. n r _ k l a t k i and z. g a t u n e k =p. g a t u n e k and p. nazwisko =o. nazwisko ) ; 5. Proszę spróbować napisać tą procedurę używając tylko jednego kursora ale za to z parametrem, którym będzie nazwa gatunku. 4
d e c l a r e c u r s o r c_mysz i s s e l e c t k. numer, k. m a x _ l i c z b a from k l a t k i k where e x i s t s ( s e l e c t z. n r _ k l a t k i from z w i e r z e t a z where z. n r _ k l a t k i =k. numer and z. g a t u n e k = mysz ) f o r u p d a t e of k. m a x _ l i c z b a ; c u r s o r c _ g o r y l i s s e l e c t k. numer, k. m a x _ l i c z b a from k l a t k i k where e x i s t s ( s e l e c t z. n r _ k l a t k i from z w i e r z e t a z where z. n r _ k l a t k i =k. numer and z. g a t u n e k = g o r y l ) f o r u p d a t e of k. m a x _ l i c z b a ; v_numer K l a t k i. numer%t y p e ; v _ l i c z b a K l a t k i. m a x _ l i c z b a%t y p e ; b e g i n open c_mysz ; loop f e t c h c_mysz i n t o v_numer, v _ l i c z b a ; e x i t when c_mysz%n o t f o u n d ; u p d a t e K l a t k i s e t m a x _ l i c z b a = v _ l i c z b a +1 where c u r r e n t of c_mysz ; end l oop ; c l o s e c_mysz ; open c _ g o r y l ; loop f e t c h c _ g o r y l i n t o v_numer, v _ l i c z b a ; e x i t when c _ g o r y l%n o t f o u n d ; i f v _ l i c z b a >0 t h e n u p d a t e K l a t k i s e t m a x _ l i c z b a = v _ l i c z b a 1 where c u r r e n t of c _ g o r y l ; end i f ; end l oop ; c l o s e c _ g o r y l ; end ; 6. Poniższy wyzwalacz nie zawiera opcji "for each row". Dlaczego? 5
c r e a t e or r e p l a c e t r i g g e r usun_opiekunowie a f t e r d e l e t e on p o z w o l e n i a b e g i n d e l e t e from opiekunowie o where n o t e x i s t s ( s e l e c t Z. i d from z w i e r z e t a z, p o z w o l e n i a p where p. nazwisko =o. nazwisko and p. g a t u n e k = z. g a t u n e k and z. n r _ k l a t k i = o. n r _ k l a t k i ) ; end ; 6