Laboratorium 1.5: Piąta postać normalna (5NF) i zależności złączeń

Wprowadzenie do piątej postaci normalnej (5NF)

Piąta postać normalna (5NF), znana również jako postać normalna projekcji-złączenia (PJ/NF), jest najwyższym poziomem normalizacji i dotyczy bardzo specyficznego rodzaju anomalii związanego z zależnością złączenia (join dependency).

Zależność złączenia występuje, gdy tabela może być bezstratnie zdekomponowana na trzy lub więcej mniejszych tabel, a następnie odtworzona przez ich złączenie. Jeśli tabela nie może być rozbita na mniejsze komponenty bez utraty informacji lub tworzenia fałszywych danych, mówi się, że jest w 5NF. Problem pojawia się, gdy jedna tabela przechowuje cykliczną, wzajemnie powiązaną relację między trzema lub więcej atrybutami.

Teoria: Piąta postać normalna (5NF)

Tabela jest w piątej postaci normalnej (5NF), jeśli:

  1. Jest w czwartej postaci normalnej (4NF).
  2. Każda nietrywialna zależność złączenia jest implikowana przez klucze kandydujące.

W praktyce oznacza to, że nie istnieje sposób na dalszą dekompozycję tabeli na mniejsze, logiczne części bez utraty sensu danych. Naruszenia 5NF są niezwykle rzadkie w dobrze zaprojektowanych bazach danych.

Zadanie 1: Identyfikacja problemu - zależność złączenia

Cel

Zrozumienie problemu zależności złączenia poprzez analizę hipotetycznego scenariusza, który łamie zasady 5NF.

Scenariusz

Nasze dotychczasowe tabele najprawdopodobniej już są w 5NF. Aby zademonstrować problem, musimy stworzyć nowy, złożony scenariusz. Wyobraźmy sobie, że nasza biblioteka współpracuje z różnymi dostawcami książek i zatrudnia agentów, którzy są odpowiedzialni za zamawianie określonych gatunków książek od konkretnych dostawców. Obowiązuje zasada: agent może zamówić dany gatunek od dostawcy tylko wtedy, gdy ten dostawca oferuje ten gatunek, a agent jest autoryzowany do współpracy z tym dostawcą.

Analiza problemu

Naiwne podejście mogłoby polegać na stworzeniu jednej tabeli `zamowienia_info`, która przechowuje wszystkie te powiązania:

+---------+----------------+------------+
| agent   | dostawca       | gatunek    |
+---------+----------------+------------+
| Nowak   | Hurtownia A    | Kryminał   |
| Nowak   | Hurtownia B    | Fantastyka |
| Kowalski| Hurtownia A    | Kryminał   |
| Nowak   | Hurtownia A    | Fantastyka | <-- Rekord nadmiarowy
+---------+----------------+------------+

Załóżmy następujące fakty:

Wiersz `(Nowak, Hurtownia A, Fantastyka)` jest nadmiarowy. Można go wywnioskować z faktu, że Nowak pracuje z Hurtownią A oraz że Hurtownia A dostarcza Fantastykę. Przechowywanie go wprost prowadzi do anomalii. Jeśli Hurtownia A przestanie dostarczać Fantastykę, musimy pamiętać o usunięciu tego konkretnego rekordu, co jest trudne do zarządzania.

Tabela ta ma zależność złączenia, ponieważ można ją odtworzyć, łącząc trzy mniejsze tabele (Agent-Dostawca, Dostawca-Gatunek, Agent-Gatunek), ale jej obecna forma prowadzi do redundancji.

Podsumowanie

W tym zadaniu zidentyfikowaliśmy rzadki, ale złożony problem zależności złączenia. Zrozumieliśmy, że próba przechowywania cyklicznych, trójstronnych relacji w jednej tabeli może prowadzić do subtelnych form redundancji, których nie eliminują niższe postacie normalne.

Zadanie 2: Normalizacja do 5NF poprzez dekompozycję

Cel

Rozwiązanie problemu zależności złączenia poprzez dekompozycję tabeli na trzy osobne, reprezentujące binarne relacje.

Scenariusz

Aby naprawić tabelę `zamowienia_info` i doprowadzić ją do 5NF, musimy ją rozbić na mniejsze tabele, z których każda będzie przechowywać jedną, nierozerwalną relację. W naszym przypadku będą to trzy tabele opisujące, którzy agenci współpracują z którymi dostawcami, którzy dostawcy oferują jakie gatunki, oraz którzy agenci są przypisani do jakich gatunków.

Kroki do wykonania

  1. Zaprojektuj i utwórz trzy nowe tabele: `agent_dostawca`, `dostawca_gatunek` i `agent_gatunek`.
  2. Wypełnij nowe tabele danymi.
  3. Pokaż, jak poprzez złączenie tych trzech tabel można odtworzyć pełną, poprawną informację bez redundancji.

Nowy, poprawny schemat bazy danych

+-------------------+      +--------------------+      +-------------------+
|  agent_dostawca   |      |  dostawca_gatunek  |      |   agent_gatunek   |
+-------------------+      +--------------------+      +-------------------+
| PK| agent         |      | PK| dostawca       |      | PK| agent         |
| PK| dostawca      |      | PK| gatunek        |      | PK| gatunek       |
+-------------------+      +--------------------+      +-------------------+

Przykłady poleceń

-- Krok 1: Tworzenie nowych tabel CREATE TABLE agent_dostawca (agent VARCHAR(100), dostawca VARCHAR(100), PRIMARY KEY(agent, dostawca)); CREATE TABLE dostawca_gatunek (dostawca VARCHAR(100), gatunek VARCHAR(100), PRIMARY KEY(dostawca, gatunek)); CREATE TABLE agent_gatunek (agent VARCHAR(100), gatunek VARCHAR(100), PRIMARY KEY(agent, gatunek)); -- Krok 2: Wypełnienie tabel INSERT INTO agent_dostawca VALUES ('Nowak', 'Hurtownia A'), ('Nowak', 'Hurtownia B'), ('Kowalski', 'Hurtownia A'); INSERT INTO dostawca_gatunek VALUES ('Hurtownia A', 'Kryminał'), ('Hurtownia A', 'Fantastyka'), ('Hurtownia B', 'Fantastyka'); INSERT INTO agent_gatunek VALUES ('Nowak', 'Fantastyka'), ('Kowalski', 'Kryminał'); -- Krok 3: Odtworzenie pełnej informacji za pomocą złączenia -- To zapytanie pokaże wszystkie prawidłowe kombinacje agent-dostawca-gatunek SELECT ad.agent, ad.dostawca, dg.gatunek FROM agent_dostawca ad JOIN dostawca_gatunek dg ON ad.dostawca = dg.dostawca JOIN agent_gatunek ag ON ad.agent = ag.agent AND dg.gatunek = ag.gatunek;

Podsumowanie

Pomyślnie doprowadziliśmy naszą strukturę do piątej postaci normalnej. Dekompozycja złożonej, trójstronnej relacji na trzy proste, binarne relacje wyeliminowała zależność złączenia i usunęła ryzyko anomalii. Każda tabela przechowuje teraz jeden, fundamentalny i nierozerwalny fakt biznesowy.

Zadanie 3: Weryfikacja zgodności istniejących tabel z 5NF

Cel

Analiza tabel znormalizowanych w poprzednich laboratoriach w celu potwierdzenia ich zgodności z piątą postacią normalną.

Scenariusz

Podobnie jak w przypadku 4NF, prawidłowo zaprojektowana baza danych, która jest już w 4NF, prawie zawsze będzie również w 5NF. Problemy z zależnościami złączenia są niezwykle rzadkie i dotyczą bardzo specyficznych, cyklicznych relacji między co najmniej trzema encjami. Przeanalizujemy nasze istniejące tabele, aby potwierdzić, że nie zawierają one takich ukrytych zależności.

Analiza tabel

Wszystkie nasze tabele, takie jak `ksiazki`, `autorzy`, `pracownicy`, `czytelnicy`, `dzialy`, `kody_pocztowe`, a nawet tabele łączące jak `ksiazki_autorzy`, opisują proste, binarne relacje (np. książka-autor) lub atrybuty pojedynczej encji (np. pracownik i jego pensja).

Nie ma wśród nich tabeli, która reprezentowałaby złożoną, trójstronną relację, którą można by dalej bezstratnie dekomponować. Każda z tych tabel jest już w swojej "atomowej" formie i nie da się jej bardziej podzielić bez utraty informacji. Na przykład, rozbicie tabeli `ksiazki_autorzy` na dwie osobne tabele (jedną z ID książek, drugą z ID autorów) całkowicie zniszczyłoby informację o tym, który autor napisał którą książkę.

Dlatego możemy z całą pewnością stwierdzić, że nasza baza danych biblioteki jest w piątej postaci normalnej.

Podsumowanie laboratorium

W tym laboratorium poznałeś najbardziej zaawansowaną postać normalną - 5NF. Nauczyłeś się, że jej celem jest eliminacja rzadko występujących zależności złączenia, które mogą pojawić się w tabelach opisujących złożone, cykliczne relacje. Zrozumiałeś, że kluczem do osiągnięcia 5NF jest dekompozycja takich tabel na najmniejsze możliwe, nierozerwalne komponenty. Co najważniejsze, utwierdziłeś się w przekonaniu, że solidny proces normalizacji do 3NF i 4NF w zdecydowanej większości przypadków prowadzi do bazy danych, która jest już zgodna z 5NF.