Trzecia postać normalna (3NF) to krok w stronę jeszcze większego porządku w naszych danych. W skrócie, tabela jest w 3NF, jeśli:
- Jest już w drugiej postaci normalnej (2NF).
- Wszystkie atrybuty niebędące kluczami zależą tylko od klucza głównego i od niczego innego (żadnych zależności przechodnich!).
Innymi słowy, 3NF wymaga, żeby wszystkie dane w tabeli były bezpośrednio powiązane z jej kluczem głównym i nie zależały od innych niekluczowych atrybutów.
Zależność przechodnia pojawia się, jeśli atrybut A zależy od atrybutu B, a atrybut B zależy od atrybutu C, co tworzy łańcuch zależności A → B → C. Na przykład, „Pracownik” zależy od „Działu”, a „Dział” zależy od „Lokalizacji”. Wychodzi na to, że „Pracownik” przechodnio zależy od „Lokalizacji”.
Przykład naruszenia 3NF
Załóżmy, że mamy tabelę employees, która przechowuje dane o pracownikach:
| employee_id | name | department | department_manager |
|---|---|---|---|
| 1 | Otto Lin | Marketing | Leo Zhang |
| 2 | Alex Song | Finance | Maria Chi |
| 3 | Anna Ming | Finance | Maria Chi |
Tutaj:
employee_id— klucz główny.departmentidepartment_manager— atrybuty niebędące kluczami.
Na pierwszy rzut oka wszystko wygląda spoko, ale jak się przyjrzymy, to widać problem: department_manager zależy nie od employee_id, tylko od department. W ten sposób powstaje zależność przechodnia: employee_id → department → department_manager.
Problemy, które mogą się pojawić
Jeśli zmienimy imię szefa działu („Finanse”), będziemy musieli zaktualizować wszystkie wiersze, gdzie ten dział jest wpisany. Jeśli przypadkiem zapomnimy o którymś wierszu, dane staną się niespójne. To ból głowy, którego można uniknąć.
Sprowadzenie tabeli do 3NF
Żeby pozbyć się zależności przechodnich, rozdzielimy tabelę na dwie: jedna będzie przechowywać dane o pracownikach, a druga — o działach.
Tablica employees
| employee_id | name | department |
|---|---|---|
| 1 | Otto Lin | Marketing |
| 2 | Alex Song | Finanse |
| 3 | Anna Ming | Finanse |
Tablica departments
| department | department_manager |
|---|---|
| Marketing | Leo Zhang |
| Finanse | Maria Chi |
Teraz wszystko jest poukładane i każda tabela robi swoje:
- Tablica
employeesprzechowuje dane o pracownikach. - Tablica
departmentsprzechowuje dane o działach i ich menedżerach.
Jeśli menedżer działu się zmieni, wystarczy zaktualizować tylko jeden wiersz w tabeli departments, a nie wszystkie rekordy pracowników.
Jak rozpoznać, że tabela łamie 3NF?
Żeby sprawdzić, czy tabela łamie 3NF, zobacz:
- Czy są w tabeli zależności przechodnie? Na przykład, atrybut A zależy od atrybutu B, który zależy od atrybutu C.
- Czy wszystkie atrybuty niebędące kluczami zależą bezpośrednio od klucza głównego? Jeśli coś zależy od innego niekluczowego atrybutu, to tabela nie jest w 3NF.
Praktyczny przykład: sklep
Spójrzmy na tabelę sales, która zawiera dane o sprzedaży:
| sale_id | product_name | product_price | customer_name |
|---|---|---|---|
| 1 | Telefon | 20 000 | Otto Lin |
| 2 | Laptop | 50 000 | Alex Song |
| 3 | Telefon | 20 000 | Anna Ming |
Tu wyraźnie widać nadmiarowość: informacja o cenie produktu powtarza się przy każdej sprzedaży. Jeśli cena się zmieni, dane od razu tracą spójność.
Żeby naprawić naruszenie 3NF, rozdzielimy tabelę na dwie:
- Tablica
salesbędzie przechowywać informacje o sprzedaży. - Tablica
products— dane o produktach i ich cenach.
Tablica sales
| sale_id | product_id | customer_name |
|---|---|---|
| 1 | 1 | Otto Lin |
| 2 | 2 | Alex Song |
| 3 | 1 | Anna Ming |
Tablica products
| product_id | product_name | product_price |
|---|---|---|
| 1 | Telefon | 20 000 |
| 2 | Laptop | 50 000 |
Teraz, jeśli cena produktu się zmieni, wystarczy zaktualizować jeden wiersz w tabeli products i dane pozostają spójne.
Zadanie praktyczne
Masz zadanko: masz tabelę students_courses w takim układzie:
| student_id | student_name | course_name | teacher_name |
|---|---|---|---|
| 1 | Otto Lin | Matematyka | Maria Chi |
| 2 | Alex Song | Programowanie | Leo Zhang |
| 1 | Otto Lin | Programowanie | Leo Zhang |
Podziel tabelę tak, żeby była zgodna z 3NF. Podpowiedź: musisz stworzyć trzy tabele (students, courses, teachers) i dobrze je połączyć.
Dlaczego warto trzymać się 3NF?
Po co w ogóle bawić się w trzecią postać normalną (3NF)? Bo to serio ułatwia życie. Jak tabele są w 3NF, dane są schludniejsze — żadnych zbędnych duplikatów, więc mniejsze ryzyko, że coś przypadkiem popsujesz. Aktualizacje są szybsze i prostsze, bo wszystko trzymasz w jednym miejscu, a nie kopiujesz po wszystkich wierszach.
Do tego struktura bazy jest bardziej elastyczna. Chcesz dodać nowe pole albo zmienić stare — nie musisz przebudowywać całego systemu.
Ale, jak to w życiu, jest haczyk: zbyt gorliwa normalizacja może skończyć się masą małych tabel i skomplikowanymi zapytaniami z mnóstwem JOIN-ów. Czasem to naprawdę może spowalniać. Więc najważniejsze to mieć wyczucie. Tam, gdzie trzeba — normalizuj, a gdzie lepiej zostawić trochę nadmiarowości — nie bój się.
Dalej będziemy wchodzić głębiej: nauczymy się dobrze budować relacje między tabelami i tworzyć bazy, które są i wygodne, i niezawodne. Do dzieła, po świetny design bazy danych!
GO TO FULL VERSION