Какое условие определяет нормальную форму Бойса-Кодда (BCNF)?

«Какое условие определяет нормальную форму Бойса-Кодда (BCNF)?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нормальная форма Бойса-Кодда (BCNF) — это строгая версия третьей нормальной формы (3NF). Она устраняет аномалии, возникающие из-за функциональных зависимостей, в которых детерминант (левая часть зависимости) не является потенциальным ключом.

Формальное условие BCNF: Таблица находится в BCNF, если для каждой нетривиальной функциональной зависимости X → Y (где Y не является подмножеством X), X является суперключом (содержит какой-либо потенциальный ключ) этой таблицы.

Проще говоря: Каждый атрибут (или набор атрибутов), от которого что-то зависит, должен быть уникальным идентификатором строки (ключом).

Пример нарушения BCNF: Рассмотрим таблицу Занятие: Студент_ID Курс Преподаватель

Допустим, действуют зависимости:

  1. {Студент_ID, Курс} → Преподаватель (составной ключ определяет преподавателя).
  2. Курс → Преподаватель (курс определяет преподавателя).

Проблема: Зависимость Курс → Преподаватель нарушает BCNF, потому что Курс (детерминант) не является суперключом (один курс могут вести несколько преподавателей? Нет, по условию зависимости — один). Это приводит к аномалиям:

  • Избыточность: Имя преподавателя повторяется для каждого студента на курсе.
  • Аномалия обновления: Чтобы сменить преподавателя на курсе, нужно обновить все строки с этим курсом.

Приведение к BCNF (декомпозиция): Разделим исходную таблицу на две:

  1. Студент_Курс (Студент_ID, Курс) — содержит составной первичный ключ.
  2. Курс_Преподаватель (Курс, Преподаватель) — где Курс является первичным ключом.

Теперь в каждой новой таблице детерминант всех функциональных зависимостей является суперключом.