Нормальная форма Бойса-Кодда (БКНФ): детерминант суперключ

Нормальная форма Бойса-Кодда (БКНФ, по-английски BCNF) - это усиленный вариант третьей нормальной формы, в котором требование одно и предельно строгое: детерминант любой нетривиальной функциональной зависимости обязан быть суперключом. Никаких поблажек вроде «или зависимый атрибут входит в ключ», которые допускает 3НФ, здесь нет. Эта строгость нужна, чтобы закрыть редкий, но коварный класс аномалий - когда таблица формально в 3НФ, а избыточность всё равно осталась. Ниже разберём, что такое детерминант и суперключ, чем именно БКНФ строже 3НФ, на каком примере они расходятся и как декомпозировать таблицу до БКНФ. Если нужно проверить конкретную схему - соберите запрос в форме ниже.
Что требует БКНФ: одно правило вместо двух
Третья нормальная форма формулируется через два разных случая: для зависимости либо - суперключ, либо - ключевой атрибут (входит хотя бы в один потенциальный ключ). Бойс и Кодд заметили, что вторая лазейка («или ключевой») и порождает остаточные аномалии. БКНФ её закрывает.
Таблица находится в БКНФ, если для каждой нетривиальной функциональной зависимости детерминант является суперключом отношения. Нетривиальная - значит не входит в . Суперключ - любой набор атрибутов, функционально определяющий все остальные. Иначе говоря: всё, что в таблице что-то определяет, обязано определять вообще всё. Если этого нет - БКНФ нарушена.

Детерминант и суперключ: два ключевых термина
Чтобы проверять БКНФ механически, нужно уверенно различать два понятия.
Детерминант - это левая часть функциональной зависимости, то, от чего зависят другие атрибуты. В записи детерминантом является . В таблице детерминантов может быть несколько: каждый источник зависимости - отдельный детерминант.
Суперключ - это набор атрибутов, который однозначно определяет строку, то есть функционально определяет все атрибуты отношения. Минимальный суперключ называют потенциальным (кандидатным) ключом. Любой потенциальный ключ - суперключ, но не любой суперключ минимален.
Тогда правило БКНФ читается дословно: каждый детерминант обязан быть суперключом. Если в таблице нашёлся детерминант, который определяет лишь часть атрибутов и не тянет за собой всю строку, - это и есть нарушение. Сам аппарат функциональных зависимостей подробно разобран в материале о нормализации баз данных и нормальных формах; здесь он используется как инструмент.
Чем БКНФ строже третьей нормальной формы
3НФ и БКНФ совпадают почти всегда. Расхождение возможно только при особой конфигурации ключей, поэтому БКНФ иногда называют «3.5НФ» - она лежит между 3НФ и четвёртой формой.
Разница ровно в одном слове. 3НФ разрешает зависимость , если - ключевой атрибут, даже когда не суперключ. БКНФ это запрещает: обязан быть суперключом всегда, независимо от того, ключевой или нет. Условие срабатывает, когда в таблице есть несколько перекрывающихся составных потенциальных ключей - общих атрибутов у них достаточно, чтобы появился «частичный детерминант».

Из-за этого любая таблица в БКНФ автоматически находится и в 3НФ, но не наоборот. БКНФ - более сильное требование, и приводит оно к более «чистой» схеме ценой одного компромисса, о котором ниже.
Классический пример: 3НФ выполнена, БКНФ - нет
Возьмём учебную таблицу Запись, описывающую закрепление студентов за преподавателями по предметам:
| Студент | Предмет | Преподаватель |
|---|---|---|
| Иванов | Базы данных | Орлов |
| Иванов | Алгоритмы | Гусев |
| Петров | Базы данных | Орлов |
Правила предметной области таковы:
- каждый преподаватель ведёт ровно один предмет;
- по каждому предмету студент закреплён за одним преподавателем.
Отсюда две функциональные зависимости:
Потенциальных ключей два: и . Атрибут Предмет входит во второй ключ, то есть он ключевой. Поэтому зависимость для 3НФ допустима: пусть Преподаватель и не суперключ, зато Предмет ключевой - лазейка 3НФ сработала.
А для БКНФ эта же зависимость нарушение: детерминант Преподаватель суперключом не является (один преподаватель встречается у многих студентов). Таблица в 3НФ, но не в БКНФ.
Остаточная аномалия здесь реальна: факт «Орлов ведёт Базы данных» дублируется в каждой строке Орлова. Уволится последний его студент - и связь преподавателя с предметом исчезнет из базы. Именно это БКНФ и устраняет.
Как декомпозировать таблицу до БКНФ
Алгоритм прямолинеен: находим нарушающую зависимость и выносим её в отдельную таблицу. Для примера выше нарушает . Создаём таблицу с детерминантом в роли ключа:
Таблица Преподаватели:
| Преподаватель | Предмет |
|---|---|
| Орлов | Базы данных |
| Гусев | Алгоритмы |
Таблица Записи:
| Студент | Преподаватель |
|---|---|
| Иванов | Орлов |
| Иванов | Гусев |
| Петров | Орлов |
Теперь Преподаватель - суперключ в Преподаватели (он определяет Предмет), а в Записи ключ составной , и других зависимостей нет. Обе таблицы в БКНФ. Соединение по Преподаватель восстанавливает исходное отношение без потерь.
Общий рецепт: для каждой зависимости , где не суперключ, заводим таблицу с ключом , а в исходной удаляем , оставляя как связующий атрибут.
Цена строгости: потеря сохранения зависимостей
У БКНФ есть фундаментальный недостаток, которого нет у 3НФ. Декомпозиция до БКНФ не всегда сохраняет функциональные зависимости. То есть после разбиения какую-то из исходных зависимостей нельзя проверить, не выполняя соединение таблиц.
В примере выше зависимость после декомпозиции «размазалась» между двумя таблицами: ни в одной из них целиком она не проверяется. Чтобы гарантировать её, нужен JOIN при каждой вставке - а это дорого и неудобно для СУБД.
Практический вывод: декомпозиция в 3НФ всегда даёт и отсутствие потерь соединения, и сохранение зависимостей. БКНФ гарантирует только первое. Поэтому, когда сохранение зависимостей критично, останавливаются на 3НФ осознанно.
Из-за этого компромисса в реальном проектировании 3НФ берут как цель по умолчанию, а до БКНФ доводят, только если остаточная избыточность действительно мешает. Подробный разбор предыдущей ступени - в статье про третью нормальную форму и транзитивные зависимости.
Алгоритм проверки таблицы на БКНФ
Чтобы проверить отношение, действуйте по шагам:
- Выпишите все нетривиальные функциональные зависимости (минимальное покрытие удобнее).
- Найдите все потенциальные ключи: переберите наборы атрибутов и проверьте через замыкание, определяет ли набор все остальные атрибуты.
- Для каждой зависимости проверьте, является ли суперключом (то есть замыкание содержит все атрибуты).
- Если хотя бы у одной зависимости детерминант не суперключ - таблица не в БКНФ; эту зависимость и выносим декомпозицией.
- Повторяйте, пока все детерминанты не станут суперключами.
Замыкание - это множество атрибутов, выводимых из по зависимостям. Если равно всему набору атрибутов, - суперключ, и зависимость БКНФ не нарушает.
Частые ошибки
- Путать детерминант с ключом. БКНФ требует, чтобы детерминант был суперключом, а не наоборот. Атрибут может быть ключевым (входить в ключ) и при этом стоять справа в нарушающей зависимости - как
Предметв примере. - Считать, что 3НФ всегда влечёт БКНФ. Влечение обратное: БКНФ строже, из неё следует 3НФ, но не наоборот. Таблица в 3НФ может нарушать БКНФ при перекрывающихся составных ключах.
- Декомпозировать до БКНФ любой ценой. Если разбиение теряет сохранение зависимостей, а остаточная аномалия некритична, разумнее остаться в 3НФ. БКНФ не догма.
- Проверять только один потенциальный ключ. При нескольких перекрывающихся ключах нужно найти их все - нарушение БКНФ как раз и прячется в зависимости на атрибут «чужого» ключа.
- Игнорировать тривиальные зависимости как помеху. Зависимость при тривиальна и БКНФ не нарушает никогда - её в проверку не включают.
FAQ
Чем БКНФ отличается от 3НФ простыми словами? 3НФ разрешает зависимость на ключевой атрибут даже от не-суперключа, БКНФ это запрещает: любой детерминант обязан быть суперключом. Различие проявляется только при нескольких перекрывающихся составных ключах; в остальных схемах 3НФ и БКНФ совпадают.
Всегда ли можно привести таблицу к БКНФ без потерь? Декомпозиция до БКНФ всегда возможна без потерь соединения, но не всегда сохраняет функциональные зависимости. Если сохранение зависимостей важно, иногда сознательно останавливаются на 3НФ - это нормальный инженерный компромисс.
Что такое детерминант в функциональной зависимости? Детерминант - это левая часть зависимости , набор атрибутов , от которого зависят остальные. БКНФ требует, чтобы каждый детерминант был суперключом, то есть определял все атрибуты отношения, а не только часть.
Коротко
Нормальная форма Бойса-Кодда (БКНФ) - усиление 3НФ с единственным требованием: детерминант любой нетривиальной функциональной зависимости должен быть суперключом. Она убирает остаточную избыточность, которую 3НФ пропускает через лазейку «или зависимый атрибут ключевой». Расхождение 3НФ и БКНФ возникает только при перекрывающихся составных ключах, классический пример - Запись(Студент, Предмет, Преподаватель). Лечится декомпозицией: нарушающая зависимость выносится в таблицу с детерминантом-ключом. Плата за строгость - БКНФ гарантирует отсутствие потерь соединения, но не сохранение зависимостей, поэтому в проектах 3НФ остаётся целью по умолчанию, а БКНФ применяют точечно.
Читайте также

Функциональная зависимость в базе данных: разбор
Функциональная зависимость в базе данных простыми словами: запись X → Y, виды зависимостей, аксиомы Армстронга, замыкание атрибутов и роль ФЗ в нормализации и поиске ключей.

Третья нормальная форма (3НФ): транзитивные зависимости
Третья нормальная форма 3НФ простыми словами: чем 3НФ отличается от 2НФ, как найти транзитивную зависимость неключевого атрибута и разбить таблицу, чтобы убрать аномалии обновления.

Реляционная модель данных: основные понятия
Домен, атрибут, кортеж, схема отношения, ключ и нормальные формы - разбираем реляционную модель данных от азов до практики с примерами и калькулятором.