Wskazówki i przykłady tworzenia diagramów związków encji


Rozdział 3

Wskazówki i przykłady tworzenia diagramów związków encji

(materiał przygotowany przez Agnieszkę Chądzyńską honzik@pjwstk.waw.pl dedykowany studentom)

Narzędziem wykorzystywanym do tworzenia diagramów jest MS Visio. Opis narzędzia znajduje się w poprzednim rozdziale. Tutaj skupiam się na fazie tworzenia samego diagramu.

Wstęp

Tworzenie poprawnych diagramów związków encji nie jest łatwe. Moi studenci bardzo często prosili mnie o wskazanie im książki, w której mogliby znaleźć kilka przykładów z opisem jak zostały one stworzone. Ponieważ wśród wielu pożytecznych i ciekawych skądinąd tomów nie znalazłam takiego, w którym rozwiązano by pewną liczbę zadań dotyczących modelowania diagramów związków encji, postanowiłam sama coś dla nich napisać. Efektem tej pracy jest tenże rozdział. Mam nadzieję, że ktoś z niego skorzysta.

Dodatek ten zawiera osiem przykładowych zadań wraz z rozwiązaniami. Są one ułożone według stopnia trudności. Pierwsze trzy przykłady, które zatytułowałam Geografia, Hotel i Drużyny piłkarskie są typowo „akademickie”. Biblioteka jest również przykładem mającym łatwy opis problemu, aczkolwiek sam diagram jest już nieco bardziej rozbudowany. Kolejne zadania, czyli Plan zajęć i Komunikacja miejska, są oczko trudniejsze. Przede wszystkim w treści zadania podany jest wykaz funkcji, które będzie musiała zrealizować nasza baza, a nie opis liczności związków. Poza tym diagram planu zajęć jest relatywnie dość rozbudowany. Ogólnie jednak pierwsze sześć zadań to zadania standardowe. Dwa ostatnie przykłady - Koktajle i Urząd Stanu Cywilnego - odbiegają nieco od schematu. Nie są może trudne, ale dość ciekawe, gdyż przy ich tworzeniu najbardziej liczy się pomysł rozwiązania.

Dziękuję Lechowi Banachowskiemu i Elżbiecie Mrówce-Matejewskiej za pomoc i cenne uwagi dotyczące tego rozdziału. Dziękuję również moim studentom, bez których inspiracji na pewno by on nie powstał.

1. Geografia

Opracuj schemat bazy danych Geografia. Uwzględnij wiadomości o państwach, miastach, morzach, językach urzędowych i kontynentach, wiedząc, że:

Pierwszym etapem tworzenia diagramu związków encji jest zidentyfikowanie encji, które będą nam potrzebne. W tym zadaniu mamy wyraźnie powiedziane, że musimy uwzględnić wiadomości o państwach, miastach, morzach, językach urzędowych i kontynentach, a zatem bez trudu wyodrębniamy encje: Panstwo, Miasto, Morze, Jezyk i Kontynent. Musimy jednak zdawać sobie sprawę, że tak naprawdę to podczas projektowania realnego systemu informacje o potrzebnych encjach musimy wyłowić z rozmów z przyszłymi użytkownikami tegoż systemu. Wróćmy jednak do naszego przykładu. Wiemy już jakie encje będziemy uwzględniać. Teraz przyszedł czas na określenie atrybutów każdej z nich. Czyli będziemy zastanawiać się, jakie wiadomości chcemy trzymać o państwach, miastach, morzach, językach urzędowych i kontynentach. Musimy pamiętać o dwóch podstawowych zasadach:

  1. Atrybut powinien opisywać encję, przy której się go umieszcza!

Chodzi o to, żeby nie umieszczać w encji atrybutów, które od niej nie zależą, bądź zależą od niej tylko częściowo. Nikt zapewne nie wpisze do encji Panstwo atrybutu NrRejestracyjnySamochodu, bo to nie miałoby sensu. Ale już np. czy taką DługośćGranicyzMorzem należy dać jako atrybut państwa czy morza czy może encji asocjacyjnej? Tu mógłby pojawić się problem. W tym przypadku musimy dokładnie zastanowić się, o co nam chodzi. Jeśli chodzi nam o długość granicy morskiej państwa, wyrażony jedną liczbą dla każdego państwa (np. 1222 km), to jest to atrybut encji Panstwo i tam go umieszczamy. Ale jeśli chodzi nam o długość granicy państwa z każdym oblewającym go morzem, to wtedy musimy naszą DługośćGranicyzMorzem umieścić jako atrybut encji łączącej państwo i morze, ponieważ zależy ona i od morza i od państwa jednocześnie. Inna sprawa, że czasem jest problem. Bo np. czy NumerTelefonu w pracy jest atrybutem pokoju czy pracownika?

  1. W pierwszej fazie projektowania identyfikuje się tylko atrybuty opisujące daną encję!

Tutaj chodzi o to, aby nie wpisywać kluczy obcych (przychodzących z innej tabeli). Np. w encji Miasto, nie należy wpisywać atrybutu Panstwo, ponieważ ten atrybut reprezentuje związek encji Miasto z encją Panstwo. A więc nie traktuje się go jako atrybut opisujący encję Miasto, ale atrybut opisujący związek.

Na tym etapie projektowania diagramu trzeba jeszcze zastosować zasadę zwaną pierwszą postacią normalną: Każdy atrybut musi zawierać wartość jednostkową. Oznacza to, że nie wolno nam np. w encji Pracownik umieszczać pola takiego jak DzieciPracownika, ponieważ pracownik może mieć wiele dzieci. Należy też unikać pól segmentowych, takich jak np. ImieINazwisko.

Dla każdej encji warto również ustalić klucz główny (jednoznaczny identyfikator).

Po zastosowaniu wszystkich tych wskazówek nasz diagram wygląda tak:

0x08 graphic

Kolejnym niezmiernie istotnym etapem tworzenia diagramu jest zidentyfikowanie związków między encjami. Pamiętajmy, że bardzo często podczas projektowania diagramów związków encji, my sami musimy znaleźć zależności pomiędzy poszczególnymi encjami. Bardzo rzadko zostanie nam podana tak dokładna specyfikacja (czyli opis problemu) jak w tym zadaniu. Najczęściej klient poda nam, co powinno być możliwe do wykonania po stworzeniu systemu, a my w rozmowie z nim musimy ustalić jak kolejne encje (oczywiście w rozmowie z klientem unikamy tego słowa) łączą się ze sobą. Niektóre rzeczy są jasne od razu, niektóre zaś trzeba przedyskutować, poczynić pewne założenia. W naszym zadaniu podano nam następującą specyfikację:

Niektóre zależności nie zostały napisane, ale są one dość oczywiste. Np. nikt nie ma wątpliwości, że w jednym państwie jest wiele miast.

Napiszmy kolejno związki łączące nasze encje:

Encja 1

Encja 2

Opis związku

Typ związku

Panstwo

Miasto

W jednym państwie jest wiele miast (oczywiste).

związek jednoznaczny (jedno państwo - wiele miast, jedno miasto - jedno państwo)

Każde miasto znajduje się w jednym państwie (podane w zadaniu).

Panstwo

Język

Każde państwo może mieć jeden lub wiele języków urzędowych (podane w zadaniu).

związek wieloznaczny (jedno państwo - wiele języków, jeden język - wiele państw)

Każdy język może być językiem urzędowym dla jednego lub wielu państw (podane w zadaniu).

Panstwo

Morze

Państwo może graniczyć z jednym, z kilkoma lub z żadnym z mórz (podane w zadaniu).

związek wieloznaczny (jedno państwo - wiele mórz, jedno morze - wiele państw)

Każde morze oblewa jedno lub kilka państw (podane w zadaniu).

Panstwo

Kontynent

Jedno państwo leży na jednym lub wielu kontynentach (podane w zadaniu).

związek wieloznaczny (jedno państwo - wiele kontynentów, jeden kontynent - wiele państw)

Na jednym kontynencie leży wiele państw (oczywiste).

Teraz zastanawiamy się, analizując podany opis problemu, czy to już wszystkie zależności. Jeśli tak, to przechodzimy do łączenia encji na diagramie. Wiemy, że w przypadku związku jednoznacznego prowadzimy relację między encjami będącymi stronami związku. Jak opisano wcześniej, w Visio po stronie jeden jest strzałka. W przypadku związku wieloznacznego tworzymy tabelę pośrednią (asocjacyjną). Mimo, że niektóre narzędzia (np. Oracle Designer) same tworzą tabelę pośrednią, więc na etapie projektowania można po prostu wprowadzić relację wiele do wiele, należy pamiętać, że związków wieloznacznych nie można bezpośrednio reprezentować w relacyjnej bazie danych. Jedynie dysponując narzędziem, które na etapie generowania tabel tworzy tabelę pośrednią, możemy pozwolić sobie na diagramie na relację wiele do wiele. Możemy zapytać, który sposób stosować, jeśli już w ogóle mamy możliwość wyboru? Otóż, jeśli wystarczy nam, aby w wygenerowanej później tabeli pośredniej, znalazły się jedynie klucze tabel, które ona łączy, to możemy wykorzystać relację wiele do wiele. W naszym przykładzie taka sytuacja miałaby miejsce w przypadku relacji łączącej encje Panstwo i Kontynent oraz Panstwo i Jezyk. Jeśli natomiast chcemy, aby nasza encja pośrednia miała poza kluczami obcymi jakieś dodatkowe atrybuty, wówczas sami tworzymy encję asocjacyjną. W rozpatrywanym przykładzie encja łącząca Panstwo i Morze ma atrybut Długosc_Granicy (wymieniony w treści zadania), mówiący o długości granicy danego państwa z danym morzem, więc, niezależnie od używanego narzędzia, powinna zostać stworzona ręcznie. MS Visio nie potrafi samodzielnie generować tabel pośrednich, w związku z powyższym zawsze musimy narysować encję asocjacyjną, niezależnie od występowania w niej dodatkowych atrybutów. O tej 0x08 graphic
drugiej możliwości wspominam z uwagi na to, że w załączniku znajdują się te same diagramy w notacji Oracle Designera. Pełny diagram wygląda tak:

Jak widzimy, w tabelach pojawiły się klucze obce z adnotacją FK. Warto wspomnieć, że Oracle Designer nie wpisuje kluczy obcych podczas tworzenia relacji (patrz załącznik). Natomiast umieszcza je w tabelach podczas ich generowania.

2. Hotel

W hotelu jest potrzebna baza danych. Mają się w niej znaleźć informacje o gościach, pokojach podzielonych na kategorie (zaproponuj je), rezerwacjach zamówionych - na kategorię i rezerwacjach przydzielonych - na konkretny pokój. Zaproponuj schemat bazy w trzeciej postaci normalnej, dodatkowo wiedząc, że:

Tak jak powiedzieliśmy wcześniej, musimy najpierw zidentyfikować encje, które będą nam potrzebne. W zadaniu czytamy, że mamy gromadzić informacje o gościach, pokojach podzielonych na kategorie, rezerwacjach zamówionych - na kategorię i rezerwacjach przydzielonych - na konkretny pokój. A więc potrzebne nam będą encje: Gosc, Pokoj, Kategoria, Rezerwacja_Zamowiona i Rezerwacja_Przydzielona. Teraz kolej na określenie, jakie informacje chcemy zbierać, czyli na ustalenie atrybutów. Pamiętamy, że nie wpisujemy atrybutów reprezentujących związki (kluczy obcych). Ostatecznie w tej fazie projektowania otrzymujemy diagram:

0x08 graphic

Zauważmy, że w encji Pokoj nie ma atrybutu Kategoria. Wynika to właśnie stąd, że Kategoria jest atrybutem związku łączącego encję Pokoj z encją Kategoria.

Teraz przystąpimy do etapu identyfikowania związków między encjami. Tym razem też mamy dość dokładną specyfikację, choć może już nie tak klarowną jak w poprzednim przykładzie: