Вторая нормальная форма

Определение

Отношение находится в 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НФ достигается при соответствующем выборе независимых сущностей, а также при разрешении связей типа многие ко многим. Так, в данном примере ПОСТАВКУ можно рассматривать как неопределенную связь между сущностями ПОСТАВЩИК и ТОВАР: один поставщик поставляет нуль или более товаров, один товар поставляется нулем или более поставщиками:

Разрешая неопределенную связь, получаем дополнительную сущность ПОСТАВКА:

Полученное в результате отношение ПОСТАВЩИК все еще не свободно от определенных проблем.

Проблема вставки. Так как определена функциональная зависимость CITY à CODE, может возникнуть необходимость включить значение кода для определенного города. Однако в отношение ПОСТАВЩИК нельзя включить такую информацию, если в данном городе нет ни одного поставщика.

Проблема обновления. Если меняется код некоторого города, необходимо изменить надлежащим образом информацию во всех кортежах отношения, в которых упоминается данный город.

Проблема удаления. Если в некотором городе размещен только один поставщик, и информация об этом поставщике удаляется, то удаляется и информация о городе, которая в дальнейшем может представлять некоторый интерес.

Причиной таких аномалий является то, что в отношении ПОСТАВЩИК существует транзитивная зависимость: из S# à CITY и CITY à CODE следует S# à CODE.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: