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.

Przyjrzyjmy się dokładnie powyższemu rysunkowi i przeanalizujmy związki, które zachodzę pomiędzy poszczególnymi obiektami.
Jak widać na 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 (to efekt wcześniejszego założenia)
i że mogą być zamówienia takie, że klient jest nieznany, a sytuacja taka ma miejsce wtedy, gdy
anonimowa osoba kupuje towar i płaci gotówką, a fakt ten jest rejestrowany tylko w urządzeniu
fiskalnym - drukarce lub kasie (więcej o tych urządzeniach tutaj i tutaj).
Podobne zależności występują pomiędzy pracownikami, a zamówieniami: dany pracownik może obsługiwać wiele zamówień (gdy jest on kasjerem lub sprzedawcą np. "Stanisław Kowalski", ale nie musi - gdy jest on załóżmy dyrektorem np. "Jan Nowak") oraz dane zamówienie MUSI być obsłużone przez jednego pracownika (też efekt założenia, że pracownik jest jeden, jednak musi ktoś w imieniu firmy zamówienie przyjąć).
Ciekawe zależności występują pomiędzy bombonierkami, 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.: bombonierka "Czekoladowe party"), 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: bombonierka "Czekoladowy słoń").
Podobne do powyższych zależności występują pomiędzy bombonierkami, a czekoladkami - KAŻDA bombonierka zawiera w sobie przynajmniej jeden typ czekoladki, a każda z czekoladek danego typu może być zapakowana do różnych typów bombonierek. Sytuacja dotyczaca czekoladki "Czekoladka mleczna" może sygnalizować stan polegający na tym, że znamy już co będzie składnikiem nowego typu bombonierki, który jest dopiero w produkcji.
Ostatnimi interesującymi zależnościami są te zachodzące pomiędzy zamówieniem, a fakturą. Jak widać z diagramu Venna do zamówienia możemy wystawić maksymalnie dwie faktury, ale każda faktura musi dotyczyć jednego zamówienia (nie wykonujemy faktur zbiorczych - uproszczenie projektu). Faktury VAT i korygujące mogą mieć wspólną numerację (to zastosujemy), ale mogą być oddzielnie numerowane.
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:

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

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.
FAKTURA VAT NR 347
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
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).

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