Что такое нормальная форма Бойса-Кодда (BCNF) в базах данных?

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

Ответ

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

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

Проблема, которую решает BCNF: В 3НФ возможна ситуация, когда неключевой атрибут функционально определяет часть составного ключа, что приводит к избыточности и аномалиям обновления.

Пример нормализации в BCNF:

Исходная таблица Enrollment не в BCNF:

-- {student_id, subject} → professor, но также professor → subject
-- professor не является суперключом, нарушение BCNF.
CREATE TABLE Enrollment (
    student_id INT,
    subject VARCHAR(50),
    professor VARCHAR(50),
    PRIMARY KEY (student_id, subject)
);

Нормализация: Разделяем на две таблицы, устраняя зависимость неключевого атрибута.

-- Таблица 1: Профессор определяет предмет (professor — суперключ).
CREATE TABLE ProfessorSubject (
    professor VARCHAR(50) PRIMARY KEY,
    subject VARCHAR(50)
);

-- Таблица 2: Связь студента и профессора.
CREATE TABLE StudentEnrollment (
    student_id INT,
    professor VARCHAR(50),
    PRIMARY KEY (student_id, professor),
    FOREIGN KEY (professor) REFERENCES ProfessorSubject(professor)
);

Результат: Обе новые таблицы находятся в BCNF, аномалии устранены.