Таблица считается находящейся во второй нормальной форме, если:
- Она уже находится в первой нормальной форме (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) помогает устранить частичные зависимости в таблице, где первичный ключ является составным. Мы разделяем таблицы на логические блоки, чтобы каждая колонка зависела только от всего ключа, а не от его части. Это улучшает качество базы данных, устраняет избыточность и повышает её гибкость. Готовы к третьей нормальной форме? Переходим дальше!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ