Przykłady normalizacji i denormalizacji
Normalizacja to proces podziału tabel na mniejsze, powiązane części, aby usunąć duplikaty i poprawić spójność danych. Denormalizacja to odwrotny proces – łączenie tabel w celu szybszego dostępu do danych, nawet jeśli oznacza to powtarzanie tych samych informacji.
Przykład 1: Normalizacja (1NF, 2NF, 3NF)
Przed normalizacją
Wyobraźmy sobie, że mamy tabelę Zamowienia
, która zawiera informacje o zamówieniach, produktach i klientach. Tabela wygląda tak:
id_zamowienia | nazwa_klienta | adres_klienta | produkt | ilosc | cena |
---|---|---|---|---|---|
1 | Jan Kowalski | Ul. Prosta 5 | Laptop | 1 | 3000 |
1 | Jan Kowalski | Ul. Prosta 5 | Myszka | 2 | 50 |
2 | Anna Nowak | Ul. Zielona 7 | Klawiatura | 1 | 150 |
W tej tabeli mamy dane klientów, zamówień i produktów. Widzimy, że informacje o kliencie Jan Kowalski
powtarzają się, co prowadzi do powielania danych. W przypadku wielu zamówień takie powtórzenia mogą zajmować dużo miejsca i prowadzić do problemów ze spójnością.
Po normalizacji (1NF, 2NF, 3NF)
Po normalizacji tabela Zamowienia
została podzielona na kilka mniejszych, bardziej wyspecjalizowanych tabel:
Tabela Klienci
:
id_klienta | nazwa_klienta | adres_klienta |
1 | Jan Kowalski | Ul. Prosta 5 |
2 | Anna Nowak | Ul. Zielona 7 |
Tabela Zamowienia
:
id_zamowienia | id_klienta | data_zamowienia |
1 | 1 | 2023-01-15 |
2 | 2 | 2023-01-16 |
Tabela Produkty
:
id_produktu | nazwa_produktu | cena |
101 | Laptop | 3000 |
102 | Myszka | 50 |
103 | Klawiatura | 150 |
Tabela Zamowienia_Produkty
:
id_zamowienia | id_produktu | ilosc |
1 | 101 | 1 |
1 | 102 | 2 |
2 | 103 | 1 |
Dzięki normalizacji zmniejszyliśmy powtarzanie danych. Informacje o klientach i produktach są teraz przechowywane tylko raz, a każda tabela odpowiada za konkretny rodzaj danych.
Przykład 2: Denormalizacja
Czasami denormalizacja może być korzystna. Na przykład wtedy, gdy chcemy szybciej uzyskać dostęp do danych, zamiast wykonywać wiele połączeń (JOIN
) między tabelami.
Przed denormalizacją
W przypadku znormalizowanej bazy danych, aby uzyskać informacje o zamówieniu, musimy połączyć dane z wielu tabel, takich jak Zamowienia
, Klienci
, Produkty
i Zamowienia_Produkty
. Może to być czasochłonne, szczególnie jeśli mamy dużą liczbę zapytań.
Po denormalizacji
W wyniku denormalizacji możemy stworzyć jedną dużą tabelę Zamowienia_Szczegoly
, aby przyspieszyć dostęp do danych:
Tabela Zamowienia_Szczegoly
:
id_zamowienia | nazwa_klienta | adres_klienta | nazwa_produktu | ilosc | cena |
1 | Jan Kowalski | Ul. Prosta 5 | Laptop | 1 | 3000 |
1 | Jan Kowalski | Ul. Prosta 5 | Myszka | 2 | 50 |
2 | Anna Nowak | Ul. Zielona 7 | Klawiatura | 1 | 150 |
W tej tabeli mamy wszystkie dane dotyczące zamówień, klientów i produktów w jednym miejscu. Dzięki temu dostęp do danych jest szybszy, ponieważ nie musimy łączyć kilku tabel. Jednak kosztem tego jest większe powtarzanie danych – informacje o klientach powtarzają się przy każdym zamówieniu.
Kiedy normalizować, a kiedy denormalizować?
- Normalizacja jest najlepsza, kiedy chcemy mieć spójne dane i unikać powtarzania informacji. Jest to szczególnie przydatne, gdy dane często się zmieniają, ponieważ zmniejsza ryzyko wystąpienia niezgodności.
- Denormalizacja sprawdza się, gdy zależy nam na szybkim dostępie do danych, a niekoniecznie na minimalizacji powtórzeń. Często stosuje się ją w hurtowniach danych, gdzie dane częściej są odczytywane niż modyfikowane.