1/12Widoki tabel – struktura i dane krok po kroku

DESCRIBE i SELECT * dla każdej tabeli – pełny przegląd

Pokazuje strukturę każdej tabeli (DESCRIBE) oraz przykładowe dane (SELECT *).

Wszystkie tabele pochodzą z finalnego schematu bazy bibliotecznej po normalizacji do 5NF (8 tabel).

Dane są pobrane bezpośrednio ze skryptu bd_5nf_step_by_step.sql – w pełni spójne z cyklem wykładów. Dane CSV do każdej tabeli dostępne w katalogu csv/.

Każdy slajd pokazuje: (1) strukturę tabeli przez DESCRIBE, (2) przykładowe dane przez SELECT *. Tak jak w konsoli MariaDB/MySQL.

Prezentacja "Widoki tabel" pokazuje praktyczny obraz każdej tabeli w systemie bibliotecznym. Dla każdej tabeli znajdziesz dwa widoki: strukturę (komenda DESCRIBE) oraz przykładowe dane (komenda SELECT *). To dokładnie te same wyniki, które zobaczyłbyś w konsoli MariaDB lub MySQL po wykonaniu tych komend.

Dane pochodzą wprost z pliku bd_5nf_step_by_step.sql, który zawiera kompletny, w pełni znormalizowany schemat bazy bibliotecznej. Dane CSV dla każdej tabeli znajdują się w katalogu csv/. Wszystkie wartości są spójne z przykładami używanymi w pozostałych prezentacjach z cyklu (1NF–5NF).

Prezentacja jest szczególnie przydatna przed egzaminem lub przed implementacją – pozwala szybko przypomnieć sobie, jakie kolumny ma każda tabela i jakie wartości mogą w nich występować. Możesz ją traktować jako interaktywną dokumentację schematu bazy danych.

2/12Tabela: Miasta

Słownik miast i kodów pocztowych (tabela nadrzędna)

DESCRIBE Miasta;

+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| ID_Miasta   | int(11)     | NO   | PRI | NULL    | auto_increment |
| Nazwa       | varchar(50) | NO   |     | NULL    |                |
| KodPocztowy | varchar(10) | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+

SELECT * FROM Miasta;

+-----------+-------------+--------------+
| ID_Miasta | Nazwa       | KodPocztowy  |
+-----------+-------------+--------------+
|         1 | Kraków      | 30-001       |
|         2 | Warszawa    | 00-002       |
|         3 | Gdańsk      | 80-001       |
|         4 | Wrocław     | 50-001       |
|         5 | Poznań      | 60-001       |
+-----------+-------------+--------------+

3 kolumny, 5 wierszy. ID_Miasta = PK auto_increment. Nazwa i kod pocztowy wymagane.

Miasta: słownik. Każda para (nazwa, kod) występuje raz. Czytelnicy odwołują się przez ID_Miasta.

Tabela Miasta to słownik zawierający pary (nazwa miasta, kod pocztowy). Klucz główny ID_Miasta jest automatycznie inkrementowany. Dzięki wyodrębnieniu tej tabeli w 3NF unikamy powtarzania danych adresowych w każdym wierszu tabeli Czytelnicy.

W przykładowych danych mamy pięć polskich miast. Kod pocztowy Gdańska to 80-001, Wrocławia 50-001, Poznania 60-001. W rzeczywistości miasta mają wiele kodów pocztowych, ale dla uproszczenia przykładu przyjmujemy jeden kod na miasto.

Pobierz dane CSV (miasta.csv)

3/12Tabela: Czytelnicy

Dane osobowe czytelników (tabela nadrzędna)

DESCRIBE Czytelnicy;

+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| ID_Czyt     | int(11)     | NO   | PRI | NULL    | auto_increment |
| Imie        | varchar(50) | NO   |     | NULL    |                |
| Nazwisko    | varchar(50) | NO   |     | NULL    |                |
| ID_Miasta   | int(11)     | NO   | MUL | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+

SELECT * FROM Czytelnicy;

+---------+--------+-----------+-----------+
| ID_Czyt | Imie   | Nazwisko  | ID_Miasta |
+---------+--------+-----------+-----------+
|       1 | Jan    | Kowalski  |         1 |
|       2 | Anna   | Nowak     |         2 |
|       3 | Piotr  | Wiśniewski|         3 |
|       4 | Maria  | Zalewska  |         4 |
|       5 | Tomasz | Adamski   |         5 |
+---------+--------+-----------+-----------+

4 kolumny, 5 wierszy. ID_Czyt = PK. ID_Miasta = FK → Miasta(ID_Miasta).

Czytelnicy: dane podstawowe. Adresy, telefony i emaile w osobnych tabelach (4NF).

Tabela Czytelnicy przechowuje dane identyfikacyjne czytelników. W finalnym schemacie 5NF zawiera tylko podstawowe informacje: identyfikator, imię, nazwisko i klucz obcy do tabeli Miasta. Adresy zamieszkania, numery telefonów i adresy email zostały przeniesione do osobnych tabel w ramach normalizacji do 4NF.

Tabela Czytelnicy jest centralnym punktem schematu – łączy się z sześcioma innymi tabelami: Miasta (FK), Wypozyczenia (1:N), Opiekunowie (1:1), Przypisania_BCNF (1:N), Telefony (1:N) i Emaile (1:N).

Pobierz dane CSV (czytelnicy.csv)

4/12Tabela: Ksiazki

Katalog książek (tabela nadrzędna)

DESCRIBE Ksiazki;

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| ISBN       | varchar(20)  | NO   | PRI | NULL    |       |
| Tytul      | varchar(200) | NO   |     | NULL    |       |
| RokWydania | int(11)      | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

SELECT * FROM Ksiazki;

+--------------------+--------------------------+------------+
| ISBN               | Tytul                    | RokWydania |
+--------------------+--------------------------+------------+
| 978-83-123-4567-1  | Przedwiośnie             |       1924 |
| 978-83-123-4567-2  | Lalka                    |       1890 |
| 978-83-123-4567-3  | Pan Tadeusz              |       1834 |
| 978-83-123-4567-4  | Ferdydurke               |       1937 |
| 978-83-123-4567-5  | Quo Vadis                |       1896 |
| 978-83-123-4567-6  | Wiedza i Życie 01/2026   |       2026 |
| 978-83-123-4567-7  | Bazy danych              |       2022 |
| 978-83-123-4567-8  | SQL dla początkujących    |       2024 |
+--------------------+--------------------------+------------+

3 kolumny, 8 wierszy. ISBN = klucz główny (naturalny). RokWydania opcjonalny.

Ksiazki: ISBN to klucz naturalny. Autor, gatunek i wydawnictwo w osobnych tabelach (5NF).

Tabela Ksiazki w finalnym schemacie 5NF zawiera tylko trzy kolumny: ISBN (klucz główny), tytuł i rok wydania. Pozostałe atrybuty książki – autor, gatunek, wydawnictwo – zostały przeniesione do osobnych tabel w procesie normalizacji, co pozwala na modelowanie bardziej złożonych relacji (wielu autorów, wiele wydawnictw).

W zbiorze danych mamy osiem pozycji: pięć dzieł literatury pięknej (Przedwiośnie, Lalka, Pan Tadeusz, Ferdydurke, Quo Vadis), jedno czasopismo (Wiedza i Życie) oraz dwa podręczniki informatyczne (Bazy danych, SQL dla początkujących).

Pobierz dane CSV (ksiazki.csv)

5/12Tabela: Wypozyczenia

Rejestr wypożyczeń (tabela zdarzeń)

DESCRIBE Wypozyczenia;

+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| ID_Wyp      | int(11)     | NO   | PRI | NULL    | auto_increment |
| ID_Czyt     | int(11)     | NO   | MUL | NULL    |                |
| ISBN        | varchar(20) | NO   | MUL | NULL    |                |
| DataWyp     | date        | NO   |     | NULL    |                |
| DataZwrotu  | date        | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+

SELECT * FROM Wypozyczenia ORDER BY ID_Wyp;

+-------+---------+--------------------+------------+-------------+
| ID_Wyp| ID_Czyt | ISBN               | DataWyp    | DataZwrotu  |
+-------+---------+--------------------+------------+-------------+
|     1 |       1 | 978-83-123-4567-1  | 2026-02-01 | 2026-02-15  |
|     2 |       1 | 978-83-123-4567-2  | 2026-03-01 | NULL        |
|     3 |       2 | 978-83-123-4567-3  | 2026-04-01 | NULL        |
|     4 |       3 | 978-83-123-4567-2  | 2026-01-15 | 2026-01-30  |
|     5 |       4 | 978-83-123-4567-6  | 2026-05-01 | NULL        |
|     6 |       5 | 978-83-123-4567-7  | 2026-03-10 | 2026-03-25  |
|     7 |       3 | 978-83-123-4567-4  | 2026-04-15 | NULL        |
|     8 |       4 | 978-83-123-4567-1  | 2026-05-15 | 2026-05-30  |
|     9 |       5 | 978-83-123-4567-8  | 2026-06-01 | NULL        |
|    10 |       2 | 978-83-123-4567-2  | 2026-06-10 | NULL        |
|    11 |       1 | 978-83-123-4567-5  | 2026-06-15 | NULL        |
|    12 |       3 | 978-83-123-4567-3  | 2026-06-20 | 2026-07-05  |
+-------+---------+--------------------+------------+-------------+

5 kolumn, 12 wierszy. PK = ID_Wyp. FK: ID_Czyt → Czytelnicy, ISBN → Ksiazki.

Wypozyczenia: NULL w DataZwrotu = książka wciąż wypożyczona. Kara i Status w osobnych tabelach (5NF).

Tabela Wypozyczenia w finalnym schemacie 5NF rejestruje zdarzenia wypożyczeń w najprostszej możliwej formie: kto (ID_Czyt), co (ISBN), kiedy wypożyczył (DataWyp) i kiedy zwrócił (DataZwrotu). NULL w DataZwrotu oznacza książkę wciąż będącą w posiadaniu czytelnika.

W porównaniu z wcześniejszymi etapami normalizacji (2NF, 3NF), finalna wersja tabeli ma mniej kolumn. Kara i Status zostały przeniesione do osobnych tabel w ramach dekompozycji 5NF (zależności złączeniowe). Dzięki temu każda tabela przechowuje jeden rodzaj faktów.

Widzimy 12 wypożyczeń. Niektóre książki zostały już zwrócone (wiersze 1, 4, 6, 8, 12), inne wciąż są u czytelników (wiersze 2, 3, 5, 7, 9, 10, 11). Czytelnik 1 (Jan Kowalski) ma trzy wypożyczenia, czytelnik 3 (Piotr Wiśniewski) również trzy.

Pobierz dane CSV (wypozyczenia.csv)

6/12Tabela: Opiekunowie

Opiekunowie czytelników (tabela BCNF)

DESCRIBE Opiekunowie;

+-----------------+---------+------+-----+---------+-------+
| Field           | Type    | Null | Key | Default | Extra |
+-----------------+---------+------+-----+---------+-------+
| ID_Czyt         | int(11) | NO   | PRI | NULL    |       |
| ID_Bibliotekarza| int(11) | NO   | PRI | NULL    |       |
+-----------------+---------+------+-----+---------+-------+

SELECT * FROM Opiekunowie;

+---------+------------------+
| ID_Czyt | ID_Bibliotekarza |
+---------+------------------+
|       1 |                1 |
|       2 |                1 |
|       3 |                2 |
|       4 |                2 |
|       5 |                1 |
+---------+------------------+

2 kolumny, 5 wierszy. PK = (ID_Czyt, ID_Bibliotekarza) (relacja 1:1 – każdy czytelnik ma jednego opiekuna).

Opiekunowie: relacja 1:1. Bibliotekarz 1 opiekuje się czytelnikami 1, 2, 5. Bibliotekarz 2 opiekuje się czytelnikami 3, 4.

Tabela Opiekunowie powstała w wyniku dekompozycji BCNF – wyodrębnia zależność ID_Czyt → ID_Bibliotekarza. Każdy czytelnik ma dokładnie jednego opiekuna (relacja 1:1), ale jeden bibliotekarz może opiekować się wieloma czytelnikami.

W danych widzimy, że bibliotekarz 1 opiekuje się trzema czytelnikami (Jan, Anna, Tomasz), a bibliotekarz 2 – dwoma (Piotr, Maria). ID_Czyt jest częścią klucza głównego, co gwarantuje, że każdy czytelnik występuje w tej tabeli co najwyżej raz.

Pobierz dane CSV (opiekunowie.csv)

7/12Tabela: Przypisania_BCNF

Przypisania książek do czytelników (tabela BCNF)

DESCRIBE Przypisania_BCNF;

+-------------------+--------------+------+-----+---------+-------+
| Field             | Type         | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| ID_Czyt           | int(11)      | NO   | PRI | NULL    |       |
| ISBN              | varchar(20)  | NO   | PRI | NULL    |       |
| DataPrzypisania   | date         | NO   | PRI | NULL    |       |
+-------------------+--------------+------+-----+---------+-------+

SELECT * FROM Przypisania_BCNF;

+---------+--------------------+-------------------+
| ID_Czyt | ISBN               | DataPrzypisania   |
+---------+--------------------+-------------------+
|       1 | 978-83-123-4567-1  | 2026-01-01        |
|       1 | 978-83-123-4567-2  | 2026-01-01        |
|       2 | 978-83-123-4567-3  | 2026-01-01        |
|       3 | 978-83-123-4567-2  | 2026-01-01        |
+---------+--------------------+-------------------+

3 kolumny, 4 wiersze. Klucz złożony: (ID_Czyt, ISBN, DataPrzypisania). FK: ID_Czyt → Czytelnicy, ISBN → Ksiazki.

Przypisania_BCNF: rejestruje przypisanie książki do czytelnika przez bibliotekarza w konkretnym dniu.

Tabela Przypisania_BCNF przechowuje informacje o przypisaniu książki do czytelnika. Powstała w wyniku dekompozycji BCNF – ID_Bibliotekarza został przeniesiony do tabeli Opiekunowie. Klucz złożony z trzech kolumn (ID_Czyt, ISBN, DataPrzypisania) zapewnia, że każda kombinacja może wystąpić co najwyżej raz dziennie.

W przykładowych danych widać cztery przypisania: czytelnik 1 (Jan) ma przypisane książki 1 i 2, czytelnik 2 (Anna) książkę 3, a czytelnik 3 (Piotr) książkę 2. Wszystkie przypisania zostały dokonane 1 stycznia 2026.

Pobierz dane CSV (przypisania_bcnf.csv)

8/12Tabela: Telefony

Numery telefonów czytelników (tabela 4NF)

DESCRIBE Telefony;

+----------+-------------+------+-----+-----------+-------+
| Field    | Type        | Null | Key | Default   | Extra |
+----------+-------------+------+-----+-----------+-------+
| ID_Czyt  | int(11)     | NO   | PRI | NULL      |       |
| Telefon  | varchar(20) | NO   | PRI | NULL      |       |
| TypTel   | varchar(20) | NO   |     | komórkowy |       |
+----------+-------------+------+-----+-----------+-------+

SELECT * FROM Telefony;

+---------+-------------+-----------+
| ID_Czyt | Telefon     | TypTel    |
+---------+-------------+-----------+
|       1 | 123-456-789 | komórkowy |
|       1 | 123-456-790 | domowy    |
|       2 | 987-654-321 | komórkowy |
|       3 | 555-123-456 | komórkowy |
|       4 | 666-789-012 | komórkowy |
|       5 | 777-345-678 | komórkowy |
+---------+-------------+-----------+

3 kolumny, 6 wierszy. PK złożony: (ID_Czyt, Telefon). FK: ID_Czyt → Czytelnicy.

Telefony: 4NF. Czytelnik 1 (Jan) ma dwa telefony – komórkowy i domowy. Pozostali po jednym.

Tabela Telefony powstała w wyniku normalizacji do 4NF – przechowuje numery telefonów czytelników jako niezależną listę. Każdy wiersz to jeden numer telefonu jednego czytelnika. Klucz złożony (ID_Czyt, Telefon) zapobiega dodaniu tego samego numeru dwa razy dla tego samego czytelnika.

W danych: Jan Kowalski (ID_Czyt=1) ma dwa telefony – komórkowy (123-456-789) i domowy (123-456-790). Pozostali czytelnicy mają po jednym telefonie komórkowym. Domyślnym typem telefonu jest 'komórkowy'.

Pobierz dane CSV (telefony.csv)

9/12Tabela: Emaile

Adresy email czytelników (tabela 4NF)

DESCRIBE Emaile;

+----------+--------------+------+-----+----------+-------+
| Field    | Type         | Null | Key | Default  | Extra |
+----------+--------------+------+-----+----------+-------+
| ID_Czyt  | int(11)      | NO   | PRI | NULL     |       |
| Email    | varchar(100) | NO   | PRI | NULL     |       |
| TypEmail | varchar(20)  | NO   |     | osobisty |       |
+----------+--------------+------+-----+----------+-------+

SELECT * FROM Emaile;

+---------+------------------------+----------+
| ID_Czyt | Email                  | TypEmail |
+---------+------------------------+----------+
|       1 | jan@example.com        | osobisty |
|       1 | jan.kowalski@firma.pl  | służbowy |
|       2 | anna@example.com       | osobisty |
|       3 | piotr@example.com      | osobisty |
|       4 | maria@example.com      | osobisty |
|       5 | tomasz@example.com     | osobisty |
+---------+------------------------+----------+

3 kolumny, 6 wierszy. PK złożony: (ID_Czyt, Email). FK: ID_Czyt → Czytelnicy.

Emaile: 4NF. Czytelnik 1 (Jan) ma dwa emaile – osobisty i służbowy. Pozostali po jednym osobistym.

Tabela Emaile jest analogiczna do Telefony – przechowuje adresy email czytelników jako niezależną listę. Każdy wiersz to jeden adres email. Domyślnym typem emaila jest 'osobisty'. Dzięki osobnej tabeli czytelnik może mieć dowolną liczbę adresów email różnych typów.

W danych: Jan Kowalski (ID_Czyt=1) ma email osobisty (jan@example.com) i służbowy (jan.kowalski@firma.pl). Pozostali czytelnicy mają po jednym emailu osobistym. To pokazuje elastyczność modelu 4NF – jeden czytelnik może mieć wiele kontaktów każdego typu, bez efektu produktu kartezjańskiego.

Pobierz dane CSV (emaile.csv)

10/12Tabele 5NF: KsiazkiAutorzy, KsiazkiBibliotekarze, AutorzyBibliotekarze

Dekompozycja zależności złączeniowej (JD) – trzy tabele binarne

SELECT * FROM KsiazkiAutorzy_5NF;

+--------------------+-------------------+
| ISBN               | Autor             |
+--------------------+-------------------+
| 978-83-123-4567-1  | Stefan Żeromski   |
| 978-83-123-4567-1  | Bolesław Prus     |
| 978-83-123-4567-2  | Stefan Żeromski   |
+--------------------+-------------------+

SELECT * FROM KsiazkiBibliotekarze_5NF;

+--------------------+------------------+
| ISBN               | ID_Bibliotekarza |
+--------------------+------------------+
| 978-83-123-4567-1  |                1 |
| 978-83-123-4567-1  |                2 |
| 978-83-123-4567-2  |                2 |
+--------------------+------------------+

SELECT * FROM AutorzyBibliotekarze_5NF;

+-------------------+------------------+
| Autor             | ID_Bibliotekarza |
+-------------------+------------------+
| Stefan Żeromski   |                1 |
| Bolesław Prus     |                2 |
| Stefan Żeromski   |                2 |
+-------------------+------------------+

3 tabele binarne, każda z kluczem złożonym (2 kolumny). Razem 3+3+3 = 9 wierszy.

5NF: rozkład tabeli Rekomendacje (ISBN, Autor, ID_Bib) na trzy tabele binarne. Złączenie daje oryginalne dane (JD spełniona).

Te trzy tabele ilustrują dekompozycję 5NF. Oryginalna tabela Rekomendacje (ISBN, Autor, ID_Bibliotekarza) zawierała zależność złączeniową (JD) – każda para atrybutów była niezależna. Po dodaniu czwartego wiersza (ISBN1, Żeromski, Bib2) JD została spełniona i tabelę można było bezstratnie rozłożyć na trzy tabele binarne.

Każda z tabel binarnych przechowuje relację między parą encji: KsiazkiAutorzy (które książki mają których autorów), KsiazkiBibliotekarze (które książki polecają bibliotekarze) i AutorzyBibliotekarze (których autorów polecają bibliotekarze). Złączenie tych trzech tabel daje dokładnie cztery wiersze oryginalnej tabeli Rekomendacje.

Pobierz dane CSV (ksiazki_autorzy_5nf.csv) | ksiazki_bibliotekarze_5nf.csv | autorzy_bibliotekarze_5nf.csv

11/12Złączenia JOIN – łączymy tabele w zapytaniach

Jak wyglądają dane po połączeniu tabel?

-- Pełny widok wypożyczeń z danymi czytelnika i książki
SELECT w.ID_Wyp, cz.Imie, cz.Nazwisko,
       k.Tytul, w.DataWyp, w.DataZwrotu
FROM Wypozyczenia w
JOIN Czytelnicy cz ON w.ID_Czyt = cz.ID_Czyt
JOIN Ksiazki k ON w.ISBN = k.ISBN
WHERE w.DataZwrotu IS NULL;

Wynik – aktywne wypożyczenia (DataZwrotu IS NULL):

+-------+-------+-----------+--------------------------+------------+-------------+
|ID_Wyp | Imie  | Nazwisko  | Tytul                    | DataWyp    | DataZwrotu  |
+-------+-------+-----------+--------------------------+------------+-------------+
|     2 | Jan   | Kowalski  | Lalka                    | 2026-03-01 | NULL        |
|     3 | Anna  | Nowak     | Pan Tadeusz              | 2026-04-01 | NULL        |
|     5 | Maria | Zalewska  | Wiedza i Życie 01/2026   | 2026-05-01 | NULL        |
|     7 | Piotr | Wiśniewski| Ferdydurke               | 2026-04-15 | NULL        |
|     9 | Tomasz| Adamski   | SQL dla początkujących   | 2026-06-01 | NULL        |
|    10 | Anna  | Nowak     | Lalka                    | 2026-06-10 | NULL        |
|    11 | Jan   | Kowalski  | Quo Vadis                | 2026-06-15 | NULL        |
+-------+-------+-----------+--------------------------+------------+-------------+

JOIN łączy trzy tabele w jeden czytelny widok. 7 aktywnych wypożyczeń.

JOIN to cena normalizacji: zamiast jednej tabeli łączymy trzy. Zysk: każdy fakt przechowywany raz, brak redundancji.

Zapytanie z JOIN łączące trzy tabele pokazuje wszystkie aktywne wypożyczenia (książki, które nie zostały jeszcze zwrócone). Dane czytelnika (imię, nazwisko) pochodzą z tabeli Czytelnicy, dane książki (tytuł) z tabeli Ksiazki, a informacje o dacie wypożyczenia z tabeli Wypozyczenia.

Wynik pokazuje 7 aktywnych wypożyczeń. Jan Kowalski ma aktualnie "Lalkę" i "Quo Vadis", Anna Nowak ma "Pana Tadeusza" i "Lalkę", a pozostali czytelnicy mają po jednej książce. Gdybyśmy chcieli dodać miasto czytelnika, potrzebowalibyśmy kolejnego JOIN-a: JOIN Miasta m ON cz.ID_Miasta = m.ID_Miasta.

12/12Podsumowanie – wszystkie tabele na jeden rzut oka

8 tabel – pełny obraz bazy po normalizacji do 5NF

#TabelaKolumnyPKFKWierszyNF
1Miasta3ID_Miasta55NF
2Czytelnicy4ID_CzytID_Miasta55NF
3Ksiazki3ISBN85NF
4Wypozyczenia5ID_WypID_Czyt, ISBN125NF
5Opiekunowie2(ID_Czyt, ID_Bibliotekarza)ID_Czyt55NF
6Przypisania_BCNF3(ID_Czyt, ISBN, DataPrzypisania)ID_Czyt, ISBN45NF
7Telefony3(ID_Czyt, Telefon)ID_Czyt65NF
8Emaile3(ID_Czyt, Email)ID_Czyt65NF

Razem: 8 tabel, 26 kolumn, 51 wierszy danych. Wszystkie tabele w 5NF. Dane w 100% zgodne z bd_5nf_step_by_step.sql. Pliki CSV dostępne w katalogu csv/.

Gotowe do implementacji. Wszystkie tabele w 5NF. Żadnych anomalii. Każdy fakt przechowywany dokładnie raz.

Oto pełny obraz bazy danych systemu bibliotecznego po normalizacji do 5NF. Osiem tabel, z których każda przechowuje jeden rodzaj faktów. Łącznie 26 kolumn i 51 wierszy danych przykładowych.

Wszystkie dane są pobrane bezpośrednio z pliku bd_5nf_step_by_step.sql i są w 100% spójne z pozostałymi prezentacjami z cyklu (1NF–5NF, BCNF). Kolejność tworzenia tabel: najpierw nadrzędne (Miasta, Czytelnicy, Ksiazki), potem zależne (Wypozyczenia, Opiekunowie, Przypisania_BCNF, Telefony, Emaile).

W porównaniu z wcześniejszymi etapami normalizacji (2NF, 3NF), finalny schemat 5NF ma mniej kolumn w głównych tabelach – część danych została przeniesiona do osobnych tabel w ramach dekompozycji zależności funkcyjnych, wielowartościowych i złączeniowych.

Dane w formacie CSV: Pliki CSV z danymi dla każdej tabeli znajdują się w katalogu csv/ – osobny plik dla każdej tabeli. Aby zaimportować dane do istniejącej bazy, użyj polecenia LOAD DATA z konsoli MariaDB, np.: LOAD DATA LOCAL INFILE 'csv/miasta.csv' INTO TABLE Miasta FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' IGNORE 1 ROWS;. Kolejność importu musi być zgodna z kolejnością tworzenia tabel – najpierw tabele nadrzędne (Miasta, Czytelnicy, Ksiazki), potem zależne (Wypozyczenia, Opiekunowie, Przypisania_BCNF, Telefony, Emaile).