Отношение находится в 2НФ тогда и только тогда, когда оно находится в 1НФ, и каждый его не ключевой атрибут функционально полно зависит от любого возможного ключа этого отношения.
Продолжим рассмотрение нашего примера. Так как первичным ключом отношения являются атрибуты (S#, P#), все остальные атрибуты должны функционально полно зависеть от ключа. Рассмотрим некоторые примеры. Так, зависимость (S#, P#) QTY является функционально полной, так как атрибут QTY не зависит функционально ни от S#, ни от P#. Однако, зависимости (S#, P#) SName или (S#, P#) Price не являются функционально полными, так как существуют функциональные зависимости S# SName и
P# Price. Следовательно, данное отношение не находится в 2НФ.
Так как S# SName, S# City, S# Code, имеем S# (SName, City, Code). Аналогично, из функциональных зависимостей P# PName и P# Price можно вывести зависимость P# (PName, Price). Применяя правило декомпозиции на основе первой функциональной зависимости, можем разбить исходное отношение на два: ПОСТАВЩИК (S#, SName, City, Code) с первичным ключом S#, и ПОСТАВЛЯЕМЫЙ ТОВАР (S#, P#, PName, Price, QTY) с составным первичным ключом (S#, P#). В отношении ПОСТАВЛЯЕМЫЙ ТОВАР атрибуты PName и Price функционально зависят от атрибута P#, следовательно, данное отношение не находится в 2НФ. Вновь применяя правило декомпозиции на основе функциональной зависимости P# (PName, Price), разобьем отношение на два: ТОВАР (P#, PName, Price) с первичным ключом P#, и ПОСТАВКА (S#, P#, QTY) с составным первичным ключом (S#, P#). Таким образом, исходное отношение может быть разбито на три:
|
|
ПОСТАВЩИК (S#, SName, City, Code) с первичным ключом S#
ТОВАР (P#, PName, Price) с первичным ключом P#
ПОСТАВКА (S#, P#, QTY) с составным первичным ключом (S#, P#)
Легко убедиться, что все три отношения находятся в 2НФ.
Примечание: если при проектировании базы данных используется IDEF1x, тогда 2НФ достигается при соответствующем выборе независимых сущностей, а также при разрешении связей типа многие ко многим. Так, в данном примере ПОСТАВКУ можно рассматривать как неопределенную связь между сущностями ПОСТАВЩИК и ТОВАР: один поставщик поставляет нуль или более товаров, один товар поставляется нулем или более поставщиками (Рис. 6.2):
Рис. 6.2. Начальный этап проектирования с использованием IDEF1x
Разрешая неопределенную связь, получаем дополнительную сущность ПОСТАВКА (Рис. 6.3):
Рис. 6.3. Отношения, удовлетворяющие 2НФ
Полученное в результате отношение ПОСТАВЩИК все еще не свободно от определенных проблем.
Проблема вставки. Так как определена функциональная зависимость City Code, может возникнуть необходимость включить значение кода для определенного города. Однако в отношение ПОСТАВЩИК нельзя включить такую информацию, если в данном городе нет ни одного поставщика.
|
|
Проблема обновления. Если меняется код некоторого города, необходимо изменить надлежащим образом информацию во всех кортежах отношения, в которых упоминается данный город.
Проблема удаления. Если в некотором городе размещен только один поставщик, и информация об этом поставщике удаляется, то удаляется и информация о городе, которая в дальнейшем может представлять некоторый интерес.
Причиной таких аномалий является то, что в отношении ПОСТАВЩИК существует транзитивная зависимость: из S# City и City Code следует S# Code.
Третья нормальная форма