Normalizacja bazy danych

Normalizacja to technika projektowania bazy danych, która jest używana do projektowania tabeli relacyjnej bazy danych do wyższej postaci normalnej. Proces jest progresywny i nie można osiągnąć wyższego poziomu normalizacji bazy danych, jeśli poprzednie poziomy nie zostały spełnione.

Oznacza to, że mając dane w formie nieznormalizowanej (najmniej znormalizowanej) i dążąc do osiągnięcia najwyższej poziom normalizacji, pierwszym krokiem byłoby zapewnienie zgodności z pierwszą formą normalną, drugim krokiem byłoby zapewnienie spełnienia drugiej postaci normalnej i tak dalej w kolejności wspomnianej powyżej, aż dane będą zgodne z szóstą postacią normalną.

Warto jednak zauważyć, że normalne formy poza 4NF są głównie przedmiotem zainteresowania akademickiego, ponieważ problemy, które istnieją, rzadko pojawiają się w praktyce.

Należy pamiętać, że dane w poniższym przykładzie celowo zaprojektowany, aby zaprzeczać większości normalnych form. W prawdziwym życiu całkiem możliwe jest pominięcie niektórych kroków normalizacji, ponieważ tabela nie zawiera niczego, co byłoby sprzeczne z daną formą normalną. Często zdarza się również, że naprawienie naruszenia jednej normalnej postaci naprawia również naruszenie wyższej normalnej postaci w procesie. Na każdym kroku wybrano również jedną tabelę do normalizacji, co oznacza, że pod koniec tego przykładowego procesu nadal mogą istnieć tabele niespełniające najwyższej formy normalnej.

Initial dataEdit

Niech tabela bazy danych o następującej strukturze:

Tytuł Autor Narodowość autora Format Cena Temat Strony Grubość Wydawca Kraj wydawcy Typ publikacji Identyfikator gatunku Nazwa gatunku
Początek projektowania i optymalizacji bazy danych MySQL Chad Russell American Twarda oprawa 49,99 MySQL,

Baza danych,

Projekt

520 Gruby Apress USA E-book 1 Samouczek

W tym przykładzie zakładamy, że każda książka ma tylko jednego autora.

Satysfakcjonujący 1NFEdit

Aby spełnić 1NF, wartości w każdej kolumnie tabeli muszą być niepodzielne. W początkowej tabeli Temat zawiera zestaw wartości tematu, co oznacza, że nie jest zgodny.

Jednym ze sposobów osiągnięcia 1NF byłoby rozdzielenie duplikatów na wiele kolumn za pomocą powtarzających się grup Temat:

Tytuł Format Autor Narodowość autora Cena Temat 1 Temat 2 Temat 3 Strony Grubość Wydawca Kraj wydawcy Identyfikator gatunku Nazwa gatunku
Początek projektowania i optymalizacji bazy danych MySQL Twarda oprawa Chad Russell Amerykański 49,99 MySQL Baza danych Projekt 520 Gruby Apress Stany Zjednoczone 1 Samouczek

Chociaż teraz tabela formalnie jest zgodna z 1NF (jest atomowa), problem z tym rozwiązaniem jest oczywisty – jeśli książka ma więcej niż trzy tematy, nie można jej dodać do bazy danych bez zmiany jej struktury.

Aby rozwiązać problem w bardziej elegancki sposób, konieczne jest zidentyfikowanie bytów przedstawionych w tabeli i oddzielenie ich do swoich własnych tabel. W tym przypadku skutkowałoby to tabelami Book, Subject i Publisher:

Book
Tytuł Format Autor Narodowość autora Cena Strony Grubość Identyfikator gatunku Nazwa gatunku Identyfikator wydawcy
Początek MySQL Projektowanie i optymalizacja bazy danych Twarda oprawa Chad Russell Amerykanin 49.99 520 Gruby 1 Samouczek 1
Temat
Identyfikator tematu Nazwa podmiotu
1 MySQL
2 Baza danych
3 Projekt
Wydawca
Identyfikator_ wydawcy Nazwa Kraj
1 Apress USA

Zwykłe rozdzielenie danych początkowych na wiele tabel przerwałoby połączenie między danymi. Oznacza to, że należy określić relacje między nowo wprowadzonymi tabelami. Zwróć uwagę, że kolumna Identyfikator wydawcy w tabeli książki jest obcym kluczem, który określa relację wiele do jednego między książką a wydawcą.

Książka może pasować do wielu tematów, jak również temat może odpowiadają wielu książkom. Oznacza to również, że należy zdefiniować relację wiele do wielu, którą należy osiągnąć, tworząc tabelę linków:

Tytuł – Temat
Tytuł Identyfikator podmiotu
Rozpoczęcie projektowania i optymalizacji bazy danych MySQL 1
Rozpoczęcie projektowania i optymalizacji bazy danych MySQL 2
Rozpoczęcie projektowania i optymalizacji bazy danych MySQL 3

Zamiast jednej tabeli w formie nieznormalizowanej są teraz 4 tabele zgodne z 1NF.

Satysfakcjonujący 2NFEdit

Tabela Book ma jeden klucz kandydujący (który jest zatem kluczem podstawowym), klucz złożony {Tytuł, Format}. Rozważ następujący fragment tabeli:

Książka
Tytuł Format Autor Narodowość autora Cena Strony Grubość Genre ID Genre Name Publisher ID
Początek projektowania i optymalizacji bazy danych MySQL Twarda oprawa Chad Russell Amerykański 49,99 520 Gruby 1 Samouczek 1
Rozpoczęcie projektowania i optymalizacji bazy danych MySQL E-book Chad Russell Amerykański 22,34 520 Gruby 1 Samouczek 1
Relacyjny model zarządzania bazami danych: wersja 2 E-book EFCodd Brytyjska 13,88 538 Gruba 2 Popularnonaukowa 2
Relacyjny model bazy danych Ma nagement: wersja 2 Miękka oprawa EFCodd Brytyjska 39,99 538 Gruby 2 Popularnonaukowy 2

Wszystkie atrybuty, które nie są częścią klucza kandydującego, zależą od tytułu, ale tylko cena zależy również od formatu. Aby zachować zgodność z 2NF i usunąć duplikaty, każdy atrybut niebędący kluczem kandydującym musi zależeć od całego klucza kandydującego, a nie tylko jego części.

Aby znormalizować tę tabelę, utwórz {Tytuł} (prosty) klucz kandydujący (klucz podstawowy), tak aby każdy atrybut klucza innego niż kandydujący zależał od całego klucza kandydującego, i usuń cenę z oddzielnej tabeli, aby można było zachować jej zależność od formatu:

Książka
Tytuł Autor Narodowość autora Strony Grubość Identyfikator gatunku Nazwa gatunku Identyfikator wydawcy
Początek projektowania i optymalizacji bazy danych MySQL Chad Russell Amerykański 520 Gruby 1 Samouczek 1
Relacyjny model zarządzania bazami danych: wersja 2 EFCodd brytyjski 538 Gruby 2 Popularnonaukowy 2
Format – Cena
Tytuł Format Cena
Początek projektowania i optymalizacji bazy danych MySQL Twarda oprawa 49,99
Rozpoczęcie projektowania i optymalizacji bazy danych MySQL E-book 22.34
Relacyjny model zarządzania bazami danych: wersja 2 E-book 13.88
Relacyjny model zarządzania bazami danych: wersja 2 Paperback 39,99

Teraz tabela Książka jest zgodna z 2NF.

Satysfakcjonujący 3NFEdit

Tabela Book nadal ma przechodnią zależność funkcjonalną ({Author Nationality} jest zależne od {Author}, który jest zależny od {Title }). Podobne naruszenie istnieje w przypadku gatunku ({Nazwa gatunku} jest zależne od {Identyfikator gatunku}, który jest zależny od {Tytuł}). W związku z tym tabela Book nie znajduje się w 3NF. Aby zrobić to w 3NF, użyjmy następującej struktury tabeli, eliminując w ten sposób przechodnie zależności funkcjonalne, umieszczając {Author Nationality} i {Genre Name} w odpowiednich tabelach:

Książka

Tytuł Autor Strony Grubość Identyfikator gatunku Identyfikator wydawcy
Rozpoczęcie projektowania bazy danych MySQL i Optymalizacja Chad Russell 520 Gruby 1 1
Relacyjny model zarządzania bazami danych: wersja 2 EFCodd 538 Gruby 2 2
Format – Cena
Tytuł Format Cena
Początek projektu bazy danych MySQL i Optymalizacja Twarda oprawa 49,99
Początek projektowania i optymalizacji bazy danych MySQL E-book 22.34
Relacyjny model zarządzania bazami danych: wersja 2 E-book 13,88
Relacyjny model zarządzania bazami danych: wersja 2 Paperback 39,99

Autor
Autor Narodowość autora
Chad Russell Amerykanin
EFCodd Brytyjczyk
Gatunek
Gen re ID Nazwa gatunku
1 Samouczek
2 Popularnonaukowa

Satysfakcja z EKNFEdit

Główny artykuł: Podstawowa forma normalna klucza

Podstawowa forma normalna klucza (EKNF) mieści się ściśle między 3NF i BCNF i nie jest zbytnio omawiana w literaturze. Jego celem jest „uchwycenie najistotniejszych cech zarówno 3NF, jak i BCNF” przy jednoczesnym uniknięciu problemów obu (a mianowicie, że 3NF jest „zbyt wybaczający”, a BCNF jest „podatny na złożoność obliczeniową”). Ponieważ rzadko jest wspominany w literaturze, nie jest to uwzględnione w tym przykładzie.

Satysfakcjonujący 4NFEdit

Załóżmy, że baza danych jest własnością franczyzy księgarskiej, która ma kilku franczyzobiorców posiadających sklepy w różnych lokalizacjach.Dlatego sprzedawca zdecydował się dodać tabelę zawierającą dane o dostępności książek w różnych lokalizacjach:

Franczyzobiorca – lokalizacja książki
Identyfikator franczyzobiorcy Tytuł Lokalizacja
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL Kalifornia
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL Floryda
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL Teksas
1 Relacyjny model zarządzania bazami danych: wersja 2 Kalifornia
1 Relacyjny model zarządzania bazami danych: wersja 2 Floryda
1 Relacyjny model zarządzania bazami danych: wersja 2 Teksas
2 Początek projektowania i optymalizacji bazy danych MySQL Kalifornia
2 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL Floryda
2 Początek projektowania i optymalizacji bazy danych MySQL Teksas
2 Relacyjny model zarządzania bazami danych: wersja 2 Kalifornia
2 Relacyjny model zarządzania bazami danych: wersja 2 Floryda
2 Relacyjny model zarządzania bazami danych: wersja 2 Teksas
3 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL Teksas

Ponieważ ta struktura tabeli składa się ze złożonego klucza podstawowego, nie zawiera ona żadnych atrybutów niebędących kluczem i znajduje się już w BCNF (a zatem spełnia również wszystkie poprzednie formy normalne). Jeśli jednak przyjmiemy, że wszystkie dostępne książki są oferowane w każdym obszarze, możemy zauważyć, że tytuł nie jest jednoznacznie powiązany z określoną lokalizacją i dlatego tabela nie spełnia wymagań 4NF.

Oznacza to, że aby spełnić czwartą normalną postać, należy również zdekomponować tę tabelę:

Franczyzobiorca – książka
Identyfikator franczyzobiorcy Tytuł
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL
1 Relacyjny model zarządzania bazami danych: wersja 2
2 Początek projektowania i optymalizacji bazy danych MySQL
2 Relacyjny model zarządzania bazami danych: wersja 2
3 Początek projektowania i optymalizacji bazy danych MySQL
Franczyzobiorca – lokalizacja
Identyfikator franczyzobiorcy Lokalizacja
1 Kalifornia
1 Floryda
1 Teksas
2 Kalifornia
2 Floryda
2 Teksas
3 Teksas

Teraz każdy rekord jest jednoznacznie identyfikowany przez superklucz, dlatego 4NF jest spełniony.

Zadowalający ETNFEdit

Załóżmy, że franczyzobiorcy mogą również zamawiać książki od różnych dostawców. Niech relacja podlega również następującym ograniczeniom:

  • Jeśli pewien dostawca dostarcza określony tytuł
  • i tytuł ten jest dostarczany franczyzobiorcy
  • a franczyzobiorca jest zaopatrywany przez dostawcę,
  • wówczas dostawca dostarcza franczyzobiorcy tytuł własności.
Dostawca – Książka – Franczyzobiorca
Identyfikator dostawcy Tytuł Identyfikator franczyzobiorcy
1 Początek projektowania i optymalizacji bazy danych MySQL 1
2 Relacyjny model zarządzania bazami danych: wersja 2 2
3 Nauka SQL 3

Ta tabela jest w 4NF, ale ID dostawcy jest równe połączeniu jej prognoz: {{ID dostawcy, książka}, {książka, ID franczyzobiorcy}, {ID franczyzobiorcy, dostawca ID}}.Żaden składnik tej zależności łączenia nie jest superkluczem (jedynym superkluczem jest cały nagłówek), więc tabela nie spełnia wymagań ETNF i może być dalej rozłożona:

Dostawca – książka
ID dostawcy Tytuł
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL
2 Relacyjny model zarządzania bazami danych: wersja 2
3 Nauka języka SQL
Książka – Franczyzobiorca
Tytuł Identyfikator franczyzobiorcy
Początek projektowania i optymalizacji bazy danych MySQL 1
Relacyjny model zarządzania bazami danych: wersja 2 2
Nauka SQL 3
Franczyzobiorca – dostawca
Identyfikator dostawcy Identyfikator franczyzobiorcy
1 1
2 2
3 3

Dekompozycja zapewnia zgodność z ETNF.

Spełnianie 5NFEdit

Aby znaleźć tabelę niespełniającą 5NF, należy jest zwykle konieczne do dokładnego zbadania danych. Załóżmy, że tabela z przykładu 4NF z niewielkimi modyfikacjami danych i sprawdźmy, czy spełnia 5NF:

Franczyzobiorca – lokalizacja książki
Identyfikator franczyzobiorcy Tytuł Lokalizacja
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL Kalifornia
1 Nauka SQL Kalifornia
1 Relacyjny model zarządzania bazami danych: wersja 2 Teksas
2 Relacyjny model zarządzania bazami danych: wersja 2 Kalifornia

Jeśli zdekomponujemy tę tabelę, zmniejszymy nadmiarowość i otrzymamy następujące dwie tabele:

Franczyzobiorca – książka
Identyfikator franczyzobiorcy Tytuł
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL
1 Nauka SQL
1 Relacyjny model zarządzania bazami danych: wersja 2
2 Relacyjny model zarządzania bazami danych: wersja 2
Franczyzobiorca – lokalizacja
Identyfikator franczyzobiorcy Lokalizacja
1 Kalifornia
1 Teksas
2 Kalifornia

Co się stanie, jeśli spróbujemy dołączyć do tych tabel? Zapytanie zwróci następujące dane:

Franczyzobiorca – Książka – Lokalizacja JOINed
Identyfikator franczyzobiorcy Tytuł Lokalizacja
1 Początek projektowania bazy danych MySQL i Optymalizacja Kalifornia
1 Nauka SQL Kalifornia
1 Relacyjny model zarządzania bazami danych: wersja 2 Kalifornia
1 Relacyjny model zarządzania bazami danych: wersja 2 Teksas
1 Nauka SQL Teksas
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL Teksas
2 Relacyjny model zarządzania bazami danych: wersja 2 Kalifornia

Najwyraźniej JOIN zwraca o trzy wiersze więcej niż powinien – spróbujmy dodać ano tabela, aby wyjaśnić związek.Otrzymujemy trzy oddzielne tabele:

Franczyzobiorca – książka
Identyfikator franczyzobiorcy Tytuł
1 Rozpoczęcie projektowania i optymalizacji bazy danych MySQL
1 Nauka SQL
1 Relacyjny model zarządzania bazami danych: wersja 2
2 Relacyjny model zarządzania bazami danych: wersja 2
Franczyzobiorca – lokalizacja
Identyfikator franczyzobiorcy Lokalizacja
1 Kalifornia
1 Teksas
2 Kalifornia
Lokalizacja – Boo k
Lokalizacja Tytuł
Kalifornia Rozpoczęcie projektowania i optymalizacji bazy danych MySQL
Kalifornia Nauka języka SQL
Kalifornia Relacyjny model zarządzania bazami danych: wersja 2
Teksas Relacyjny model zarządzania bazami danych: wersja 2

Co teraz zwróci JOIN? W rzeczywistości nie jest możliwe dołączenie do tych trzech stołów. Oznacza to, że nie było możliwe zdekomponowanie lokalizacji książki franczyzobiorcy bez utraty danych, dlatego tabela już spełnia 5NF.

CJ Date twierdzi, że tylko baza danych w 5NF jest naprawdę „znormalizowana”.

Satysfakcjonujący DKNFEdit

Spójrzmy na tabelę Book z poprzednich przykładów i zobaczmy, czy spełnia ona normalną formę klucza domeny:

Logicznie rzecz biorąc, grubość jest określana przez liczbę stron. Oznacza to, że zależy to od stron, które nie są kluczem. Podajmy przykładową konwencję mówiącą, że książka do 350 stron jest uważana za „cienką”, a książka zawierająca ponad 350 stron jest uważana za „grubą”.

Ta konwencja jest technicznym ograniczeniem, ale nie jest to ani dziedzina ani kluczowym, dlatego nie możemy polegać na ograniczeniach domenowych i kluczowych, aby zachować integralność danych.

Innymi słowy – nic nie stoi na przeszkodzie, aby na przykład umieścić „gruby” dla książki zawierającej tylko 50 stron – a to powoduje, że tabela narusza DKNF.

Aby rozwiązać ten problem, możemy utworzyć tabelę zawierającą wyliczenie, które definiuje Grubość i usunąć tę kolumnę z oryginalnej tabeli:

Książka
Tytuł Strony Grubość Genre ID Publisher ID
Rozpoczęcie projektowania i optymalizacji bazy danych MySQL 520 Gruby 1 1
Relacyjny model zarządzania bazami danych: wersja 2 538 Gruby 2 2
Nauka SQL 338 Slim 1 3
SQL Cookbook 636 Gruby 1 3
Grubość Wyliczenie
Grubość Min. Stron Maksymalna liczba stron
Slim 1 350
Gruby 351 999 999 999 999
Książka – Strony – Gatunek – Wydawca
Tytuł Strony Identyfikator gatunku Identyfikator wydawcy
Rozpoczęcie projektowania i optymalizacji bazy danych MySQL 520 1 1
Model relacyjny dla Zarządzanie bazą danych: wersja 2 538 2 2
Nauka SQL 338 1 3
Książka kucharska SQL 636 1 3

W ten sposób naruszenie integralności domeny zostało wyeliminowane, a tabela jest w DKNF.

Satysfakcjonujący 6NFEdit

Prosta i intuicyjna definicja szóstej postaci normalnej jest taka, że „tabela znajduje się w 6NF, gdy wiersz zawiera klucz podstawowy i co najwyżej jeden inny atrybut”.

Oznacza to na przykład, że tabela wydawcy zaprojektowana podczas tworzenia 1NF

Wydawca
Identyfikator_ wydawcy Nazwa Kraj
1 Apress USA

musi być dalej zdekomponowany na dwie tabele:

Wydawca
Identyfikator_ wydawcy Nazwa
1 Apress
Kraj wydawcy
Identyfikator_ wydawcy Kraj
1 USA

Oczywistą wadą 6NF jest mnożenie się tabel wymaganych do przedstawienia informacji o pojedynczej jednostce. Jeśli tabela w 5NF ma jedną kolumnę klucza podstawowego i N atrybutów, reprezentowanie tych samych informacji w 6NF będzie wymagało N tabel; aktualizacje wielu pól w jednym rekordzie koncepcyjnym będą wymagały aktualizacji wielu tabel; a wstawianie i usuwanie podobnie będzie wymagało operacji na wielu tabelach. Z tego powodu w bazach danych przeznaczonych na potrzeby przetwarzania transakcji online 6NF nie powinno być używane.

Jednak w hurtowniach danych, które nie pozwalają na interaktywne aktualizacje i które są wyspecjalizowane do szybkiego wyszukiwania dużych ilości danych , niektóre DBMS używają wewnętrznej reprezentacji 6NF – znanej jako kolumna składnicy danych. W sytuacjach, gdy liczba unikatowych wartości w kolumnie jest znacznie mniejsza niż liczba wierszy w tabeli, magazyn zorientowany na kolumny umożliwia znaczne oszczędności miejsca dzięki kompresji danych. Magazyn kolumnowy umożliwia również szybkie wykonywanie zapytań o zakres (np. Pokazanie wszystkich rekordów, w których dana kolumna znajduje się między X a Y lub mniej niż X).

Jednak we wszystkich tych przypadkach projektant bazy danych nie trzeba ręcznie przeprowadzić normalizację 6NF, tworząc oddzielne tabele. Niektóre systemy DBMS, które specjalizują się w magazynowaniu, takie jak Sybase IQ, domyślnie używają pamięci kolumnowej, ale projektant nadal widzi tylko jedną tabelę wielokolumnową. Inne systemy DBMS, takie jak Microsoft SQL Server 2012 i nowsze, pozwalają określić „indeks magazynu kolumn” dla konkretnej tabeli.

Write a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *