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 Przedsiębiorca tworzy bazę danych pracowników na potrzeby wypłacania im wynagrodzeń i przekazywania zaliczek do Urzędu Skarbowego. Zachodza następujace zależności funkcyjne: PracId Stanowisko Stanowisko Stawka PracId StażPracy StażPracy Stawka Wynagrodzenie PracId Gmina Gmina UrzadSkarbowy (1a) (1b) (1c) (1d) (1e) (1f) 6. Przykłady 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 tabelę: Pracownik (PracId, StażPracy, Stanowisko, Stawka, Gmina) (3) Tabela (3) nie jest w 3PN, gdyż zawiera relację przechodnia (do atrybutu nie będacego częś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. Następujacy projekt jest w 3PN, a nawet w PNBC Pracownicy (PracId, StażPracy, Stanowisko, Gmina) Stanowiska (Stanowisko, Stawka) Płace ( StażPracy, Stawka, Wynagrodzenie ) Urzędy (Gmina, UrzadSkarbowy) (4a) (4b) (4c) (4d) 4. W opraciu o projekt (4), w języku algebry relacji sformułować zapytanie o wynagrodzenie konkretnego pracownika ρ T1 ( πstanowisko,stażpracy,wynagrodzenie (Stanowiska Płace) π PracId,Wynagrodzenie (T 1 Pracownicy) Sa inne możliwe ścieżki wykonania tego zapytania. ) (5a) (5b) 6. Przykłady 4
Przykład II Kancelaria adwokacka prowadzi bazę 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 (6a) (6b) (6c) (6d) (6e) 6. Przykłady 5
Tabele: Czynności ( Czynność, PracId, KlientId, Czas ) Pracownicy (PracId, Stanowisko) Stanowiska (Stanowisko, Stawka) Opłaty (Czas, Stawka, Koszt) Kilenci (KlientId, NazwaKlienta) (7a) (7b) (7c) (7d) (7e) Mimo iż po zdefiniowaniu osobnych tabel Pracownicy i Stanowiska tabel jest więcej, łacznie przechowujemy mniej informacji. 6. Przykłady 6
Przykład III Tworzymy bazę opisujac a zaliczenia, jakie studenci uzyskiwali ze swoich projektów. Jeden student może podchodzić do tego samego projektu wiele razy (może poprawiać ocenę). Jednego dnia jeden student może starać się tylko o jedno zaliczenie. NrZaliczenia NrIndeksu NrProjektu Data Ocena NrIndeksu Data NrZaliczenia (8a) (8b) Wydaje się, że projekt Zaliczenia (NrZaliczenia, NrIndeksu, Data, NrProjektu, Ocena) (9) nie jest poprawny, gdyż nie uwzględnia 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ęści: NrZaliczenia NrProjektu Ocena NrZaliczenia NrIndeksu Data NrIndeksu Data NrZaliczenia (11a) (11b) (11c) Zależności (11b), (11c) sa swoimi odwrotnościami, a zatem jedna z nich można wyeliminować. Projekt KtoKiedy (NrIndeksu, Data, NrZaliczenia) CoZaCo (NrZaliczenia, NrProjektu, Ocena) (12a) (12b) jest w PNBC. Ta analiza pokazuje, że projekt (9) tak naprawdę jest poprawny. 6. Przykłady 9
Przykład IV Fabryka w magazynie przechowuje części różnego typu (śrubki i nakrętki). Każda część ma swój unikalny identyfikator. W magazynie każdy pojemnik ( regał ) zawiera identyczne części. Mamy relacje funkcyjne NrRegału IdCzęści Ilość (13a) Śrubki: IdCzęści Długość Średnica TypŁba (13b) Nakrętki: IdCzęś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 się śrubki o długości 3/4": π NrRegału ( πidczęści ( σdługość=3/4" Śrubki ) Regały ) (14) Inne zapytania sa bardziej problematyczne na przykład jaki typ łba maja śrubki przechowywane na regale 58 (( π TypŁba σnrregału=58 Regały ) Śrubki ) (15) To zapytanie powinno zadziałać dobrze: Jeśli części przechowywane na regale 58 sa śrubkami, wszystko jest OK. Jeśli części przechowywane na regale 58 nie sa śrubkami (tylko nakrętkami), złaczenie w (15) da zbiór pusty, a więc także OK pod warunkiem, że nie przypiszemy tego samego IdCzęści śrubkom i nakrętkom, a takiego więzu w naszym projekcie nie ma. 6. Przykłady 11
Problem można częściowo rozwiazać modyfikujac tabelę Regały: NrRegału IdCzęści RodzajCzęści Ilość (16) Wówczas możliwe jest sprawdzenie na których regałach znajduja się śrubki ) (σ Regały RodzajCzęści= Śrubki (17) ρ RegałyŚrubek i dalej π TypŁba (( σnrregału=58 RegałyŚrubek ) Ś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 języków programowania. Prawdziwym rozwiazaniem byłoby przekonanie zleceniodawcy, że stosowanie jednolitej numeracji do różnego rodzaju części nie jest rozsadne. Jeżeli nie da się 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ęści Ilość IdCzęści Długość Średnica TypŁba (19a) (19b) Atrybut Średnica występuje w następnikach dwa razy, więc po zsumowaniu pojawia się tylko raz. Teraz należy rozumieć, że jeżeli atrybuty Długość, TypŁba przyjmuja wartość null, mamy do czynienia z nakrętka, w przeciwnym zaś razie ze śrubka. 6. Przykłady 13
Zgodnie z zasadami sztuki, funkcja określajaca czy dana część jest śrubka, czy nakrętka, powinna być wbudowana w bazę danych (jako tak zwana procedura składowana). Podobnie w bazie powinien znaleźć się więz 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ę 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 się on zatrzymuje. Z każda stacja stowarzyszony jest zbiór pociagów, na których się on zatrzymuje. Dla każdej stacji należy podać godziny przyjazdu i odjazdu każdego pocia- gu, który się na niej zatrzymuje. 6. Przykłady 15
Pierwszy i ostatni punkt odpowiadaja następujacym zależnościom funkcyjnym: NrPociagu Stacja NrKolejny NrPociagu Stacja Przyjazd Odjazd (20a) (20b) co prowadzi do następujacej struktury tabeli Przystanki ( NrPociagu, Stacja, NrKolejny, Przyjazd, Odjazd ) (21) Powstaje jednak pewna watpliwość: A co się stanie jeśli jakiś pociag nie przejeżdża przez dana stację? 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 następnika. A jeżeli nie, to nie. 6. Przykłady 16
Rola zapytań A co z określeniem zbioru pociagów, które zatrzymuja się na danej stacji? Nie trzeba w tym celu konstruować osobnej tabeli (relacji) można to osiagn ać poprzez odpowiednie zapytanie: ( π NrPociagu σstacja= Koluszki (Przystanki) ) (22) Nie wszystkie informacje przechowuje się w postaci osobnych tabel użyteczność baz danych polega (między innymi) na tym, że wiele rzeczy da się zrealizować poprzez zapytania. 6. Przykłady 17
Zadanie Posługujac się schematem tabeli Przystanki (21), znaleźć wszystkie pociagi, które przejeżdżaja przez stację X oraz przez stację Y. [ ( πnrpociagu σstacja= X (Przystanki) )] [ ( π NrPociagu σstacja= Y (Przystanki) )] (23) Tabela Przystanki występuje w powyższym zapytaniu dwa razy, po obu stronach złaczenia. Jest to przykład tak zwanego samozłaczenia (self-join). 6. Przykłady 18
Zadanie Posługujac się schematem tabeli Przystanki (21), znaleźć wszystkie pociagi, które najpierw przejeżdżaja przez stację X, później przez stację Y. [ ρ StacjaX(NrPociagu,NrX) πnrpoci ( )] agu,nrkolejny σstacja= X (Przystanki) [ ( ρ StacjaY(NrPociagu,NrY) πnrpociagu,nrkolejny σstacja= Y (Przystanki) ( π NrPociagu σnrx<nry (StacjaX StacjaY) ) )] (24a) (24b) (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 NrPociagu, bo to jest powtarzajacy się atrybut w tabelach StacjaX, StacjaY. 6. Przykłady 19
Zadanie domowe Posługujac się schematem tabeli Przystanki (21), znaleźć wszystkie pociagi, które najpierw przejeżdżaja przez stację X, później przez stację Y, oraz odpowiednie godziny odjazdu z X i przyjazdu do Y. 6. Przykłady 20