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 - jeszcze ze stawką podatku VAT 22% (przecież 23% wprowadzono tymczasowo 01.01.2011)

      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 poniższych encjach zaznaczyłem klucze, które warto wykonać podczas konstrukcji tabel (podstawowe, obce, alternatywne). Nie są to elementy obowiązkowe przy projektowaniu encji. Projektując encję powinniśmy raczej skupić się na ustaleniu identyfikatora instancji encji, jednak ten termin na tyle jest mało popularny, że zdecydowałem się opisać klucze. Więcej o kluczach można dowiedzieć się ze składni instrukcji CREATE TABLE i używanych tam ograniczeń.

Opis również nie jest elementem obowiązkowym. Warto jednak przestudiować dla języków t-SQL, czy PL/SQL takie polecenia jak add_extendedproperty, czy COMMENT, gdyż dodatkowy opis zapisany przy strukturze tabeli jest niestety bardzo często jedyną dokumentacją.

Ważną cechą każdego z atrybutów będzie jego dziedzina (z ang. domain - niekiedy tłumaczona jako domena, ale to może być mylone instukcją CREATE DOMAIN, więc będę używać terminu: dziedzina), czyli zbiór dozwolonych wartości, jakie dany artybut może przyjąć.

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

Dziedzina

Wymagany

Klucz w tabeli

Opis

Identyfikator klienta Liczba całkowita NOT NULL PRIMARY KEY Identyfikator klienta - pole dodane sztucznie wobec braku kluczy naturalnych. Może być w tabeli kontrolowane sekwencją (lub podobnym licznikiem: INT IDENTITY, AUTOINCREMENT, SERIAL). Oczywiście zanim bezrefleksyjnie użyjesz sekwencji sprawdź, czy budowana aplikacja będzie podatna na atak typu IDOR (z ang. Insecure Direct Object Reference). Klucz podstawowy w TABELI - identyfikator instancji encji w ENCJI.
Nazwisko Tekst do 70-u znaków NOT NULL   Nazwisko klienta.
Imię Tekst do 30-u znaków NOT NULL   Imię klienta.
Nazwa firmy Tekst do 255-u znaków 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 Tekst do 100-u znaków (lub XML lub JSON) NOT NULL   Adres klienta (biznesowo niepodzielny! pomimo, że może składać się z kilku elementów takich jak: przedrostek nazwy ulicy, nazwa ulicy, numer domu i ewentualnie numer lokalu). W szczególnych przypadkach adresem może być skrytka pocztowa.
Miejscowość Tekst do 70-u znaków NOT NULL   Nazwa miejscowości, w której mieszka klient.
Kod pocztowy Tekst w formacie xx-xxx NOT NULL   Kod pocztowy do adresu klienta. Zastosowano tu znaczne uproszczenie względem świata rzeczywistego - adres jest krajowy.
Telefon kontaktowy Tekst do 50-u znaków 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 Tekst w formacie xx-xxx-xx-xxx lub xxx-xx-xxx-xx NULL   Numer Identyfikacji Podatkowej. Przyjmiemy, że musi być podany jeżeli klientem jest podmiot gospodarczy. Jeżeli klientem jest osoba fizyczna, która nie prowadzi działalności gospodarczej, 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 zatrudnieni 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. wynagrodzenie).

Atrybut

Dziedzina

Wymagany

Klucz w tabeli

Opis

Identyfikator pracownika Liczba całkowita NOT NULL PRIMARY KEY Identyfikator pracownika - pole dodane sztucznie ze względów bezpieczeństwa. Klucz podstawowy w TABELI - identyfikator instancji encji w ENCJI.
Nazwisko Tekst do 70-u znaków NOT NULL   Nazwisko pracownika.
Imię Tekst do 30-u znaków NOT NULL   Imię pracownika.
Wewnętrzny Tekst do 30-u znaków NULL   Numer telefonu wewnętrznego firmy do pracownika.
Nazwa działu Tekst do 50-u znaków 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 Data po 31.05.1945 NOT NULL  

Data zatrudnienia pracownika.

Data zakończenia pracy Data po 31.05.1945 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ść nieoznaczona NULL, gdy umowa o pracę podpisana jest na czas nieokreślony.
Czy administrator Flaga bitowa (Tak/Nie)

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ą obsługiwane m.in. przez ROLE.
Login Tekst do 30-u znaków NOT NULL UNIQUE Login użytkownika potrzebny do zidentyfikowania użytkownika systemu w momencie logowania się do systemu i przyznawania uprawnień. Przyjmiemy, że jest to wartość unikalna (zobacz czym jest klucz alternatywny), 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 Tekst do 30-u znaków 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

Dziedzina

Wymagany

Klucz w tabeli

Opis

Identyfikator czekoladki Tekst w formacie: litera i dwie cyfry NOT NULL PRIMARY KEY Identyfikator czekoladki traktowany jako 3-znakowy indeks materiałowy (lub kod magazynowy). Klucz podstawowy.
Nazwa czekoladki Tekst do 50-u znaków NOT NULL UNIQUE Nazwa czekoladki (zazwyczaj wyróżniając w myślach jakiś obiekt określamy jego nazwę). Można na tej kolumnie w tabeli założyć unikalny indeks / ograniczenie unikalność / klucz alternatywny / klucz biznesowy.
Typ czekolady Tekst do 30-u znaków. Typ wyliczeniowy. NOT NULL   Jakim typem czekolady oblana jest czekoladka. Przyjmiemy, że będzie to jedna z wartości (wyliczeniowych): biała, mleczna, karmel, ciemna, słodko-gorzka, kremowo-kakaowa. Przyjmujemy też, że zbiór ten nie będzie rozszerzany (o np. czekoladę z Dubaju, fit-czekoladę, eko-czekoladę, euro-czekoladę, tylko polską czekoladę...).
Typ orzechów Tekst do 30-u znaków. Typ wyliczeniowy. 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 Tekst do 30-u znaków. Typ wyliczeniowy. 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 Tekst do 2000 znaków. NULL   Pełen opis czekoladki. Nazwa nie zawsze wystarczy do opisania obiektu.
Koszt czekoladki Liczba dodatnia zmienno- lub stałoprzecinkowa (wymagana jest precyzja przynajmniej czterech miejsc dziesiętnych / "po przecinku"). NOT NULL   Koszt netto produkcji jednej czekoladki (ponieważ mogą być to ułamki groszy, tę wielkość należy zapamiętać z podwyższoną precyzją. Technicznie może to być zrealizowane przez FLOAT lub NUMBER/NUMERIC.

Rysunek

Link do pliku lub dane binarne (takie jak BLOB/VARBINARY(MAX)/OLE Object). NULL   Rysunek lub zdjęcie czekoladki. Opis nie zawsze wystarczy do przedstawienia pełnej informacji o obiekcie.

 

Encja:

BOMBONIERKA

Opis:

Przyjmujemy dla uproszczenia, że sprzedawany towar "wypuszczany" jest na rynek krótką serią o stałej cenie - jest to więc bardziej opis typu towaru niż konkretnego egzemplarza. Również ignorujemy encję: magazyn - po prostu cukiernik może doprodukować porzebny towar. Gdyby miał być produkowany długo, to należałoby wprowadzić jeszcze encję cennik, gdzie mielibyśmy dodatkowe atrybuty takie jak: cena jednostkowa brutto, okres obowiązywania ceny od, okres obowiązywania ceny do, identyikator towaru, rabat,... Gdyby jeszcze uwzględnić, że klient może podać kupon/kod rabatowy, to należałoby wprowadzić kolejną encję: rabat do cennika.

Atrybut

Dziedzina

Wymagany

Klucz w tabeli

Opis

Identyfikator bombonierki Tekst w formacie: cztery litery NOT NULL PRIMARY KEY Identyfikator towaru podany jako 4-znakowy sktót. Klucz podstawowy. W rzeczywistym modelu to kod kreskowy (w przemyśle spożywczym EAN-13).
Nazwa bombonierki Tekst do 50-u znaków. NOT NULL UNIQUE Unikalna nazwa bombonierki.
Cena brutto Liczba dodatnia zmienno- lub stałoprzecinkowa (wymagana jest precyzja przynajmniej dwóch miejsc dziesiętnych / "po przecinku"). NOT NULL   Cena bombonierki (jest to cena jednostkowa (za jednostkę miary - tu sztuka)) brutto; przyjmujemy, że obowiązuje na ten towar bazowa stawka VAT - 22% (lub tylko tymczasowo przyjęta 23%)).
Opis bombonierki Tekst do 2000 znaków. 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

Dziedzina

Wymagany

Klucz w tabeli

Opis

Identyfikator bombonierki Tekst w formacie: cztery litery NOT NULL PRIMARY KEY, FOREIGN KEY Wraz z atrybutem Identyfikator czekoladki tworzy w tabeli dwupolowy klucz podstawowy. Jest też w tabeli kluczem obcym w związku z identyfikatorem bombonierki tabeli BOMBONIERKA.
Identyfikator czekoladki Tekst w formacie: litera i dwie cyfry NOT NULL PRIMARY KEY, FOREIGN KEY Wraz z atrybutem Identyfikator bombonierki tworzy w tabeli dwupolowy klucz podstawowy. Jest też kluczem obcym w związku z identyfikatorem czekoladki tabeli CZEKOLADKA.

Ilość

Liczba całkowita dodatnia

NOT NULL

 

Ile sztuk (to ważne uproszczenie względem ogólnego pojęcia "jednostki miary") czekoladek danego typu zapakowanych jest do danego typu bomboniekrki.

 

Encja:

ZAMÓWIENIE

Opis:

Informacja o złożeniu zamówienia lub wykonaniu stacjonarnych zakupów.

Atrybut

Dziedzina

Wymagany

Klucz w tabeli

Opis

Identyfikator zamówienia Liczba całkowita dodatnia NOT NULL PRIMARY KEY

Identyfikator zamówienia. Klucz podstawowy. Wskazanym jest żeby to był kolejny numer zamówienia (czyli można pomyśleć o rozwiązaniach takich jak SEQUENCE, INT IDENTITY, AUTOINCREMENT, SERIAL), chyba że istnieje zagrożenie atakiem IDOR.

Identyfikator klienta Liczba całkowita NULL FOREIGN KEY Kto składał zamówienie. Klucz obcy w związku z identyfikatorem klienta z tabeli KLIENT. Jeżeli jest NULL, to oznacza, że nie znamy klienta, który robił jedynie zakupy (wystawiliśmy paragon, a klient musiał zapłacić gotówką) - nie jest możliwe złożenie "rozciągniętego w czasie" zamówienia, gdyż nie wiadomo komu je przygotować.
Identyfikator pracownika Liczba całkowita NOT NULL FOREIGN KEY Kto obsługiwał stacjonarne zakupy klienta lub kto przyjmował zamówienie (kto pakował, wydawał, odbierał pieniądze, transportował pod wskazany adres - pomijamy). Klucz obcy w związku z identyfikatorem pracownika w tabeli PRACOWNIK. NOT NULL oznacza, że nie dopuszczamy jeszcze samoobsługi klienta np. w sklepie internetowym.
Data zamówienia Data NOT NULL   Data złożenia zamówienia (można podnieść dokładność zapisu i zanotować datę i czas złożenia zamówienia). Domyślnie dzisiaj (lub teraz). Można dodatkowo ograniczyć ją z dołu od np. 01-01-1995, ale nie jest to niezbędne.
Data realizacji Data NOT NULL   Data realizacji zamówienia (większa lub równa dacie zamówienia).
Termin płatności Data NOT NULL   Ustalona data zapłaty za zamówiony towar (w prowadzonym biznesie przyjęto, że większa lub równa dacie realizacji - najczęściej do 14 dni po dacie realizacji).
Opłacono Data NULL   Data faktycznego opłacenia zamówienia (większa lub równa niż data złożenia zamówienia). Może przyjąć wartość nieoznaczoną NULL - nie każdy płaci gotówką/BLIKiem/kartą w momencie składania zamówienia; dopuszczamy zdalne formy płatności takie jak: przelew bankowy lub przekaz pocztowy. Jeżeli data opłacenia jest NULL, to identyfikator klienta musi być podany (musimy wiedzieć, kto ma zapłacić później).

 

Encja:

SZCZEGÓŁ ZAMÓWIENIA

Opis:

Poszczególne pozycje zamówień - jaki (i ile) towar został zakupiony.

Atrybut

Dziedzina

Wymagany

Klucz w tabeli

Opis

Identyfikator zamówienia Liczba całkowita dodatnia NOT NULL PRIMARY KEY, FOREIGN KEY

Wraz z atrybutem Identyfikator bombonierki tworzy w tabeli dwupolowy klucz podstawowy. Jest też kluczem obcym w związku z identyfikatorem zamówienia tabeli ZAMÓWIENIE.

Identyfikator bombonierki Tekst w formacie: cztery litery NOT NULL PRIMARY KEY, FOREIGN KEY Wraz z atrybutem Identyfikator zamówienia tworzy w tabeli dwupolowy klucz podstawowy. Jest też kluczem obcym w związku z atrybutem Identyfikator bombonierki tabeli BOMBONIERKA.
Ilość Liczba całkowita dodatnia NOT NULL   Ile zamówiono sztuk danej bombonierki.

 

Encja:

FAKTURA

Opis:

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

Atrybut

Dziedzina

Wymagany

Klucz w tabeli

Opis

Numer faktury

Liczba całkowita dodatnia

NOT NULL

PRIMARY KEY

Numer kolejny faktury. Klucz podstawowy.

Identyfikator zamówienia

Liczba całkowita dodatnia

NOT NULL

FOREIGN KEY, UNIQUE

Klucz obcy w związku z identyfikatorem zamówienia encji ZAMÓWIENIE. Razem z flagą Czy korekta stanowią wartość unikalną - co daje efekt jednego zamówienia do maksymalnie dwóch (a nie wielu) korekt.

Czy korekta

Flaga bitowa

NOT NULL, UNIQUE

 

Tak - wystawiono fakturę korygującą "na zero". 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 "na zero").





      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".