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.
Tabela jest w piątej postaci normalnej (5NF), jeśli:
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.
Zrozumienie problemu zależności złączenia poprzez analizę hipotetycznego scenariusza, który łamie zasady 5NF.
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ą.
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.
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.
Rozwiązanie problemu zależności złączenia poprzez dekompozycję tabeli na trzy osobne, reprezentujące binarne relacje.
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.
+-------------------+ +--------------------+ +-------------------+ | agent_dostawca | | dostawca_gatunek | | agent_gatunek | +-------------------+ +--------------------+ +-------------------+ | PK| agent | | PK| dostawca | | PK| agent | | PK| dostawca | | PK| gatunek | | PK| gatunek | +-------------------+ +--------------------+ +-------------------+
-- 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;
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.
Analiza tabel znormalizowanych w poprzednich laboratoriach w celu potwierdzenia ich zgodności z piątą postacią normalną.
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.
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.
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.