Przeczytaj
Składniki diagramu ER
Diagram związków encji (ang. entity‑relationship – ER) to graficzny sposób przedstawienia modeli danych używanych w projektach informatycznych. Jego podstawowymi składnikami są:
encjeencje – rzeczywiste lub wyobrażone obiekty oznaczane prostokątami, w bazie danych są to tabele,
atrybuty – cechy (właściwości) encji reprezentowane przez elipsy, w bazie danych to kolumny poszczególnych tabel,
złączenia – związki między encjami, oznaczane rombami lub liniami ciągłymi lub przerywanymi, w bazie danych są to relacje.
Istnieją różne konwencje tworzenia diagramów ER. Przykładowe kształty i symbole graficzne możemy zobaczyć na zrzucie.
Przeanalizuj poniższy zrzut prezentujący przykładowe kształty i symbole graficzne stosowane w różnych konwencjach tworzenia diagramów ER. Zastanów się, co mogą oznaczać litery M i N.

Dalej w materiale wykorzystujemy notację Information Engineering Style.
Modelowanie bazy
Analizę diagramu ER dla potrzeb naszej restauracji zacząć możemy od dwóch encji, tzn. klientów i zamówień.

Na zrzucie widzimy, że encja Klienci
może być opisana przez trzy atrybuty: Imię
, Nazwisko
i Identyfikator
. Z kolei właściwościami encji Zamówienia
mogą być Data realizacji
oraz Identyfikator
. Związek Zamawia
łączący obydwie encje to opcjonalne złączenie typu jeden‑do‑wielu, co oznacza, że jeden klient może złożyć wiele zamówień.
Biorąc pod uwagę ustalone wcześniej wymagania naszej restauracji, do diagramu dodamy kolejne encje z atrybutami, aby zilustrować możliwość dokonywania rezerwacji przez klientów:
Stoliki
, atrybuty:Numer
iLiczba miejsc
,Rezerwacje
, atrybuty:Identyfikator
iTermin
,Rabaty
, atrybuty:Identyfikator
,Data przyznania
,Data zakończenia
.
Przeanalizuj poniższą grafikę i odpowiedz na pytanie: Jakie związki łączą dodane encje (Stoliki
, Rezerwacje
i Rabaty
)?

Teraz zajmiemy się daniami oraz zamówieniami. Do diagramu dodamy następujące encje:
Półprodukty
, atrybuty:Identyfikator
,Nazwa
,Liczba
iLiczba kilogramów
,Dania
, atrybuty:Identyfikator
,Nazwa
,Cena
,Czy w menu
,Zamówienia
, atrybuty:Identyfikator
,Data realizacji
,Rabat
.
Związek pomiędzy daniami i półproduktami polega na tym, że danie może składać się z wielu półproduktów, ale także jeden półprodukt może wystąpić w wielu daniach. Podobny związek łączy dania i zamówienia. Jedno zamówienie może obejmować wiele dań, z kolei to samo danie może wystąpić w wielu zamówieniach. W tego typu związkach mamy zatem do czynienia ze złączeniem N‑M, tj. wiele‑do‑wielu.
Przeanalizuj grafikę i odpowiedz na pytanie: W jaki sposób na diagramie zobrazowano złączenia wiele‑do‑wielu?

Tabele i warunki integralności
Dotychczasowy model bazy zapisany jako diagram ER może wyglądać następująco:

Uwzględnia on etap normalizacji danych, tzn. wyodrębniono encje, np. Stoliki
czy Rabaty
, aby wyeliminować powtarzanie się danych. Na diagramie wskazano również klucze główne poszczególnych encji poprzez podkreślenie odpowiednich atrybutów. Klucze obce występują na diagramie jako związki łączące encje relacjami.
Na podstawie diagramu ER, czyli logicznego modelu bazy, możemy przygotować jej schemat w postaci tabel. Mógłby on wyglądać następująco:

Każda encja została przekształcona na osobną tabelę. Atrybuty encji stały się polami (kolumnami) tabel. Klucze główne oznaczone zostały skrótem PK
(ang. primary key), klucze obce skrótem FK
(ang. foreign key). Litera N
wskazuje, że pole nie może zawierać wartości NULL
(ang. not null). Relacje oznaczono tak jak na diagramie. Wreszcie każdemu polu przypisano odpowiedni typ danych:
int
– inaczejINTEGER
, liczba całkowita,float
– liczba zmiennoprzecinkowa pojedynczej precyzji, w nawiasach podano dokładność,decimal
– liczba zmiennoprzecinkowa przechowywana w postaci znakowej, w nawiasach podano dokładność,varchar
– inaczejTEXT
, ciąg znaków o zmiennej długości podawanej w nawiasach,timestamp
– data i czas, przechowywane w formacie RRRR‑MM‑DD GG:MM:SS.
Więcej informacji na temat typów danych i definiowania schematu bazy w języku SQL znajdziesz w serii materiałów:
Definiowanie schematu bazy danych w języku SQL, etap IDefiniowanie schematu bazy danych w języku SQL, etap I,
Definiowanie schematu bazy danych w języku SQL, etap IIDefiniowanie schematu bazy danych w języku SQL, etap II,
Definiowanie schematu bazy danych w języku SQL, etap IIIDefiniowanie schematu bazy danych w języku SQL, etap III,
Definiowanie schematu bazy danych w języku SQL, etap IVDefiniowanie schematu bazy danych w języku SQL, etap IV.
Implementacja w języku SQL
Kolejnym krokiem będzie przygotowanie skryptu, w którym użyjemy instrukcji i klauzul języka SQL do zapisania i utworzenia tabel, pól, relacji oraz określenia warunków integralności.
Nazwy i składania instrukcji oraz klauzul języka SQL różnią się w zależności od wybranego systemu bazodanowego. W naszym przypadku będziemy używali bazy SQLite, o której więcej możesz się dowiedzieć z multimedium zawartego w materiale Instrukcje wyszukiwania w języku SQL, etap IInstrukcje wyszukiwania w języku SQL, etap I.
Kolejność tworzenia tabel ma znaczenie ze względu na warunki integralności, na początku powinny być tworzone tabele, które nie zawierają kluczy obcych. Zaczniemy od grupy tabel związanych z klientami i rezerwacjami.
Zadaniem klauzul DROP
jest usunięcie podanej tabeli, jeżeli znajduje się już w bazie, co będzie przydatne podczas tworzenia interfejsu. Klauzule CREATE TABLE
tworzą tabele o podanych polach. Nazwy pól ze względu na późniejsze ich wykorzystanie w kodzie aplikacji internetowej ujednolicamy i skracamy – np. wszystkie klucze główne nazywają się id
, a klucze obce nazywamy wg schematu id_nazwa
.
W większości przypadków nakładamy na pola warunki integralności:
PRIMARY KEY
– klucz główny, pole nie może zawierać wartościNULL
i wartości nie mogą się powtarzać,AUTOINCREMENT
– wartość pola (kolejne liczby naturalne) jest tworzona automatycznie przez bazę,FOREIGN KEY (klucz_obcy) REFERENCES tabela(klucz_glowny)
– wskazanie klucza obcego, czyli utworzenie relacji między tabelami,ON DELETE CASCADE
– jeżeli klucz główny w tabeli nadrzędnej zostanie usunięty, usunięte zostaną również wszystkie powiązane rekordy z tabeli zależnej,NOT NULL
– jak wspominaliśmy, pole nie może przechowywać wartościNULL
, tj. nie może być puste,DEFAULT
– określenie wartości domyślnej wprowadzanej w polu przez bazę, jeżeli wartość ta nie zostanie podana,CURRENT_TMESTAMP
– zwraca aktualną datę i czas w formacie znakowym RRRR‑MM‑DD GG:MM:SS, np.:2023‑07‑18 14:16:52
.
Oprócz użytych i omówionych warunków mamy również ograniczenie UNIQUE
nakładane w tabeli na pole lub kilka pól, w których wartości nie mogą się powtarzać, ale mogą zawierać wartość NULL
. Warunek może również występować w polach klucza obcego.
Po tych wyjaśnieniach możemy zaimplementować tabele dań i zamówień:
W powyższym kodzie wyjaśnienia wymagają dwie rzeczy. Pierwsza to definicja pola, które przechowuje informacje o tym, czy danie jest dostępne w menu: menu BOOLEAN NOT NULL CHECK (menu IN (0, 1))
. Jest to pole logiczne, które może przyjmować tylko dwie wartości podane w klauzuli CHECK IN
, tzn. 0
– FAŁSZ lub 1
– PRAWDA.
Druga rzecz to dodatkowe pole o nazwie liczba
w tablicy sklady_zamowien
, które pozwoli na zapisanie liczby tych samych dań w danym zamówieniu.
Na koniec cały omówiony wyżej zestaw instrukcji SQL obejmiemy transakcją, tzn. na początku skryptu dodamy klauzulę BEGIN;
, a na końcu COMMIT;
. Dzięki temu zmiany w bazie danych, tj. utworzenie tabel, zostaną zatwierdzone tylko wtedy, kiedy wszystkie instrukcje zostaną poprawnie wykonane.
Przygotowany kod SQL zapiszmy na dysku w pliku restauracja.sql
.
Utworzenie bazy i tabel
W następnym materiale zajmiemy się tworzeniem aplikacji internetowej, która pozwoli na utworzenie bazy i wygodne korzystanie z niej bez znajomości poleceń SQL. Jednak już teraz możemy sprawdzić poprawność utworzonego kodu za pomocą wiersza poleceń bazy SQLite lub programu SQLiteStudio. Narzędzia te omówione zostały na początku materiału Definiowanie schematu bazy danych w języku SQL, etap IIDefiniowanie schematu bazy danych w języku SQL, etap II.
W przypadku wiersza poleceń bazy SQLite
w katalogu ze skryptem zawierającym omówione wyżej instrukcje SQL otwieramy terminal i wydajemy polecenie:
Wynikiem działania będzie utworzenie bazy w pliku restauracja.db
i wykonanie w niej instrukcji SQL zawartych w skrypcie restauracja.sql
. Jeżeli skrypt zawierał będzie błędy składniowe, wyświetlony zostanie odpowiedni komunikat. Po utworzeniu bazy i tabel możemy ją otworzyć za pomocą wiersza poleceń i wykonywać w niej różne operacje, np.:
Znaczenie kolejnych instrukcji:
.table
– pokazuje listę tabel,.schema [nazwa_tabeli]
– pokaże kod SQL, który posłużył do utworzenia wszystkich tabel lub opcjonalnie podanej tabeli,.quit
– wyjście z wiersza poleceń bazy,INSERT
,SELECT
– klauzule SQL, których używamy do dodawania i odczytywanie danych z tabel.

Drugie rozwiązanie polega na skorzystaniu z programu SQLiteStudio. Po jego uruchomieniu wybieramy polecenie Baza danych / Dodaj bazę danych
i w polu plik wpisujemy albo wskazujemy ścieżkę oraz podajemy nazwę pliku bazy danych, np. restauracja.db
. Po kliknięciu OK
zostanie utworzona pusta baza danych w podanym pliku, a jej nazwa pojawi się w panelu Bazy danych
po lewej stronie okna programu.

Nazwę bazy w panelu dwa razy klikamy, aby się z nią połączyć, i otwieramy okno edytora SQL: Narzędzia / Otwórz edytor SQL
. Następnie do pola Zapytanie
wklejamy zawartość skryptu restauracja.sql
lub wczytujemy ją po wybraniu polecenia Wczytaj SQL z pliku
dostępnego pod ikoną katalogu na pasku narzędzi edytora. Wszystkie polecenia zaznaczamy np. naciskając CTRL+A
i wykonujemy klikając przycisk Wykonaj zapytanie
lub naciskając F9
.

Utworzone tabele możemy przeglądać po wybraniu ich z listy w lewym panelu. Poniżej widać pola tabeli zamowienia
:

Słownik
pole (lub kombinacja pól) zawierające niepowtarzalne wartości, jednoznacznie identyfikujące rekordy tabeli; najczęściej zawiera kolejne wartości liczbowe automatycznie tworzone przez aparat bazy danych
(ang. entity) schematyczny opis rzeczywistych lub abstrakcyjnych obiektów za pomocą tzw. atrybutów lub własności wskazujących ich cechy
kolumna w tabeli, w której żaden rekord nie może się powtarzać; służy on jako identyfikator wierszy; może to także być wiele kolumn, takich, że żadne dwa wiersze nie posiadają wszystkich wartości takich samych w tych kolumnach (oznacza to, że wartości klucza głównego nie mogą być takie same dla dwóch różnych rekordów)
modyfikacja bazy tak, aby spełniała reguły jednej z postaci normalnych; pozwala to na usunięcie powtórzeń z bazy, zwiększenie jej spójności oraz przejrzystości; seria e‑materiałów Normalizacja Baz Danych omawia w szczegółach ten proces