Projektowanie systemu informatycznego -
- krótkie powtórzenie wiadomości

      Tematem często pomijanym podczas prowadzenia ćwiczeń 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 (z ang. ERD - entity relationship diagram).

      Diagram związków encji jest jednym ze sposobów przedstawienia modelu logicznego bazy danych. Jest to rysunek encji i związków pomiędzy nimi, który ułatwia analizę wybranego obszaru świata rzeczywistego modelowanego najczęściej (można modelować także inne światy np.: wirtualne o ile przyszły użytkownik bazy zapłaci za pracę rzeczywistymi pieniędzmi) w bazie danych. Wykonywanie diagramów związków encji umożliwiają aplikacje będące narzędziami CASE, do których zaliczyć można m.in. ER/1 firmy Embarcadero Technologies (wersji trial ER/1 rozpowszechniana jest na płycie CD załączonej do książki "SQL. Księga eksperta"). Oprócz ER/1 istnieją również inne aplikacje umożliwiające wykonywanie diagramów związków encji (np.: System Engineer firmy Learmonth & Burchett Management Systems Inc. lub Power Designer firmy PowerSoft) i wiele innych. W zależności od użytej aplikacji diagram związków encji może być inaczej przedstawiony i w odmienny sposób konstruowany. Tu postaram się przybliżyć tylko ogólną ideę wykonania takiego diagramu.


      Jak już wiadomo (z poprzedniego semestru) baza danych jest najczęściej modelem pewnego fragmentu otaczającego nas świata rzeczywistego. Ów fragment nazywany jest obszarem analizy i podczas tych zajęć interesuje nas uproszczony model składania zamówień przy sprzedaży bombonierek. 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).
 

Prowadzący zajęcia zdają sobie sprawę, że ten model jest najczęściej omawiany w książkach o bazach danych, ale też najczęściej modelujemy działalność firmy, która prowadzi sprzedaż towarów lub usług. Z tego więc powodu omówimy sobie podczas zajęć model przyjmowania w firmie zamówień na towar (lub usługę).

      Zanim powstanie diagram, należy poznać obszar analizy. W tym celu przeprowadza się wywiady z odbiorcami bazy danych, z ekspertami, analizuje się przepisy prawne, przegląda zasoby Sieci (np.: Firma Cukiernicza "Solidarność"), analizuje dokumenty firmy itp. Zainteresowanych tą tematyką odsyłam do książki "Tworzenie hurtowni danych". Mając na uwadze ograniczenia czasowe w prowadzeniu zajęć opierać się będziemy tylko na krótkim opisie:

"Klient może kupić (lub zamówić do późniejszego odbioru) wiele, różnych bombonierek. Klient może dostać fakturę VAT jako dokument płatniczy do zamówienia lub transakcja kupna-sprzedaży może zostać zafiskalizowana (wtedy, gdy klient przy zakupie płaci gotówką). Klientem może być firma (podmiot gospodarczy) lub osoba fizyczna. Jeżeli zamówienie zostanie źle przyjęte, a wystawiono już do niego fakturę VAT, to wystawiamy do zamówienia kolejną fakturę: fakturę korygującą, a następnie przyjmujemy ponownie zamówienie. Przyjmujemy, że zamówienie dotyczy tylko jednego klienta (w rzeczywistości może to być: osoba zamawiająca, odbiorca i płatnik) i jest ono obsługiwane przez jednego pracownika. Niekiedy musimy informować klientów o zawartości bombonierek (o czekoladkach), jeżeli wymagają oni tych informacji."

      Spróbujmy wyodrębnić z tego krótkiego opisu 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ę (tu sztucznie wyróżnione) następujące obiekty: klienci, pracownicy, zamówienia, bombonierki, czekoladki, faktury. Można wyróżnić w tym modelu więcej obiektów, ale utrudniłoby to jego zarówno przedstawienie jak i zrozumienie (np.: nasza firma może być kilkoma podmiotami gospodarczymi). Zaobserwowane obiekty odrysowujemy na diagramie Venna i obiekty tej samej klasy grupujemy w zbiory (tu 6 zbiorów: klientów, pracowników, zamówień, bombonierek, czekoladek i faktur). Pomiędzy poszczególnymi obiektami rysujemy linie, które symbolizują zależności pomiędzy tymi obiektami zachodzące w świecie rzeczywistym.


Rys. 1. Diagram Venna


      W praktyce diagram Venna nie jest wykonywany, gdyż byłby niecztelny (zbyt wiele zależności pomiędzy obiektami utrudnia odczytanie diagramu) dla większej ilości obiektów przy złożonych modelach wykonywanych w zastosowaniach profesjonalnych. Ta technika została przedstawiona dla ułatwienia zrozumienia bardzo prostego projektu bazy danych.



      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:


Rys. 2. Diagram związków encji (przed usunięciem związków wiele do wielu)

      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 takie jak: "klient", "pracownik", "zamówienie" i inne. Zauważmy też, że pomiędzy encjami pojawiły się specjalnie oznakowane kreski, które symbolizują związki encji. Jak już wspominałem, sposobów na ich oznakowanie jest kilka. 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". Odczyt powyższego diagramu jest prostszy niż diagramu Venna. Czytając związki encji (czytamy w obie strony związku) widzimy, że:

      Tu jeszcze raz zaznaczę, że analizowany podczas zajęć projekt nie nadaje się do zastosowań profesjonalnych, a dzieje się tak m.in. dlatego, że nie uwzględniamy w nim konkretnych dostaw towaru. Przyjmujemy, że mamy zawsze pełne magazyny niepsujących się bombonierek i z tego powodu mówiąc bombonierka mamy na myśli raczej typ bombonierki, a nie konktetną bombonierkę z konktetnej dostawy. Z tego powodu przeczytałem związki encji mówiąc o typach bombonierek, czy typach czekoladek. W przyjętym modelu bombonierka ma zawsze taką samą cenę (pamiętaną dla bombonierki), a tymczasem powinien być do niej przypisany cennik, który obowiązuje w danym okresie czasu. Pomijamy ten problem w celu uproszczenia projektu.


      Nie istnieje taki RDBMS, który obsługuje związki wiele do wielu, a takie właśnie związki zachodzą pomiędzy bombonierką i zamówieniem oraz czekoladką i bombonierką. Związki te muszą zostać usunięte z diagramu w wyniku zastąpienia ich dwoma związkami jeden do wielu i encją przejściową (tu warto zaznaczyć, że istnieją wprawdzie 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 - z tego powodu warto wszystkie modyfikacje wykonać samodzielnie).


Rys. 3. Diagram związków encji

      W tym wypadku zostanią dodane encje przejściowe "szczegół zamówienia" (właściwie powinna się ona nazywać "pozycja zamówienia" mówimy przecież "pozycja pierwsza", a nie "szczegół pierwszy") oraz "zawartość bombonierki", a także odpowiednie związki jeden do wielu (wiele po stronie encji przejściowej!), 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).
      Przy projektowaniu ważne 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). Nie każdy SZRBD posiada możliwość zapamiętania dodatkowych opisów tabel i kolumn (np.: poleceniem COMMENT ON w przypadku Oracle lub opis pola, czy właściwości tabeli w MS Access) - z tego powodu opisy te są ważne.
      Zarówno przy wykonywaniu diagramu związków encji jak i przy określaniu atrybutów encji przydatna jest znajomość dokumentów, które używane są w firmie. Z tych dokumentów możemy się dowiedzieć jakie właściwości obiektów musimy znać, aby można było wykonywać takie dokumenty używając danych z bazy.


Wystawiono w systemie obsługi sprzedaży bombonierek Druk z dnia: 17.10.2000


FAKTURA VAT NR 347

Sprzedawca:
Hurtownia bombonierek “PolHurt” Sp. z o.o.
Newelska 6
01-447 Warszawa

NIP: 123-456-78-90

Nr rach. bankowego: 11223344-123456-123-12
Bank: PKO BP S.A.
  Nabywca:
“Hades” Sp. z o.o.
Boczna 16-18
98-942 Łódź

NIP: 111-111-11-11

Data sprzedaży: 17.10.2000


L.p. Nazwa towaru
lub usługi
Symbol
SWW/KU
Sztuk Cena jedn. netto Wartość netto VAT Kwota VAT Wartość brutto
1. Bombonierka "Czekoladowe party" 123-11 5 15,00 75,00 0 0,00 75,00
2. Bombonierka "Czekoladowy słoń" 134-11 2 50,00 100,00 7 7,00 107,00
3. Bombonierka "Czekoladowa polana"   1 60,00 60,00 22 13,20 73,20
Razem:  235,00   20,20 255,20

Do zapłaty złotych:
Słownie złotych:
255,20
dwieście pięćdziesiąt pięć zł 20 gr



Podpis osoby upoważnionej do odbioru dokumentu:

.................................................
Nowak Jan
Pieczęć i podpis sprzedawcy:

.................................................
Chmielowski Przemysław


Rys. 4. Uproszczony wzór faktury VAT

      Wiekszość atrybutów encji Klient możemy odczytać wprost z faktury VAT (na niebiesko zaznaczono wartości, które należy na fakturze uzupełnić - uwaga! przyjęto wiele uproszczeń). W przypadku pozostałych encji wystarczyć musi opis znaczenia atrybutu.

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ń. Klientem może być osoba fizyczna lub podmiot gospodarczy. Dane o kliencie są potrzebne do wystawienia faktury.

Atrybut

Wymagany

Klucz

Opis

Identyfikator klienta

NOT NULL

PRIMARY KEY

Identyfikator klienta. Klucz podstawowy.

Nazwisko

NOT NULL

 

Nazwisko klienta.

Imię

NOT NULL

 

Imię klienta.

Nazwa firmy

NULL

 

Jeżeli podamy nazwę firmy, to klienta traktujemy jak podmiot gospodarczy. Jeżeli nie podamy, to klientem jest osoba fizyczna.

Ulica i numer domu

NOT NULL

 

Adres klienta - 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 klient.

Kod pocztowy

NOT NULL

 

Kod pocztowy do adresu klienta. Zastosowano tu znaczne uproszczenie 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).

NIP

NULL

 

Numer Identyfikacji Podatkowej. Przyjmiemy, że musi być podany jeżeli klientem jest podmiot gospodarczy. Jeżeli klientem jest osoba fizyczna, to nie (podstawa prawna Rozporządzenie Ministra Finansów z dnia 22 grudnia 1999 Dz.U. 109/99 rozdział 13 paragraf 38 ustęp 1).

 

Encja:

PRACOWNIK

Opis:

Pracownicy zatrudnienie w firmie. Podobnie jak w wypadku klientów nie są to dane osobowe. Pamiętamy tu najistotniejsze dane dotyczące uprawnień pracownika i niezbędne w procesie sprzedaży - inne są pominięte (np. pensja).

Atrybut

Wymagany

Klucz

Opis

Identyfikator pracownika

NOT NULL

PRIMARY KEY

Identyfikator pracownika. Klucz podstawowy.

Nazwisko

NOT NULL

 

Nazwisko pracownika.

Imię

NOT NULL

 

Imię pracownika.

Wewnętrzny

NULL

 

Numer telefonu wewnętrznego firmy do pracownika.

Nazwa działu

NOT NULL

  Nazwa działu, w którym pracuje dana osoba. Jest to uproszczenie względem świata rzeczywistego - osoba może pracować w kilku działach.

Data zatrudnienia

NOT NULL

 

Data zatrudnienia pracownika.

Data zwolnienia

NULL

 

Data zakończenia pracy przez pracownika wynikająca z ograniczenia umowy o pracę na czas określony lub wynikająca z rozwiązania umowy o pracę. Może być to wartośc pusta, gdy umowa o pracę podpisana jest na czas nieokreślony.

Czy administrator

NOT NULL

 

Tak - pracownik może posługiwać się systemem informatycznym bez ograniczeń. Nie - może tylko przyjmować zamówienia i wystawiać do nich faktury. Jest to uproszczenie względem świata rzeczywistego - uprawnienia użytkowników systemu są pamiętane w oddzielnych tabelach i są bardzo złożone.

Login

NOT NULL

 

Login użytkownika potrzebny do zidentyfikowania użytkownika systemu w momencie logowania się do systemu i przyznawania uprawnień. Przyjmiemy, ze jest to wartość unikalna, a jednak nie będąca kluczem podstawowym (aby nie była ona przechowywana docelowo w tabeli Zamówienia, do której każdy użytkownik ma dostęp).

Hasło

NOT NULL

 

Hasło użytkownika potrzebne do zidentyfikowania użytkownika systemu w momencie logowania się do systemu i przyznawania uprawnień.

 

Encja:

CZEKOLADKA

Opis:

Uproszczona względem świata rzeczywistego informacja o czekoladce (m.in. brak informacji o terminie przydatności do spożycia, masie netto, kaloryczności itp.).

Atrybut

Wymagany

Klucz

Opis

Identyfikator czekoladki

NOT NULL

PRIMARY KEY

Identyfikator czekoladki trakotwany jako 3-znakowy uniwersalny kod produktu (w świecie rzeczywistym byłby to kod kreskowy, ale na zajęciach nie będziemy omawiać programowania czytników kodów kreskowych - więcej o czytnikach tutaj). Klucz podstawowy.

Nazwa czekoladki

NOT NULL

 

Nazwa czekoladki (zazwyczaj wyróżniejąc jakiś obiekt określamy jego nazwę).

Typ czekolady

NOT NULL

 

Jakim typem czekolady oblana jest czekoladka. Przyjmiemy, że będzie to jedna z wartości: biała, mleczna, karmel, ciemna, słodko-gorzka, kremowo-kakaowa. Przyjmujemy też, że zbiór ten nie będzie rozszerzany.

Typ orzechów

NOT NULL

 

Z jakimi orzechami jest polewa. Przyjmiemy, że będzie to jedna z wartości: bez orz., brazylijski, laskowy, mielone, różne, migdał, nerkowiec, pekan, pistacjowy, włoski. Przyjmujemy też, że zbiór ten nie będzie rozszerzany.

Typ nadzienia

NOT NULL

 

Typ nadzienia czekoladki. Przyjmiemy, że będzie to jedna z wartości: bez nadz., borówka amerykańska, kokos, likier migdałowy, malina, marcepan, marmolada, masło orzechowe, mokka kremowa, truskawka, wiśnia krem, wiśnia. Przyjmujemy też, że zbiór ten nie będzie rozszerzany.

Opis czekoladki

NULL

 

Pełen opis czekoladki. Nazwa nie zawsze wystarczy do opisania obiektu.

Koszt czekoladki

NOT NULL

 

Koszt produkcji jednej czekoladki (ponieważ mogą być to ułamki groszy, tę wielkość należy zapamiętać z podwyższoną precyzją (a nie tylko 2 miejsca po przecinku).

Rysunek

NULL

 

Rysunek lub zdjęcie czekoladki. Opis nie zawsze wystarczy do przedstawienia pełnej informacji o obiekcie.

 

Encja:

BOMBONIERKA

Opis:

Krótki opis bombonierki.

Atrybut

Wymagany

Klucz

Opis

Identyfikator bombonierki

NOT NULL

PRIMARY KEY

Identyfikator towaru podany jako 4-znakowy sktót. Klucz podstawowy. Może to być indeks materiałowy lub w przypadku bombonierki kod kreskowy.

Nazwa bombonierki

NOT NULL

 

Nazwa bombonierki.

Cena brutto

NOT NULL

 

Cena bombonierki (przyjmujemy, że obowiązuje na ten towar 22% stawka VAT).

Opis bombonierki

NULL

 

Opis bombonierki.

 

Encja:

ZAWARTOŚĆ BOMBONIERKI

Opis:

Dane o tym jaka czekoladka (Identyfikator czekoladki) jest zapakowana do jakiej bombonierki (Identyfikator bombonierki) i w jakiej ilości (Ilość). Przykład encji przejściowej.

Atrybut

Wymagany

Klucz

Opis

Identyfikator bombonierki

NOT NULL

PRIMARY KEY, FOREIGN KEY

Wraz z atrybutem Identyfikator czekoladki tworzy tu dwupolowy klucz podstawowy. Jest też kluczem obcym w związku z identyfikatorem bombonierki encji BOMBONIERKA.

Identyfikator czekoladki

NOT NULL

PRIMARY KEY, FOREIGN KEY

Wraz z atrybutem Identyfikator bombonierki tworzy tu dwupolowy klucz podstawowy. Jest też kluczem obcym w związku z identyfikatorem czekoladki encji CZEKOLADKA.

Ilość

NOT NULL

 

Ile sztuk (to ważne uproszczenie) czekoladek danego typu zapakowanych jest do danego typu bomboniekrki.

 

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. Jest to kolejny numer zamówienia.

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 (wystawiliśmy paragon, a klient musiał zapłacić gotówką).

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 realizacji

NOT NULL

 

Data realizacji zamówienia (większa lub równa dacie zamówienia).

Termin płatności

NOT NULL

 

Ustalona data zapłaty za zamówiony towar (zwyczajowo większa lub równa dacie realizacji - najczęściej do 14 dni po dacie realizacji).

Opłacono

NULL

 

Data opłacenia zamówienia (większa lub równa niż data złożenia zamówienia). 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:

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 Identyfikator bombonierki tworzy dwupolowy klucz podstawowy. Jest też kluczem obcym w związku z identyfikatorem zamówienia encji ZAMÓWIENIE.

Identyfikator bombonierki

NOT NULL

PRIMARY KEY, FOREIGN KEY

Wraz z atrybutem Identyfikator zamówienia tworzy dwupolowy klucz podstawowy. Jest też kluczem obcym w związku z atrybutem Identyfikator bombonierki encji BOMBONIERKA.

Ilość

NOT NULL

 

Ile zamówiono sztuk danej bombonierki.

 

Encja:

FAKTURA

Opis:

Zapamiętanie danych o wystawieniu faktury do zamówienia.

Atrybut

Wymagany

Klucz

Opis

Numer faktury

NOT NULL

PRIMARY KEY

Numer kolejny faktury. Klucz podstawowy.

Identyfikator zamówienia

NOT NULL

FOREIGN KEY

Klucz obcy w związku z identyfikatorem zamówienia encji ZAMÓWIENIE.

Czy korekta

NOT NULL

 

Tak - wystawiono fakturę korygującą. Nie - wystawiono fakturę VAT. Domyślnie przyjmuje wartość Nie. Razem z Identyfikatorem zamówienia stanowią wartości unikalne (para wartości nie powtatrza się, co umożliwia wystawienie maksymalnie 2-ch faktur do zamówienia: VAT i korygującej).





      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 (domenę atrybutu encji).


Rys. 5. Okno relacji z MS Access




      Zdaję sobie sprawę, że wykonując ten model przyjęto wiele istotnych uproszczeń względem świata rzeczywistego. Z tego powodu prezentowany model nie nadaje się do profesjonalnych zastosowań. Tu proszę o wyrozumiałość, ale pominięcie uproszczeń rozbuduje ten model do ogromnych rozmiarów, co uniemożliwi przedstawienie go podczas zajęć.

      Opracowując model oparto się na pomyśle z książki "Microsoft Access 7 dla Windows 95 - krok po kroku".