Таблиця вважається такою, що знаходиться у другій нормальній формі, якщо:
- Вона вже знаходиться у першій нормальній формі (1NF).
- Кожна неключова колонка залежить від усього первинного ключа, а не тільки від частини ключа.
Якщо первинний ключ складається з кількох полів (складений ключ), то жоден з неключових атрибутів (стовпців) не повинен залежати лише від однієї частини цього ключа. Іншими словами, 2NF прибирає часткові залежності.
Приклад порушення 2NF
Припустимо, у нас є таблиця student_courses (Студенти і Курси), яка зберігає інформацію про студентів, їх курси та викладачів:
| student_id | course_id | course_name | instructor_name |
|---|---|---|---|
| 1 | 101 | Математика | Lin |
| 1 | 102 | Література | Song |
| 2 | 101 | Математика | Lin |
student_idіcourse_idразом утворюють складений первинний ключ.- Але зверни увагу на колонки
course_nameіinstructor_name. Вони залежать тільки відcourse_id, а не від всієї пари (student_id,course_id).
Ось вона, часткова залежність! course_name і instructor_name залежать лише від частини складеного ключа (course_id). Це порушення принципів 2NF.
Приведення таблиці до 2NF
Наша задача — прибрати часткову залежність, розділивши таблицю на дві. Це позбавить нас надлишковості й покращить узгодженість даних.
Виділимо інформацію про курси в окрему таблицю courses:
| course_id | course_name | instructor_name |
|---|---|---|
| 101 | Математика | Lin |
| 102 | Література | Song |
Основну таблицю зведемо до такого вигляду:
| student_id | course_id |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
Тепер кожна колонка залежить від усього первинного ключа. Ми розділили дані так, щоб вся інформація була логічно пов’язана, і прибрали порушення 2NF.
Магія усунення надлишковості
Зверни увагу на таблицю до нормалізації. У колонці instructor_name повторюється ім’я "Lin". А скільки таких повторів може бути у реальній базі з тисячами записів? Розділивши таблиці, ми прибрали надлишковість і зменшили ймовірність помилок, наприклад, опечаток ("Lin" vs "Ling").
Приклад з життя
Уяви, що ти ведеш облік замовлень на товари. У тебе є така таблиця order_items (замовлення і товари), де order_id і item_id складають первинний ключ:
| order_id | item_id | item_name | price |
|---|---|---|---|
| 1 | 101 | Лептоп | 50000 |
| 1 | 102 | Миша | 1000 |
| 2 | 101 | Лептоп | 50000 |
Як бачиш, ціни й назви товарів повторюються. Це ознака порушення 2NF, бо item_name і price залежать тільки від item_id.
Щоб привести таблицю до 2NF, створимо таблицю items:
| item_id | item_name | price |
|---|---|---|
| 101 | Лептоп | 50000 |
| 102 | Миша | 1000 |
І змінимо таблицю order_items, залишивши тільки ідентифікатори замовлення і товару:
| order_id | item_id |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
Тепер дані чисті, як код після рев’ю — жодної надлишковості.
Практичне завдання: спробуй сам!
Нехай у тебе є таблиця employee_projects, що містить інформацію про співробітників, їх проекти та менеджерів проектів:
| employee_id | project_id | project_name | manager_name |
|---|---|---|---|
| 1 | 201 | CRM Upgrade | Lin |
| 2 | 202 | Website Revamp | Ming |
| 1 | 202 | Website Revamp | Ming |
Спробуй:
- Знайти залежності, які порушують вимоги 2NF.
- Розділити таблицю на дві, прибравши порушення.
Чому важливо дотримуватись 2NF?
Навіщо взагалі дотримуватись другої нормальної форми (2NF)? Все просто: щоб дані не дублювались і не створювали плутанину. Коли ти прибираєш часткові залежності, таблиці стають чистішими — без повторюваної інформації, типу одного й того ж імені викладача в кожному рядку. Це економить місце і позбавляє ризику неузгодженостей: оновив ім’я в одному місці — і все одразу актуально.
До того ж, запити до такої бази писати простіше: коли структура логічна і дані не розмазано по купі рядків, фільтрація і групування працюють швидше й надійніше. Так, за це доведеться платити трохи складнішими SQL-запитами з JOIN-ами, бо таблиць стає більше. Але все ж краще один JOIN, ніж сто рядків з одними й тими ж прізвищами. У більшості випадків нормалізація того варта.
Інтеграція з реальними проектами
Знання 2NF стане у пригоді тобі:
- Під час проєктування бази даних: допомагаючи уникнути хаосу в таблицях.
- На співбесіді: часто просять пояснити або привести таблиці до нормальної форми.
- У реальній роботі: коли тобі довірять оптимізацію існуючої бази даних, розбивши "монолітні" таблиці на нормалізовані.
Друга нормальна форма (2NF) допомагає прибрати часткові залежності в таблиці, де первинний ключ є складеним. Ми розбиваємо таблиці на логічні блоки, щоб кожна колонка залежала тільки від усього ключа, а не від його частини. Це покращує якість бази даних, прибирає надлишковість і підвищує її гнучкість. Готовий до третьої нормальної форми? Погнали далі!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ