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

Podobne dokumenty