Często pomijanym aspektem podczas zajęć z baz danych jest projektowanie. Studenci cenią sobie wiedzę praktyczną i starają się zapoznać z aplikacjami służącymi do wykonywania baz danych lub całych systemów informatycznych, ale nie są zainteresowani teorią, której znajomość jest niezbędna do wykonania nowej bazy danych (stąd później liczne próby przechowania danych niemal tak jak w Excelu). Żeby uzupełnić nieco tę lukę, przedstawię tu w dużym uproszczeniu jeden ze sposobów wykonania nowej bazy danych: diagram związków encji.
Jak już wiadomo (z wykładów z poprzedniego semestru) baza danych jest modelem pewnego fragmentu otaczającego nas świata. rzeczywistego (najczęściej rzeczywistego, gdyż możemy opisywać światy wirtualne, a nawet urojone - o ile odbiorca systemu jest skłonny zapłacić za taką pracę). Ów fragment nazywany jest obszarem analizy i podczas tych zajęć interesuje nas uproszczony model sprzedaży artykułów spożywczych. Można ów model przekształcić na diagram związków encji i na jego podstawie przeanalizować, czy baza danych będzie poprawnie odzwierciedlać zdarzenia zachodzące w świecie rzeczywistym (i to zanim baza zostanie wykonana, co zmniejsza koszty produkcji oprogramowania).
Zanim powstanie diagram, należy poznać obszar analizy. W tym celu przeprowadza się wywiady z odbiorcami bazy danych, z ekspertami, analizuje się przepisy prawne itp. Mając na uwadze ograniczenia czasowe w prowadzeniu zajęć ograniczmy się tylko do krótkiego opisu:
"Klient może kupić wiele towarów. Może też zamówić sobie dostawę do domu, ale wtedy musi podać swój dokładny adres oraz imię i nazwisko i najlepiej numer telefonu. W takim wypadku płaci przy odbiorze towaru, a gdy kupuje w sklepie - płaci przy wyjściu. Każdy klient jest obsłużony przez jakiegoś pracownika - kasjera lub dostawcę."
Spróbujmy wyodrębnić z tego krótkiego opisu (zaznaczone podkreśleniem) istotne obiekty funkcjonujące w świecie rzeczywistym. W tym celu osoby początkujące mogą posłużyć się diagramem Venna (zaawansowani potrafią z tego opisu stworzyć diagram związków encji). Diagram Venna to rysunek obiektów świata rzeczywistego. Nie musi to byś wierny rysunek - wystarczą jakieś symbole.
Zauważmy, że w podanym opisie pojawiają się (przynajmniej) następujące obiekty: klienci, pracownicy, zamówienia (gdzie mozna zapisać także zakupy) i towary. Można wyróżnić w tym modelu więcej obiektów, ale utrudniłoby to jego zarówno przedstawienie jak i zrozumienie. Obiekty odrysowujemy na diagramie Venna i obiekty tej samej klasy grupujemy w zbiory (tu 4 zbiory: klientów, pracowników, zamówień i towarów). Pomiędzy poszczególnymi obiektami rysujemy linie, które symbolizują zależności tych obiektów zachodzące w świecie rzeczywistym.
Poprawne odrysowanie diagramu Venna jest bardzo istotne dla dalszego etapu projektowania - wykonania diagramu związków encji, ponieważ wpływa na związki encji. Przyjrzyjmy się dokładnie powyższemu rysunkowi. Jak widać po przykładzie klienta "Robert Miakowski": jeden klient może złożyć wiele zamówień (oczywiście może też złożyć jedno zamówienie). Czy poprawną sytuacją w świecie rzeczywistym jest znajomość klienta, który nie składał żadnego zamówienia? Z pozoru wydaje się, że to błędna sytuacja: kto podawałby swoje dane osobowe, a nic nie zamawiał (na diagramie taką osobą jest "Mariusz Białek")? Jednak okazuje się, że taka sytuacja może mieć miejsce, gdy firma zakupi dane osobowe potencjalnych klientów (np.: osób mieszkających w okolicy). Analizujmy dalej związki między klientami, a zamówieniami, ale tym razem od strony zamówień. Okazuje się, że dane zamówienie jest składane przez najwyżej jednego klienta i że mogą być zamówienia takie, że klient jest nieznany. Podobne zależności występują pomiędzy pracownikami, a zamówieniami: dany pracownik może obsługiwać wiele zamówień, ale dane zamówienie MUSI być obsłużone przez jednego pracownika. Ciekawe zależności występują pomiędzy towarami, a zamówieniami. Okazuje się, że KAŻDE zamówienie dotyczy przynajmniej jednego towaru, ale może też dotyczyć wielu towarów (np.: "zamówienie 301"), a z kolei towar może być zamawiany wielokrotnie w różnych zamówieniach (np.: "pizza"), ale też może istnieć towar, który nie był nigdy zamawiany (np.: dopiero się pojawił w sprzedaży lub jest zbyt drogi, aby był kupiony - tu: "truskawki w cieście" i "papryka zielona").
Jeżeli dobrze zastanowiliśmy się nad zależnościami w diagramie Venna, to możemy przekształcić go na diagram związków encji. Podczas tej konwersji zbiory obiektów przekształcamy na encje, a zależności pomiędzy obiektami na związki encji:
Przyjmuje się, że nazwa encji jest rzeczownikiem w licznie pojedynczej (nie jest to jednak obowiązkowe), a tabeli w liczbie mnogiej. Z tego powodu na powyższym diagramie w prostokątach symbolizujących encje pojawiły się nazwy: "klient", "pracownik", "zamówienie", "towar". Zauważmy też, że pomiędzy encjami pojawiły się specjalnie oznakowane kreski, które symbolizują związki encji. Sposobów na ich oznakowanie jest kilka i niewiele się od siebie różnią. Tu użyte jest oznakowanie wg notacji Martin-McClure'a, czyli: "okrąg" oznacza słowo "może", "kreska" - musi, a "wronie pazury" na zakończeniu symbolu - "do wielu". Czytając te związki widzimy, że:
Nie istnieje taki RDBMS, który obsługuje związki wiele do wielu, a taki właśnie związek zachodzi pomiędzy towarem, a zamówieniem. Związki te muszą zostać usunięte z diagramu w wyniku zastąpienia ich dwoma związkami jeden do wielu i encją przejściową (tzn. istnieją odpowiednie narzędzia do projektowania, które zrobią to automatycznie, ale nadają one niezrozumiałe nazwy tworzonym encjom przejściowym i potrafią też robić błędy).
W tym wypadku zostanie dodana encja "szczegół zamówienia". I dwa związki jeden do wielu, które należy czytać:
Po wykonaniu diagramu (już bez związków wiele do wielu) określamy jeszcze jakie atrybuty powinna posiadać każda z encji (czyli określamy cechy obiektów ze świata rzeczywistego). Dodatkowo określmy, czy podanie wartości do danego atrybutu jest wymagane (NOT NULL), czy nie (NULL). Ponadto ważną sprawą jest opisanie znaczenia zarówno encji jak i ich atrybutów. Te opisy to fragment tzw. metadanych (dane o danych), a bez nich wybieranie informacji z bazy jest mocno utrudnione (w wypadku dużych, złożonych systemów - niemożliwe, ponieważ nie wiemy jakie informacje wybieramy).
Encja: |
KLIENT |
|||
Opis: |
Klienci firmy i ich adresy. Oczywiście wszelka zbieżność nazwisk i adresów jest przypadkowa. To nie są dane osobowe, a przypadkowo skonstruowane w celu odbycia ćwiczeń. |
|||
Atrybut |
Wymagany |
Klucz |
Opis |
|
Identyfikator klienta |
NOT NULL |
PRIMARY KEY |
Identyfikator klienta. Klucz podstawowy. |
|
Nazwisko |
NOT NULL |
Nazwisko klienta. |
||
Imię |
NOT NULL |
Imię klienta. |
||
Ulica i numer domu |
NOT NULL |
Adres klienta - oprócz ulicy i numeru domu jest tu pod awany także numer mieszkania (o ile jest potrzebny). W szczególnych przypadkach adresem jest skrzynka pocztowa. |
||
Miasto |
NOT NULL |
Nazwa miasta, w którym mieszka klient. |
||
Kod pocztowy |
NOT NULL |
Kod pocztowy do adresu klienta. Zastosowano tu znaczne uproszcz enie względem świata rzeczywistego - adres jest krajowy. |
||
Telefon kontaktowy |
NULL |
Numer telefonu, pod którym najłatwiej zastać klienta. Jest to uproszczenie względem świata rzeczywistego - telefonów może być wiele i nie jest to jedyny rodzaj kontaktu (są jeszcze m.in.: e-mail, fax). |
Encja: |
PRACOWNIK |
|||
Opis: |
Pracownicy, ich pensje i kto nimi zarządza (zostanie dodane później). Podobnie jak w wypadku klientów nie są to dane osobowe. Docelowo posiadać będzie rekurencyjny klucz obcy (ID_SZEFA jest w związku z ID_PRACOWNIKA) - tylko w celu prezentacji podczas ćwiczeń. |
|||
Atrybut |
Wymagany |
Klucz |
Opis |
|
Identyfikator pracownika |
NOT NULL |
PRIMARY KEY |
Identyfikator pracownika. Klucz podstawowy. |
|
Nazwisko |
NOT NULL |
Nazwisko pracownika. |
||
Imię |
NOT NULL |
Imię pracownika. |
||
Ulica i numer domu |
NOT NULL |
Adres pracownika - oprócz ulicy i numeru domu jest tu podawany także numer mieszkania (o ile jest potrzebny). W szczególnych przypadkach adresem jest skrzynka pocztowa. |
||
Miasto |
NOT NULL |
Nazwa miasta, w którym mieszka pracownik. |
||
Kod pocztowy |
NOT NULL |
Kod pocztowy do adresu pracownika. Zauważ uproszczenie względem świata rzeczywistego - adres jest krajowy. |
||
Telefon kontaktowy |
NULL |
Kod pocztowy do adresu pracownika. To jest uproszczenie względem świata rzeczywistego - adres jes t krajowy. |
||
Pensja |
NOT NULL |
Pensja pracownika. To jest uproszczenie względem świata rzeczywistego - brak szczegółowej informacji o dochodach. |
||
Identyfikator szefa |
NULL |
FOREIGN KEY |
Obecnie nie będzie dodawany. Znaczenie wyjaśnione będzie podczas zajęć. Użycie tego atrybutu nie wynika z diagramu związków encji. |
Encja: |
ZAMÓWIENIE |
|||
Opis: |
Informacja o złożeniu zamówienia. |
|||
Atrybut |
Wymagany |
Klucz |
Opis |
|
Identyfikator zamówienia |
NOT NULL |
PRIMARY KEY |
Identyfikator zamówienia. Klucz podstawowy. |
|
Identyfikator klienta |
NULL |
FOREIGN KEY |
Kto składał zamówienie. Klucz obcy w związku z identyfikatorem klienta encji klient. Jeżeli jest NULL, to oznacza, że nie znamy klienta, który robił zakupy. |
|
Identyfikator pracownika |
NOT NULL |
FOREIGN KEY |
Kto przyjmował zamówienie. Klucz obcy w związku z identyfikatorem pracownika encji PRACOWNIK. |
|
Data zamówienia |
NOT NULL |
Data złożenia zamówienia. Domyślnie dzisiaj. |
||
Data opłacenia |
NULL |
Data opłacenia zamówienia (większa lub równa niż data złożenia). Nie każdy płaci gotówką. Znane są inne formy płatności: przelew bankowy lub przekaz pocztowy. Jeżeli data opłacenia jest NULL, to identyfikator klienta musi być podany. |
Encja: |
TOWAR |
|||
Opis: |
Towary sprzedawane przez firmę. Tu jest informacja o cenie towaru - znaczne uproszczenie względem rzeczywistego świata. |
|||
Atrybut |
Wymagany |
Klucz |
Opis |
|
Kod kreskowy |
NOT NULL |
PRIMARY KEY |
Identyfikator towaru. Klucz podstawowy. Jest to tzw. UPC (Universal Product Code) - każdy produkt posiada swój unikalny kod kreskowy. |
|
Nazwa |
NOT NULL |
Nazwa towaru. |
||
Cena brutto |
NOT NULL |
Cena towaru. |
Encja: |
SZCZEGÓŁ ZAMÓWIENIA |
|||
Opis: |
Poszczególne pozycje zamówień - jaki (i ile) towar został zakupiony. |
|||
Atrybut |
Wymagany |
Klucz |
Opis |
|
Identyfikator zamówienia |
NOT NULL |
PRIMARY KEY, FOREIGN KEY |
Wraz z atrybutem Kod kreskowy tworzy klucz podstawowy. Jest też kluczem obcym w związku z identyfikatorem zamówienia encji ZAMÓWIENIE. |
|
Kod kreskowy |
NOT NULL |
PRIMARY KEY, FOREIGN KEY |
Wraz z atrybutem Identyfikator zamówienia tworzy klucz podstawowy. Jest też kluczem obcym w związku z atrybutem kod kreskowy encji TOWAR. |
|
Ilość |
NOT NULL |
Ile sprzedano towaru (sztuk lub kilogramów). Tu nie będziemy przechowywali ułamków (gramy, dekagramy) w ramach uproszczenia. |
Tak określone encje i ich atrybuty to odpowiedniki tabel i ich kolumn. Związki encji, to odpowiedniki kluczy obcych. Przed przekształceniem diagramu związków encji w układ tabel wybieramy SZBD, w którym będzie wykonana nowa baza danych i określamy typ danych dla każdej kolumny. Służą do tego celu specjalne aplikacje (zaliczające się do narzędzi CASE), gdyż każdy z SZBD obsługuje nieco inne typy danych. Jeżeli chodzi o metadane, to tylko niektóre z SZBD posiadają możliwość zapamiętania dodatkowych opisów tabel i kolumn (np.: poleceniem COMMENT ON w przypadku Oracle, czy właściwością Opis tabeli lub Opis pola w przypadku Accessa).