Третя нормальна форма (3NF) — це крок до ще більшого порядку в наших даних. Коротко, таблиця знаходиться у 3NF, якщо:
- Вона вже знаходиться у другій нормальній формі (2NF).
- Всі неключові атрибути залежать тільки від первинного ключа і ні від чого іншого (жодних транзитивних залежностей!).
Іншими словами, 3NF вимагає, щоб всі дані в таблиці були напряму пов’язані з її первинним ключем і не залежали від інших неключових атрибутів.
Транзитивна залежність виникає, якщо атрибут А залежить від атрибута В, а атрибут В залежить від атрибута С, що створює ланцюжок залежностей А → В → С. Наприклад, «Співробітник» залежить від «Відділу», а «Відділ» залежить від «Розташування». Виходить, що «Співробітник» транзитивно залежить від «Розташування».
Приклад порушення 3NF
Уявімо, що у нас є таблиця employees, яка зберігає дані про співробітників:
| employee_id | name | department | department_manager |
|---|---|---|---|
| 1 | Otto Lin | Marketing | Leo Zhang |
| 2 | Alex Song | Finance | Maria Chi |
| 3 | Anna Ming | Finance | Maria Chi |
Тут:
employee_id— первинний ключ.departmentіdepartment_manager— неключові атрибути.
На перший погляд все виглядає ок, але якщо придивитися, то видно проблему: department_manager залежить не від employee_id, а від department. Таким чином, виникає транзитивна залежність: employee_id → department → department_manager.
Проблеми, які можуть виникнути
Якщо ми змінимо ім’я директора департаменту («Фінанси»), доведеться оновлювати всі рядки, де вказаний цей департамент. Якщо випадково забути оновити якийсь рядок, дані стануть неузгодженими. Це головний біль, якого можна уникнути.
Приведення таблиці до 3NF
Щоб прибрати транзитивні залежності, розділимо таблицю на дві: одна буде зберігати дані про співробітників, а інша — про департаменти.
Таблиця employees
| employee_id | name | department |
|---|---|---|
| 1 | Otto Lin | Маркетинг |
| 2 | Alex Song | Фінанси |
| 3 | Anna Ming | Фінанси |
Таблиця departments
| department | department_manager |
|---|---|
| Маркетинг | Leo Zhang |
| Фінанси | Maria Chi |
Тепер все структуровано, і кожна таблиця займається своїм:
- Таблиця
employeesзберігає дані про співробітників. - Таблиця
departmentsзберігає дані про департаменти та їх менеджерів.
Якщо менеджер департаменту зміниться, треба буде оновити лише один рядок у таблиці departments, а не у всіх записах співробітників.
Як визначити, що таблиця порушує 3NF?
Щоб зрозуміти, що таблиця порушує 3NF, перевір:
- Чи є в таблиці транзитивні залежності? Наприклад, атрибут A залежить від атрибута B, який залежить від атрибута C.
- Чи всі неключові атрибути напряму залежать від первинного ключа? Якщо щось залежить від іншого неключового атрибута, то таблиця не у 3NF.
Практичний приклад: магазин
Розглянемо таблицю sales, яка містить дані про продажі:
| sale_id | product_name | product_price | customer_name |
|---|---|---|---|
| 1 | Телефон | 20 000 | Otto Lin |
| 2 | Ноутбук | 50 000 | Alex Song |
| 3 | Телефон | 20 000 | Anna Ming |
Тут явно видно надлишковість: інформація про ціну товару повторюється для кожного продажу. Якщо ціна зміниться, дані одразу стають неузгодженими.
Щоб прибрати порушення 3NF, розділимо таблицю на дві:
- Таблиця
salesбуде зберігати відомості про продажі. - Таблиця
products— дані про товари та їх ціни.
Таблиця sales
| sale_id | product_id | customer_name |
|---|---|---|
| 1 | 1 | Otto Lin |
| 2 | 2 | Alex Song |
| 3 | 1 | Anna Ming |
Таблиця products
| product_id | product_name | product_price |
|---|---|---|
| 1 | Телефон | 20 000 |
| 2 | Ноутбук | 50 000 |
Тепер, якщо ціна товару зміниться, просто оновлюємо один рядок у таблиці products, і дані залишаються узгодженими.
Практичне завдання
Ось тобі задачка: у тебе є таблиця students_courses такого вигляду:
| student_id | student_name | course_name | teacher_name |
|---|---|---|---|
| 1 | Otto Lin | Математика | Maria Chi |
| 2 | Alex Song | Програмування | Leo Zhang |
| 1 | Otto Lin | Програмування | Leo Zhang |
Розділи таблицю так, щоб вона відповідала 3NF. Підказка: треба створити три таблиці (students, courses, teachers) і правильно їх зв’язати.
Чому важливо дотримуватись 3NF?
Чому взагалі варто заморочуватись з третьою нормальною формою (3NF)? Бо вона реально спрощує життя. Коли таблиці приведені до 3NF, дані стають акуратнішими — жодного зайвого дублювання, а значить, менше шансів щось випадково зламати. Оновлення проходять швидше й простіше, бо все зберігається в одному місці, а не копіпаститься по всіх рядках.
До того ж структура бази стає гнучкішою. Хочеш додати нове поле чи змінити старе — не треба перекроювати всю систему.
Але, як і в будь-якій хорошій історії, є нюанс: занадто завзята нормалізація може вилитись у купу дрібних таблиць і складні запити з купою JOIN’ів. Іноді це дійсно може гальмувати. Тому головне — відчуття міри. Де треба — нормалізуй, а де простіше залишити трохи надлишковості — не бійся.
Далі будемо розбиратись глибше: навчимось правильно будувати зв’язки між таблицями і створювати бази, які і зручні, і надійні. Вперед, до крутого дизайну бази даних!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ