Bazy danych 6. Przykłady
Transkrypt
Bazy danych 6. Przykłady
Bazy danych 6. Przykłady P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ semestr letni 2005/06 Przykład I Przedsiebiorca ˛ tworzy baz˛e danych pracowników na potrzeby wypłacania im wynagrodzeń i przekazywania zaliczek do Urz˛edu Skarbowego. Zachodza˛ nastepuj ˛ ace ˛ zależności funkcyjne: PracId → Stanowisko Stanowisko → Stawka PracId → StażPracy StażPracy Stawka → Wynagrodzenie PracId → Gmina Gmina → UrzadSkarbowy ˛ 6. Przykłady (1a) (1b) (1c) (1d) (1e) (1f) 2 1. Udowodnić, że PracId → Wynagrodzenie PracId → Stanowisko ∧ Stanowisko → Stawka =⇒ PracId → Stawka (2a) PracId → Stawka ∧ PracId → StażPracy =⇒ PracId → StażPracy Stawka (2b) PracId → StażPracy Stawka ∧ StażPracy Stawka → Wynagrodzenie =⇒ PracId → Wynagrodzenie (2c) 2. Spróbujmy zaprojektować taka˛ oto tabele: ˛ Pracownik (PracId, StażPracy, Stanowisko, Stawka, Gmina) (3) Tabela (3) nie jest w 3PN, gdyż zawiera relacje˛ przechodnia˛ (do atrybutu nie bed ˛ acego ˛ cz˛eścia˛ klucza). Ponieważ stawka przyporzadkowana ˛ jest stanowisku, nie zaś konkretnemu pracownikowi, wpisywanie stawek jak w (3) prowadzi do redundancji i anomalii modyfikacji. 6. Przykłady 3 3. Nastepuj ˛ acy ˛ projekt jest w 3PN, a nawet w PNBC Pracownicy (PracId, StażPracy, Stanowisko, Gmina) (4a) Stanowiska (Stanowisko, Stawka) (4b) Płace StażPracy, Stawka, Wynagrodzenie (4c) ˛ Urz˛edy (Gmina, UrzadSkarbowy ) (4d) 4. W opraciu o projekt (4), w jezyku ˛ algebry relacji sformułować zapytanie o wynagrodzenie konkretnego pracownika ρT1 πStanowisko,StażPracy,Wynagrodzenie (Stanowiska 1 Płace) πPracId,Wynagrodzenie (T1 1 Pracownicy) (5a) (5b) Sa˛ inne możliwe ścieżki wykonania tego zapytania. 6. Przykłady 4 Przykład II Kancelaria adwokacka prowadzi baz˛e czynności adwokackich. Każda czynność wykonana jest przez pracownika na jakimś stanowisku; ze stanowiskiem zwiazana ˛ jest stawka. Każda czynność wykonana jest na rzecz pewnego klienta. Cena, jaka˛ płaci klient, zależy od czasu trwania czynności adwokackiej i stawki, jaka˛ pobiera pracownik kancelarii. Zależności funkcyjne: PracId → Stanowisko Stanowisko → Stawka Czynność → Pracownik KlientId Czas Czas Stawka → Koszt KlientId → NazwaKlienta 6. Przykłady (6a) (6b) (6c) (6d) (6e) 5 Tabele: Czynności Czynność, PracId, KlientId, Czas (7a) Pracownicy (PracId, Stanowisko) (7b) Stanowiska (Stanowisko, Stawka) (7c) Opłaty (Czas, Stawka, Koszt) (7d) Kilenci (KlientId, NazwaKlienta) (7e) Mimo iż po zdefiniowaniu osobnych tabel Pracownicy i Stanowiska tabel jest wiecej, ˛ łacznie ˛ przechowujemy mniej informacji. 6. Przykłady 6 Przykład III Tworzymy baz˛e opisujac ˛ a˛ zaliczenia, jakie studenci uzyskiwali ze swoich projektów. Jeden student może podchodzić do tego samego projektu wiele razy (może poprawiać ocene). ˛ Jednego dnia jeden student może starać sie˛ tylko o jedno zaliczenie. NrZaliczenia → NrIndeksu NrProjektu Data Ocena (8a) NrIndeksu Data → NrZaliczenia (8b) Wydaje sie, ˛ że projekt Zaliczenia (NrZaliczenia, NrIndeksu, Data, NrProjektu, Ocena) (9) nie jest poprawny, gdyż nie uwzglednia ˛ drugiej z zależności (8). 6. Przykłady 7 Projekt Zaliczenia (NrZaliczenia, NrIndeksu, Data, NrProjektu, Ocena) (10) nie jest poprawny, gdyż zawiera zależności przechodnie: NrIndeksu Data → NrZaliczenia → NrProjektu Ocena, a zatem nie jest w 3PN (ustaliliśmy, że NrZaliczenia nie może być kluczem!). 6. Przykłady 8 Rozbijmy pierwsza˛ z zależności funkcyjnych (8)na dwie cz˛eści: NrZaliczenia → NrProjektu Ocena (11a) NrZaliczenia → NrIndeksu Data (11b) NrIndeksu Data → NrZaliczenia (11c) Zależności (11b), (11c) sa˛ swoimi odwrotnościami, a zatem jedna˛ z nich można wyeliminować. Projekt KtoKiedy (NrIndeksu, Data, NrZaliczenia) (12a) CoZaCo (NrZaliczenia, NrProjektu, Ocena) (12b) jest w PNBC. Ta analiza pokazuje, że projekt (9) tak naprawde˛ jest poprawny . 6. Przykłady 9 Przykład IV∗ Fabryka w magazynie przechowuje cz˛eści różnego typu (śrubki i nakretki). ˛ Każda cz˛eść ma swój unikalny identyfikator. W magazynie każdy pojemnik („regał”) zawiera identyczne cz˛eści. Mamy relacje funkcyjne NrRegału → IdCz˛eści Ilość (13a) Śrubki: IdCz˛eści → Długość Średnica TypŁba (13b) Nakretki: ˛ IdCz˛eści → Średnica (13c) Projekty odpowiednich tabel sa˛ (pozornie) oczywiste. 6. Przykłady 10 Niektóre zapytania bardzo wykonać jest bardzo łatwo, na przykład wskaż regały, w których znajduja˛ sie˛ śrubki o długości 3/4": πNrRegału πIdCz˛eści σDługość=3/4"Śrubki 1 Regały (14) Inne zapytania sa˛ bardziej problematyczne — na przykład jaki typ łba maja˛ śrubki przechowywane na regale 58 πTypŁba σNrRegału=58Regały 1 Śrubki (15) To zapytanie powinno zadziałać dobrze: Jeśli cz˛eści przechowywane na regale 58 sa˛ śrubkami, wszystko jest OK. Jeśli cz˛eści przechowywane na regale 58 nie sa˛ śrubkami (tylko nakretkami), ˛ złaczenie ˛ w (15) da zbiór pusty, a wiec ˛ także OK — pod warunkiem, że nie przypiszemy tego samego IdCz˛eści śrubkom i nakretkom, ˛ a takiego wiezu ˛ w naszym projekcie nie ma. 6. Przykłady 11 Problem można cz˛eściowo rozwiazać ˛ modyfikujac ˛ tabele˛ Regały: NrRegału → IdCz˛eści RodzajCz˛eści Ilość (16) Wówczas możliwe jest sprawdzenie na których regałach znajduja˛ sie˛ śrubki ρRegałyŚrubek σRodzajCz˛eści=’Śrubki’Regały (17) i dalej πTypŁba σNrRegału=58RegałyŚrubek 1 Śrubki (18) Jeśli na regale 58 nie ma śrubek, dostaniemy zbiór pusty. 6. Przykłady 12 W relacyjnym modelu danych nie ma “rekordów z wariantami”, zanych z niektórych jezyków ˛ programowania. Prawdziwym rozwiazaniem ˛ byłoby przekonanie zleceniodawcy, że stosowanie jednolitej numeracji do różnego rodzaju cz˛eści nie jest rozsadne. ˛ Jeżeli nie da sie˛ zleceniodawcy do tego przekonać — a zleceniodawca może mieć uzasadnione powody aby protestować — najlepszym rozwiazaniem ˛ jest zsumowanie zależności (13b), (13c), które maja˛ ten sam poprzednik: NrRegału → IdCz˛eści Ilość IdCz˛eści → Długość Średnica TypŁba (19a) (19b) Atrybut Średnica wystepuje ˛ w nastepnikach ˛ dwa razy, wiec ˛ po zsumowaniu pojawia sie˛ tylko raz. Teraz należy rozumieć, że jeżeli atrybuty Długość, TypŁba przyjmuja˛ wartość null, mamy do czynienia z nakretk ˛ a, ˛ w przeciwnym zaś razie ze śrubka. ˛ 6. Przykłady 13 Zgodnie z zasadami sztuki, funkcja określajaca ˛ czy dana cz˛eść jest śrubka, ˛ czy nakretk ˛ a, ˛ powinna być wbudowana w baz˛e danych (jako tak zwana procedura składowana). Podobnie w bazie powinien znaleźć sie˛ wiez ˛ domenowy (check) stwierdzajacy, ˛ że atrybuty Długość, TypŁba musza˛ być jednocześnie null lub not null. Atrybut Średnica powinien być zawsze not null. 6. Przykłady 14 Przykład V (kolejowy) Tworzymy baz˛e danych zawierajac ˛ a˛ (uproszczony) rozkład jazdy pociagów ˛ oraz informacje o sprzedanych biletach. Po pierwsze, • Z każdym pociagiem ˛ stowarzyszona jest lista stacji, na których sie˛ on zatrzymuje. • Z każda˛ stacja˛ stowarzyszony jest zbiór pociagów, ˛ na których sie˛ on zatrzymuje. • Dla każdej stacji należy podać godziny przyjazdu i odjazdu każdego pocia˛ gu, który sie˛ na niej zatrzymuje. 6. Przykłady 15 Pierwszy i ostatni punkt odpowiadaja˛ nastepuj ˛ acym ˛ zależnościom funkcyjnym: NrPociagu ˛ Stacja → NrKolejny (20a) NrPociagu ˛ Stacja → Przyjazd Odjazd (20b) co prowadzi do nastepuj ˛ acej ˛ struktury tabeli Stacja, NrKolejny, Przyjazd, Odjazd Przystanki NrPociagu, ˛ (21) Powstaje jednak pewna watpliwość: ˛ A co sie˛ stanie jeśli jakiś pociag ˛ nie przejeżdża przez dana˛ stacje? ˛ Czy przypoadkiem zależności funkcyjne (20) nie wymagaja˛ wyspecyfikowania wszystkich możliwych par NrPociagu-Stacja? ˛ Oczywiście nie: Zależność funkcyjna ma postać implikacji: jeżeli podamy atrybuty poprzednika, to ustalamy jednoznacznie wartości atrybutów nastepnika. ˛ A jeżeli nie, to nie ,. 6. Przykłady 16 Rola zapytań A co z określeniem zbioru pociagów, ˛ które zatrzymuja˛ sie˛ na danej stacji? Nie ˛ ać ˛ trzeba w tym celu konstruować osobnej tabeli (relacji) — można to osiagn poprzez odpowiednie zapytanie: πNrPociagu σStacja=’Koluszki’ (Przystanki) ˛ (22) Nie wszystkie informacje przechowuje sie˛ w postaci osobnych tabel — użyteczność baz danych polega (miedzy ˛ innymi) na tym, że wiele rzeczy da sie˛ zrealizować poprzez zapytania. 6. Przykłady 17 Zadanie Posługujac ˛ sie˛ schematem tabeli Przystanki (21), znaleźć wszystkie pociagi, ˛ które przejeżdżaja˛ przez stacje˛ X oraz przez stacje˛ Y. πNrPociagu σStacja=’X’ (Przystanki) 1 πNrPociagu σStacja=’Y’ (Przystanki) ˛ ˛ (23) Tabela Przystanki wystepuje ˛ w powyższym zapytaniu dwa razy, po obu stronach ˛ (self-join). złaczenia. ˛ Jest to przykład tak zwanego samozłaczenia 6. Przykłady 18 Zadanie∗ Posługujac ˛ sie˛ schematem tabeli Przystanki (21), znaleźć wszystkie pociagi, ˛ które najpierw przejeżdżaja˛ przez stacje˛ X, później przez stacje˛ Y. h i (24a) h i (24b) ρStacjaX(NrPociagu,NrX) πNrPociagu,NrKolejny σStacja=’X’ (Przystanki) ˛ ˛ ρStacjaY(NrPociagu,NrY) πNrPociagu,NrKolejny σStacja=’Y’ (Przystanki) ˛ ˛ πNrPociagu σNrX<NrY (StacjaX 1 StacjaY) ˛ (24c) Zapytanie (24) oczywiście także zawiera samozłaczenie, ˛ tyle że w formie niejawnej. Pytanie: Po jakim atrybucie realizowane jest złaczenie ˛ w (24c)? Po atrybucie ˛ sie˛ atrybut w tabelach StacjaX, StacjaY. NrPociagu, ˛ bo to jest powtarzajacy 6. Przykłady 19 Zadanie domowe , Posługujac ˛ sie˛ schematem tabeli Przystanki (21), znaleźć wszystkie pociagi, ˛ które najpierw przejeżdżaja˛ przez stacje˛ X, później przez stacje˛ Y, oraz odpowiednie godziny odjazdu z X i przyjazdu do Y. 6. Przykłady 20