Tablica jest w drugiej postaci normalnej, jeśli:
- Jest już w pierwszej postaci normalnej (1NF).
- Każda niekluczowa kolumna zależy od całego klucza głównego, a nie tylko od jego części.
Jeśli klucz główny składa się z kilku pól (klucz złożony), to żaden z niekluczowych atrybutów (kolumn) nie powinien zależeć tylko od jednej części tego klucza. Innymi słowy, 2NF eliminuje częściowe zależności.
Przykład naruszenia 2NF
Załóżmy, że mamy tabelę student_courses (Studenci i Kursy), która przechowuje info o studentach, ich kursach i prowadzących:
| student_id | course_id | course_name | instructor_name |
|---|---|---|---|
| 1 | 101 | Matematyka | Lin |
| 1 | 102 | Literatura | Song |
| 2 | 101 | Matematyka | Lin |
student_idicourse_idrazem tworzą klucz główny złożony.- Ale zwróć uwagę na kolumny
course_nameiinstructor_name. One zależą tylko odcourse_id, a nie od całej pary (student_id,course_id).
I tu właśnie mamy częściową zależność! course_name i instructor_name zależą tylko od części klucza złożonego (course_id). To narusza zasady 2NF.
Sprowadzenie tabeli do 2NF
Naszym zadaniem jest wyeliminować częściową zależność, dzieląc tabelę na dwie. Dzięki temu pozbędziemy się nadmiarowości i poprawimy spójność danych.
Wydzielmy info o kursach do osobnej tabeli courses:
| course_id | course_name | instructor_name |
|---|---|---|
| 101 | Matematyka | Lin |
| 102 | Literatura | Song |
Główną tabelę sprowadzamy do takiej postaci:
| student_id | course_id |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
Teraz każda kolumna zależy od całego klucza głównego. Podzieliliśmy dane tak, żeby wszystko było logicznie powiązane i usunęliśmy naruszenie 2NF.
Magia eliminacji nadmiarowości
Zwróć uwagę na tabelę przed normalizacją. W kolumnie instructor_name powtarza się imię "Lin". A ile takich powtórzeń może być w prawdziwej bazie z tysiącami rekordów? Dzięki podziałowi tabel pozbyliśmy się nadmiarowości i zmniejszyliśmy ryzyko błędów, np. literówek ("Lin" vs "Ling").
Przykład z życia
Wyobraź sobie, że prowadzisz ewidencję zamówień na produkty. Masz taką tabelę order_items (zamówienia i produkty), gdzie order_id i item_id tworzą klucz główny:
| order_id | item_id | item_name | price |
|---|---|---|---|
| 1 | 101 | Laptop | 50000 |
| 1 | 102 | Mysz | 1000 |
| 2 | 101 | Laptop | 50000 |
Jak widzisz, ceny i nazwy produktów się powtarzają. To znak naruszenia 2NF, bo item_name i price zależą tylko od item_id.
Żeby sprowadzić tabelę do 2NF, tworzymy tabelę items:
| item_id | item_name | price |
|---|---|---|
| 101 | Laptop | 50000 |
| 102 | Mysz | 1000 |
I zmieniamy tabelę order_items, zostawiając tylko identyfikatory zamówienia i produktu:
| order_id | item_id |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
Teraz dane są czyste jak kod po code review — żadnej nadmiarowości.
Zadanie praktyczne: spróbuj sam!
Załóżmy, że masz tabelę employee_projects, która zawiera info o pracownikach, ich projektach i menedżerach projektów:
| employee_id | project_id | project_name | manager_name |
|---|---|---|---|
| 1 | 201 | CRM Upgrade | Lin |
| 2 | 202 | Website Revamp | Ming |
| 1 | 202 | Website Revamp | Ming |
Spróbuj:
- Znajdź zależności, które łamią wymagania 2NF.
- Podziel tabelę na dwie, eliminując naruszenie.
Dlaczego warto trzymać się 2NF?
Po co w ogóle trzymać się drugiej postaci normalnej (2NF)? Proste: żeby dane się nie powielały i nie robiły bałaganu. Kiedy usuwasz częściowe zależności, tabele są czystsze — bez powtarzających się informacji, jak to samo imię prowadzącego w każdej linii. To oszczędza miejsce i eliminuje ryzyko niespójności: zmieniasz imię w jednym miejscu — i wszędzie jest aktualne.
Poza tym, zapytania do takiej bazy pisze się łatwiej: jak struktura jest logiczna i dane nie są rozrzucone po tysiącu wierszy, filtrowanie i grupowanie działa szybciej i pewniej. Jasne, za to płacisz trochę bardziej złożonymi zapytaniami SQL z JOIN-ami, bo tabel jest więcej. Ale lepiej jeden JOIN niż sto wierszy z tymi samymi nazwiskami. W większości przypadków normalizacja się opłaca.
Integracja z prawdziwymi projektami
Znajomość 2NF przyda ci się:
- Przy projektowaniu bazy danych: żeby uniknąć chaosu w tabelach.
- Na rozmowie kwalifikacyjnej: często proszą, żeby wyjaśnić albo sprowadzić tabele do postaci normalnej.
- W prawdziwej pracy: kiedy dostaniesz zadanie optymalizacji istniejącej bazy, dzieląc "monolityczne" tabele na znormalizowane.
Druga postać normalna (2NF) pomaga wyeliminować częściowe zależności w tabeli, gdzie klucz główny jest złożony. Dzielimy tabele na logiczne bloki, żeby każda kolumna zależała tylko od całego klucza, a nie od jego części. To poprawia jakość bazy, eliminuje nadmiarowość i zwiększa jej elastyczność. Gotowy na trzecią postać normalną? Lecimy dalej!
GO TO FULL VERSION