Возникновение перекрывающихся потенциальных ключей, когда часть одного ключа входит в состав другого ключа, является достаточно частым случаем, и использование правил приведения отношений к той или иной нормальной форме сильно проблематично. В частности, для таких случаев была сформулирована нормальная форма Бойса — Кодда (НФБК).
Отношение находится в нормальной форме Байса — Кодда тогда и только тогда, когда каждая его нетривиальная и неприводимая слева функциональная зависимость имеет в качестве своего детерминанта некоторый потенциальных ключ[1].
Предположим, что рассматриваемое отношение содержит три атрибута — «Заказ», «Товар» и «Поставщик» (рис. 2.79), при этом обладает некоторыми ограничениями:
- • в каждом заказе указывается определенный товар от одного поставщика;
- • каждый поставщик поставляет только один товар;
- • определенный товар могут поставлять несколько поставщиков.
Рис. 2.79. Функциональные зависимости примера перекрывающихся ключей. |
В данном примере имеются перекрывающиеся потенциальные ключи: {" Заказ", «Товар» } и {" Заказ", «Поставщик» }. Имеющееся отношение находится в третьей нормальной форме, но не в нормальной форме Байса — Кодда. Это вызывает аномалии обновления, мешающие корректно хранить и обрабатывать данные. В итоге, данное отношение стоит разбить на два отношения (рис. 2.80).
Рис. 2.80. Нормализация отношения с перекрывающимися ключами. |
Казалось бы, проблемы связи заказа и поставщика разрешены и аномалии обновления исчезли, но не все. При попытке добавить в отношение «Товары заказа» новый экземпляр данных необходимо обязательно добавить соответствующий экземпляр в отношение «Товары поставщика», поскольку важно понимать, товар какого поставщика будет размещен в заказе.
Правило перехода ЗНФ -> НФБК Если отношение находится в ЗНФ и существуют функциональные зависимости, где детерминанты не являются потенциальными ключами, то такие зависимости необходимо выделить в отдельные отношения.
Другим примером перекрывающихся потенциальных ключей может быть такой: зависимость количества товара от детерминанта «Товар» «Заказ» и зависимость ценового сегмента от детерминанта «Товар» — «Поставщик». Этот пример наиболее приближен к реалиям предметной области, поскольку количество товара в заказе должно определяться совокупностью атрибутов «Заказ» и «Товар», а ценовой сегмент товара определяется не только самим товаром, но и поставщиком этого товара.
Этот пример представляет отношение в нормальной форме Байса — Кодда, хотя и содержит перекрывающиеся ключи (рис. 2.81), поскольку эти ключи являются единственными детерминантами для соответствующего неключевого атрибута и процесс нормализации не требуется.
Рис. 2.81. Функциональная зависимость для двух отношений с перекрывающимися ключами.
- [1] Дейт К. Дж. Введение в системы баз данных.