Нормальная форма Бойса–Кодда ( BCNF или 3.5NF ) — это нормальная форма , используемая при нормализации базы данных . Это немного более строгая версия третьей нормальной формы (3NF). Используя BCNF, база данных удалит все избыточности, основанные на функциональных зависимостях .
Эдгар Ф. Кодд опубликовал свою оригинальную статью "Реляционная модель данных для больших общих банков данных" в июне 1970 года. Это был первый раз, когда было опубликовано понятие реляционной базы данных. Все последующие работы, включая метод нормальной формы Бойса-Кодда, основывались на этой реляционной модели.
Нормальная форма Бойса-Кодда была впервые описана Яном Хитом в 1971 году, и Крис Дейт также назвал ее нормальной формой Хита . [1]
BCNF была разработана в 1974 году Рэймондом Ф. Бойсом и Эдгаром Ф. Коддом для устранения некоторых типов аномалий, которые не рассматривались в 3NF, как это было изначально определено. [2]
Как уже упоминалось, Крис Дейт указал на то, что определение того, что мы теперь знаем как BCNF, появилось в статье Яна Хита в 1971 году. [3] Дейт пишет: [1]
Поскольку это определение предшествовало собственному определению Бойса и Кодда примерно на три года, мне кажется, что BCNF по праву должна называться нормальной формой Хита . Но это не так .
Если реляционная схема находится в BCNF, то вся избыточность, основанная на функциональной зависимости, была удалена, [4] хотя другие типы избыточности все еще могут существовать. Реляционная схема R находится в нормальной форме Бойса-Кодда тогда и только тогда, когда для каждой из ее зависимостей X → Y выполняется по крайней мере одно из следующих условий: [5]
Обратите внимание, что если реляционная схема находится в BCNF, то она находится в 3NF.
Только в редких случаях таблица 3NF не соответствует требованиям BCNF. Таблица 3NF, не имеющая нескольких перекрывающихся потенциальных ключей , гарантированно находится в BCNF. [6] В зависимости от ее функциональных зависимостей таблица 3NF с двумя или более перекрывающимися потенциальными ключами может находиться или не находиться в BCNF.
Пример таблицы 3NF, которая не соответствует BCNF:
Суперключи таблицы :
Обратите внимание, что хотя в таблице выше атрибуты Start time и End time не имеют повторяющихся значений для каждого из них, мы все равно должны признать, что в некоторые другие дни два разных бронирования на корте 1 и корте 2 могут начаться в одно и то же время или закончиться в одно и то же время . Вот почему {Start time} и {End time} нельзя считать суперключами таблицы.
Однако только S 1 , S 2 , S 3 и S 4 являются потенциальными ключами (то есть минимальными суперключами для этого отношения), поскольку, например, S 1 ⊂ S 5 , поэтому S 5 не может быть потенциальными ключами.
Учитывая, что 2NF запрещает частичные функциональные зависимости непервичных атрибутов (т. е. атрибута, который не встречается ни в одном ключе-кандидате ), а 3NF запрещает транзитивные функциональные зависимости непервичных атрибутов от ключей-кандидатов.
В таблице «Сегодняшние суды» нет не-простых атрибутов: то есть все атрибуты принадлежат какому-то потенциальному ключу. Поэтому таблица придерживается как 2NF, так и 3NF.
Таблица не придерживается BCNF. Это происходит из-за зависимости Rate type → Court, в которой определяющий атрибут Rate type – от которого зависит Court – (1) не является ни потенциальным ключом, ни надмножеством потенциального ключа и (2) Court не является подмножеством Rate type.
Тип ставки зависимости → Суд учитывается, поскольку тип ставки должен применяться только к одному суду.
Проект может быть изменен таким образом, чтобы он соответствовал BCNF:
Ключами-кандидатами для таблицы Rate types являются {Rate type} и {Court, Member flag}; ключами-кандидатами для таблицы Today's bookings являются {Court, Start time} и {Court, End time}. Обе таблицы находятся в BCNF. Когда {Rate type} является ключом в таблице Rate types, невозможно связать один тип Rate с двумя разными Courts, поэтому при использовании {Rate type} в качестве ключа в таблице Rate types аномалия, влияющая на исходную таблицу, была устранена.
В некоторых случаях таблица, не соответствующая BCNF, не может быть разложена на таблицы, которые удовлетворяют BCNF и сохраняют зависимости, которые содержались в исходной таблице. Бири и Бернстайн показали в 1979 году, что, например, набор функциональных зависимостей {AB → C, C → B} не может быть представлен схемой BCNF. [7]
Рассмотрим следующую таблицу, не являющуюся BCNF, функциональные зависимости которой следуют шаблону {AB → C, C → B}:
Для каждой комбинации типа Человек/Магазин таблица сообщает нам, какой магазин этого типа географически ближе всего к дому человека. Для простоты мы предполагаем, что один магазин не может быть более чем одного типа.
Возможные ключи таблицы:
Поскольку все три атрибута являются первичными атрибутами (т.е. принадлежат к потенциальным ключам), таблица находится в 3NF. Однако таблица не находится в BCNF, поскольку атрибут типа Shop функционально зависит от не-суперключа: Nearest shop.
Нарушение BCNF означает, что таблица подвержена аномалиям. Например, Eagle Eye может изменить свой тип магазина на "Optometrist" в своей записи "Fuller", сохранив тип магазина "Optician" в своей записи "Davidson". Это будет означать противоречивые ответы на вопрос: "Каков тип магазина Eagle Eye?" Удержание типа магазина каждого магазина только один раз, казалось бы, предпочтительнее, так как это предотвратит возникновение таких аномалий:
В этом пересмотренном дизайне таблица "Магазин рядом с человеком" имеет ключ-кандидат {Персона, Магазин}, а таблица "Магазин" имеет ключ-кандидат {Магазин}. К сожалению, хотя этот дизайн придерживается BCNF, он неприемлем по другим причинам: он позволяет нам регистрировать несколько магазинов одного типа для одного и того же человека. Другими словами, его ключи-кандидаты не гарантируют, что функциональная зависимость {Персона, Тип магазина} → {Магазин} будет соблюдена.
Возможен дизайн, который устраняет все эти аномалии (но не соответствует BCNF). Этот дизайн вводит новую нормальную форму, известную как Elementary Key Normal Form . [8] Этот дизайн состоит из исходной таблицы «Ближайшие магазины», дополненной таблицей «Магазин», описанной выше. Структура таблицы, сгенерированная алгоритмом генерации схемы Бернштейна [9] , на самом деле является EKNF, хотя это улучшение 3NF не было распознано во время разработки алгоритма:
Если ограничение ссылочной целостности определено таким образом, что {Тип магазина, Ближайший магазин} из первой таблицы должен ссылаться на {Тип магазина, Магазин} из второй таблицы, то аномалии данных, описанные ранее, будут предотвращены.
Это NP-полная задача , если задана схема базы данных в третьей нормальной форме , чтобы определить, нарушает ли она нормальную форму Бойса-Кодда. [10]
Если отношение R не находится в BCNF из-за функциональной зависимости X→Y, то R можно разложить в BCNF, заменив это отношение двумя подотношениями:
Проверьте, находятся ли оба подотношения в BCNF, и повторите процесс рекурсивно с любым подотношением, которое не находится в BCNF. [11]