CodeGym /Kursy /SQL SELF /Zalety i wady normalizacji

Zalety i wady normalizacji

SQL SELF
Poziom 26, Lekcja 4
Dostępny

Dzisiaj jeszcze raz, ale tym razem bardziej szczegółowo, zatrzymamy się na ważnym temacie: zalety i wady normalizacji, żebyś lepiej ogarnął, jak te koncepcje działają w realnym świecie. No to zapinaj pasy — zaczynamy!

Usuwanie nadmiarowości danych

Kiedy dane w tabeli nie są znormalizowane, możesz zauważyć, że te same informacje powtarzają się w różnych wierszach. Na przykład w tabeli z zamówieniami może być powtarzający się adres klienta dla każdego zamówienia. Normalizacja eliminuje takie duplikaty, przenosząc wspólne dane do osobnych tabel.

Przykład:

-- Przed normalizacją
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_name TEXT,
    customer_address TEXT,
    order_date DATE
);

-- Po normalizacji
CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    customer_name TEXT,
    customer_address TEXT
);

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),
    order_date DATE
);

Dlaczego to ważne? Mniej zduplikowanych danych to mniejsze ryzyko błędów. Jeśli adres klienta się zmieni, musisz zaktualizować dane tylko w jednym miejscu.

Zapewnienie integralności danych

Kiedy dane są podzielone na logiczne tabele, łatwiej zarządzać ich powiązaniami. Użycie kluczy obcych pomaga automatycznie utrzymać integralność danych. Na przykład nie możesz przypadkowo usunąć klienta, do którego odnoszą się rekordy w tabeli zamówień.

Przykład:

-- Klucz obcy gwarantuje, że usunięcie klienta usunie też powiązane zamówienia
ALTER TABLE orders
ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
ON DELETE CASCADE;

Możesz być pewien, że struktura bazy danych nie dopuści do powstania "osieroconych" danych.

Ułatwienie aktualizacji

Kiedy twoja baza danych jest znormalizowana, aktualizacje są proste i mniej podatne na błędy. Wróćmy do przykładu z klientami — jeśli klient zmienia adres, aktualizujesz jego rekord tylko w jednej tabeli. W nieznormalizowanych tabelach łatwo zapomnieć o zmianie adresu w niektórych wierszach, co prowadzi do niespójności danych.

Minimalizacja anomalii

Anomalie wstawiania: w nieznormalizowanej tabeli możesz mieć sytuację, gdzie nie da się dodać rekordu bez zbędnych informacji. Na przykład nie możesz dodać zamówienia, dopóki nie znasz imienia klienta.

Anomalie aktualizacji: mogą pojawić się błędy przy aktualizacji danych. Na przykład po zmianie imienia klienta w jednym wierszu, w innym może pozostać stare.

Anomalie usuwania: usunięcie rekordu może prowadzić do utraty ważnych informacji. Na przykład usunięcie zamówienia usuwa też imię klienta, jeśli te dane są w jednej tabeli.

Zmniejszenie rozmiaru danych

Normalizacja często zmniejsza rozmiar bazy danych, bo eliminuje duplikaty. To ważne, jeśli masz do przechowania duże ilości informacji.

Wady normalizacji

1. Złożoność struktury bazy danych

Z czasem normalizacja może prowadzić do skomplikowanej struktury bazy, składającej się z tysięcy(!) powiązanych tabel. W takich przypadkach, żeby dostać dane, które kiedyś były w jednej tabeli, musisz pisać złożone zapytania SQL z wieloma połączeniami (JOIN).

Przykład złożoności:

-- Zapytanie pobierające info o zamówieniach z detalami produktów i kategorii
SELECT
    o.order_id,
    o.order_date,
    c.customer_name,
    p.product_name,
    cat.category_name,
    oi.quantity,
    oi.unit_price
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
JOIN categories cat ON p.category_id = cat.category_id;

Jeśli liczba tabel i powiązań rośnie, czas wykonania zapytań może mocno wzrosnąć.

2. Spadek wydajności przy częstych połączeniach

Częste łączenie tabel (JOIN) może być zasobożerne, szczególnie jeśli tabele są duże i nie mają indeksów. W systemach analitycznych, gdzie zapytania obrabiają miliony wierszy, normalizacja powoduje spore spadki wydajności.

3. Potrzeba dodatkowych operacji do denormalizacji

Jeśli znormalizowana struktura bazy jest używana do celów analitycznych, trzeba ją czasem tymczasowo denormalizować, żeby przyspieszyć zapytania analityczne. Może to oznaczać tworzenie widoków (VIEW) albo tabel do agregacji danych.

Przykład:

-- Denormalizowany widok do analityki
CREATE VIEW orders_with_customers AS
SELECT
    o.order_id,
    o.order_date,
    c.customer_name,
    c.customer_address
FROM
    orders o
JOIN
    customers c ON o.customer_id = c.customer_id;

4. Wysoki próg wejścia

Dla początkujących normalizacja może wydawać się trudna. Zamiast jednej tabeli ze wszystkimi danymi, trzeba pracować z wieloma tabelami i ogarniać ich powiązania. To może spowolnić development, zwłaszcza jeśli zespół nie ma dużego doświadczenia z bazami danych.

5. Czasem nadmiarowość jest spoko

W prawdziwych projektach czasem lepiej zostawić nadmiarowe dane dla lepszej wydajności. Na przykład, jeśli aplikacja często korzysta z danych, które można uzyskać tylko przez złożone połączenia, lepiej trzymać je w jednej tabeli.

2
Zadanie
SQL SELF, poziom 26, lekcja 4
Niedostępne
Tworzenie zdenormalizowanego widoku
Tworzenie zdenormalizowanego widoku
1
Ankieta/quiz
Analiza istniejących baz danych, poziom 26, lekcja 4
Niedostępny
Analiza istniejących baz danych
Analiza istniejących baz danych
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION