Условие
Какие нормальные формы существуют помимо 1NF/2NF/3NF? Когда они применимы?
Решение
Полный список нормальных форм
| Форма | Что устраняет |
|---|---|
| 1NF | Неатомарные значения |
| 2NF | Частичные зависимости от составного ключа |
| 3NF | Транзитивные зависимости |
| BCNF (Boyce-Codd) | Зависимости от не-ключей-кандидатов |
| 4NF | Многозначные зависимости |
| 5NF | Зависимости соединения |
| 6NF | Темпоральные данные (теоретически) |
BCNF — почему отдельно от 3NF
3NF разрешает зависимости от superkey (PK) и от candidate keys. BCNF строже: разрешает только от superkey.
Пример: 3NF, но не BCNF
TeacherSubject(Teacher, Subject, Course)
Допустим: учитель ведёт ровно один курс, но курс могут вести несколько учителей.
- Зависимости:
(Teacher, Subject) → Course,Course → Subject. - 3NF: соблюдено (Course — candidate key).
- BCNF: нарушено:
Course → Subject—Courseне суперключ полной таблицы.
Решение: разделить на:
Teachers(Teacher, Course),Courses(Course, Subject).
4NF — многозначные зависимости
Если в таблице у одной сущности есть несколько независимых многозначных атрибутов, начинается «декартово взрывание».
Пример
StudentLanguageHobby(Student, Language, Hobby) — студент знает несколько языков и имеет несколько хобби, эти атрибуты независимы.
В 3NF/BCNF строки будут декартовым произведением: 3 языка × 2 хобби = 6 строк на одного студента. Это нарушение 4NF.
Решение: две таблицы — StudentLanguage(Student, Language) и StudentHobby(Student, Hobby).
5NF — Project-Join Normal Form
Устраняет «зависимости соединения», когда таблицу можно разложить на ≥ 3 проекций без потерь, но не на 2. На практике встречается редко.
6NF
Темпоральные расширения: каждый изменяющийся атрибут — в отдельной таблице с временным интервалом. Используется в системах audit log и DWH SCD-6.
Где это встречается на практике
- OLTP — обычно стремятся к 3NF/BCNF.
- DWH — преднамеренная денормализация, схема «звезда» нарушает 3NF ради скорости.
- OLAP / широкие таблицы — еще ниже норму.
Подводные камни
- BCNF строже 3NF, но в 99% случаев совпадают — отдельно об этом думать стоит только при сложных зависимостях.
- 4NF интересна для тегов/категорий — случай «один объект имеет много свойств в нескольких независимых измерениях».
- Перфекционизм по 5NF/6NF — обычно избыточен; лучше прагматично остановиться на 3NF.
Эталонный ответ
Помимо 1NF/2NF/3NF: BCNF (Boyce-Codd — устраняет зависимости от не-ключей-кандидатов), 4NF (устраняет многозначные зависимости), 5NF (устраняет зависимости соединения), 6NF (для темпоральных данных).