Normalizacja do postaci 3NF
Pierwsza, druga i trzecia postać normalna oraz anomalie, które eliminują.
Normalizacja do postaci 3NF to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Dlaczego podczas rozmów kwalifikacyjnych pytają o normalizację
Normalizacja to podstawowa zasada modelowania baz danych, a osoby prowadzące rozmowę wykorzystują ją, aby sprawdzić, czy rozumieją Państwo integralność danych na poziomie projektu. Pytanie często brzmi: „Czym jest normalizacja i dlaczego ma znaczenie?”
Normalizacja to proces organizowania kolumn i tabel w celu ograniczenia redundancji oraz zapobiegania anomaliom aktualizacji, wstawiania i usuwania. Każda kolejna postać normalna (1NF, 2NF, 3NF) wprowadza bardziej rygorystyczną regułę.
Dobra odpowiedź wymienia anomalie usuwane przez normalizację, a nie tylko podaje definicje z podręcznika.
Trzy anomalie
Zanim przejdą Państwo do postaci normalnych, należy poznać problemy, które te postacie rozwiązują. Źle zaprojektowana tabela przechowująca wszystko w jednym miejscu cierpi z powodu trzech anomalii:
- Anomalia aktualizacji: ten sam fakt jest przechowywany w wielu wierszach, więc zmiana musi objąć wszystkie te wiersze, w przeciwnym razie dane stają się niespójne.
- Anomalia wstawiania: nie można dodać pewnego faktu bez podania niezwiązanych danych (np. nie można dodać produktu bez zamówienia).
- Anomalia usuwania: usunięcie jednego wiersza przypadkowo usuwa inny, niezależny fakt.
Jeśli potrafią Państwo rozpoznać te anomalie w przykładowej tabeli, będą Państwo w stanie uzasadnić każdy krok normalizacji.
Wyjściowa tabela bez normalizacji
Oto klasyczny przykład z rozmowy kwalifikacyjnej: jedna szeroka tabela łącząca zamówienia, klientów i produkty. Proszę zwrócić uwagę na powtarzający się adres e-mail klienta i cenę produktu w wielu wierszach. Właśnie tutaj występują anomalie.
Państwa zadaniem podczas rozmowy jest doprowadzenie tej tabeli do 3NF i wyjaśnienie każdego podziału.
-- Unnormalized: everything in one table
CREATE TABLE orders_flat (
order_id INT,
customer_id INT,
customer_email VARCHAR(255),
product_id INT,
product_name VARCHAR(100),
unit_price DECIMAL(10,2),
quantity INT
);Pierwsza postać normalna (1NF)
1NF wymaga, aby każda kolumna zawierała pojedynczą atomową wartość oraz aby w komórkach nie było powtarzających się grup ani tablic.
Tabela narusza 1NF, jeśli kolumna przechowuje listę rozdzieloną przecinkami, taką jak 'phone1, phone2', albo jeśli istnieją kolumny product1, product2, product3.
Rozwiązanie: każdą wartość należy umieścić w osobnym wierszu. Osoba prowadząca rozmowę chce usłyszeć: „wartości atomowe, brak powtarzających się grup oraz klucz identyfikujący każdy wiersz”.
-- Violates 1NF: a list inside one column
-- phones = '555-1111, 555-2222'
-- 1NF fix: one phone per row
CREATE TABLE customer_phone (
customer_id INT,
phone VARCHAR(20),
PRIMARY KEY (customer_id, phone)
);Zależności funkcyjne
Aby wyjaśnić 2NF i 3NF, należy użyć terminu zależność funkcyjna. Zapis A -> B oznacza „A wyznacza B”: dla każdej wartości A istnieje dokładnie jedna wartość B.
W naszej tabeli zamówień:
customer_id -> customer_emailproduct_id -> product_name, unit_priceorder_id, product_id -> quantity
W istocie normalizacja polega na upewnieniu się, że każda kolumna niekluczowa zależy od całego klucza i tylko od klucza.
Druga postać normalna (2NF)
2NF ma zastosowanie, gdy klucz główny jest złożony. Zabrania, aby kolumna niekluczowa zależała tylko od części klucza, czyli aby występowała zależność częściowa.
Klucz pozycji zamówienia ma postać (order_id, product_id). Jednak product_name i unit_price zależą tylko od product_id, a nie od całego klucza. Jest to zależność częściowa, która narusza 2NF.
Rozwiązanie: należy przenieść atrybuty produktu do tabeli products, której kluczem jest product_id.
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
unit_price DECIMAL(10,2)
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);Trzecia postać normalna (3NF)
3NF usuwa zależności przechodnie: sytuacje, w których kolumna niekluczowa zależy od innej kolumny niekluczowej zamiast bezpośrednio od klucza.
Załóżmy, że tabela orders zawiera customer_id oraz customer_email. Występuje tu zależność order_id -> customer_id -> customer_email. Adres e-mail zależy od klucza tylko za pośrednictwem customer_id, co stanowi zależność przechodnią.
Rozwiązanie: należy przenieść klientów do osobnej tabeli. Wtedy niekluczowe kolumny każdej tabeli zależą wyłącznie od jej klucza.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_email VARCHAR(255)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);Jednozdaniowa reguła do zapamiętania
Osoby prowadzące rozmowę cenią kandydatów, którzy potrafią podsumować 3NF w jednym zdaniu. Klasyczne sformułowanie brzmi:
„Każda kolumna niekluczowa musi zależeć od klucza, całego klucza i tylko od klucza.”
- Klucz -> 1NF (istnieje klucz, wartości atomowe).
- Cały klucz -> 2NF (brak zależności częściowej).
- Tylko klucz -> 3NF (brak zależności przechodniej).
Ta jedna linijka pozwala odtworzyć wszystkie trzy postacie na żądanie.
BCNF: pytanie uzupełniające
Dociekliwa osoba prowadząca rozmowę może zapytać o postać normalną Boyce’a-Codda (BCNF), czyli bardziej restrykcyjną wersję 3NF.
BCNF wymaga, aby dla każdej zależności funkcyjnej X -> Y wartość X była nadkluczem. 3NF dopuszcza rzadki wyjątek, gdy atrybut zależny jest częścią klucza kandydującego; BCNF usuwa nawet ten wyjątek.
Naruszenia BCNF nie zdarzają się często w praktyce, ale wymienienie jej i stwierdzenie „BCNF to 3NF bez wyjątków dotyczących atrybutów kluczowych” świadczy o pogłębionej wiedzy.
Kiedy NIE normalizować
Odpowiedź na poziomie seniora uwzględnia kompromis. Normalizacja poprawia integralność, ale może pogorszyć wydajność odczytu, ponieważ udzielenie odpowiedzi na zapytanie wymaga większej liczby złączeń.
Celowa denormalizacja jest uzasadniona, gdy:
- Obciążenie jest zdominowane przez odczyty, a złączenia są wąskim gardłem.
- Tworzą Państwo warstwę analityczno-raportową (schematy gwiazdy, omówione w dalszej części).
- Mogą Państwo utrzymać nadmiarową kopię w synchronizacji (wyzwalacze, ETL, widoki zmaterializowane).
Można powiedzieć: „Normalizować należy dla integralności OLTP, a denormalizować celowo dla szybkości odczytu OLAP.”
Analiza przy tablicy
Połączmy wszystko. Podczas rozmowy na żywo, gdy otrzymają Państwo nieuporządkowaną tabelę:
- Określić klucz kandydujący i wypisać zależności funkcyjne.
- Sprawdzić atomowość i powtarzające się grupy (1NF).
- Jeśli klucz jest złożony, sprawdzić zależności częściowe (2NF).
- Sprawdzić zależności między kolumnami niekluczowymi (3NF).
- Narysować wynikowe tabele z kluczami głównymi i obcymi.
Objaśnianie tych kroków na głos jest dokładnie tym, co ocenia osoba prowadząca rozmowę.
Szybki test
Proszę sprawdzić, czy rozumieją Państwo postacie normalne.
Podsumowanie: normalizacja do 3NF
Mogą już Państwo kompleksowo odpowiedzieć na standardowe pytanie dotyczące normalizacji:
- Normalizacja usuwa anomalię aktualizacji, wstawiania i usuwania, ograniczając redundancję.
- 1NF: wartości atomowe, brak powtarzających się grup.
- 2NF: brak zależności częściowej od klucza złożonego.
- 3NF: brak zależności przechodniej, czyli zależności między kolumnami niekluczowymi.
- Podsumowanie: „klucz, cały klucz i tylko klucz”.
- BCNF zaostrza wymagania 3NF; należy celowo denormalizować na potrzeby analityki zdominowanej przez odczyty.
Często zadawane pytania
Czy lekcja „Normalizacja do postaci 3NF” jest bezpłatna?
Tak — pełny tekst „Normalizacja do postaci 3NF” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „Normalizacja do postaci 3NF”?
Pierwsza, druga i trzecia postać normalna oraz anomalie, które eliminują. Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Normalizacja do postaci 3NF”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?
Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Normalizacja do postaci 3NF
- Modelowanie ER i krotność relacji
- Schemat gwiazdy i projektowanie hurtowni danych
- Pełny zestaw zadań do próbnej rozmowy rekrutacyjnej