Нормализация БД: 1НФ, 2НФ, 3НФ
Что такое нормальные формы, как привести таблицу к 3НФ пошагово, что такое функциональная зависимость и когда денормализация оправдана.
Нормализация — это разбиение одной «широкой» таблицы на несколько связанных так, чтобы каждый факт хранился ровно в одном месте. Цель — убрать аномалии вставки, удаления и обновления.
Исходная ненормализованная таблица
| Студент | Группа | Куратор | Предметы | Оценки |
|---|---|---|---|---|
| Иванов | ИВТ-21 | Петров П.П. | Матан, Физика | 5, 4 |
| Сидоров | ИВТ-21 | Петров П.П. | Матан | 3 |
Проблемы: нельзя нормально искать по предмету, при смене куратора надо править много строк, а нового студента без оценок вообще некуда вписать.
1НФ — атомарность
Каждая ячейка содержит одно значение, нет повторяющихся групп столбцов, у таблицы есть первичный ключ. Списки «Матан, Физика» в одном поле — прямое нарушение.
-- после приведения к 1НФ
Успеваемость(студент, группа, куратор, предмет, оценка)
-- ключ: (студент, предмет)
2НФ — нет частичных зависимостей
Таблица в 1НФ, и каждый неключевой атрибут зависит от всего составного ключа, а не от его части. Группа и куратор зависят только от студента, но не от предмета — значит, их надо вынести.
Студенты(студент_id, фио, группа, куратор)
Оценки(студент_id, предмет_id, оценка)
3НФ — нет транзитивных зависимостей
Неключевые атрибуты не должны зависеть друг от друга. Куратор зависит от группы, а группа — от студента: цепочка студент → группа → куратор транзитивна. Разрываем.
Студенты(студент_id, фио, группа_id)
Группы(группа_id, название, куратор)
Предметы(предмет_id, название)
Оценки(студент_id, предмет_id, оценка, дата)
Дальше 3НФ
- НФБК (Бойса-Кодда) — усиленная 3НФ: любая детерминанта является потенциальным ключом. Отличается от 3НФ только в таблицах с несколькими пересекающимися составными ключами.
- 4НФ — убирает многозначные зависимости (например, «преподаватель ведёт предметы» и «преподаватель работает в аудиториях» в одной таблице).
- 5НФ на практике в курсовых почти не встречается.
Когда денормализация оправдана
Нормализованная схема требует соединений, а они стоят времени. В отчётных и аналитических системах намеренно дублируют данные (например, хранят итоговую сумму заказа), чтобы не считать её JOIN-ами при каждом открытии отчёта. В курсовой это допустимо, если вы это осознанно объясните и покажете, чем поддерживаете согласованность — триггером или обновлением из приложения.
Порядок работы для курсовой
- Выпишите все атрибуты предметной области сплошным списком.
- Найдите функциональные зависимости: что чем однозначно определяется.
- Разложите до 3НФ, назначьте первичные и внешние ключи.
- Нарисуйте ER-диаграмму по получившимся сущностям.
- Напишите DDL-скрипт создания таблиц с ограничениями целостности.
Частые вопросы
Обязательно ли доводить до 3НФ?
В учебных работах — да, это стандартное требование. 3НФ убирает практически все аномалии и при этом не усложняет схему без нужды.
Как показать функциональную зависимость в отчёте?
Стрелками: студент_id → фио, группа_id; группа_id → название, куратор. Такая запись читается однозначно и экономит абзац текста.