Согласно Кодду, любая нормализованная схема (схема без повторяющихся элементов) автоматически находится в 1НФ независимо от того, насколько сложен ее ключ и какая взаимосвязь существует между ее элементами.
В последней схеме атрибуты «название», «автор», «цена» зависят от части ключа (а именно, от «ISBN»), тогда как атрибут «количество» зависит от всего ключа. Это называется, соответственно, частичной и полной функциональной зависимостью от ключа. По определению схема находится в 2НФ, если она находится в 1НФ и все ее неключевые атрибуты полностью функционально зависят от ключа. Таким образом, для приведения схемы в 2НФ, необходимо избавится от частичной функциональной зависимости. После избавления от нее последняя схема будет выглядеть следующим образом:
Заказ_на_книгу (имя заказчика, дата заказа, ISBN, количество, сумма_заказа)
Книга (ISBN, автор, название, цена)
Заметим, что возможно упростить ситуацию и дальше: атрибуты «количество» и «сумма_заказа» являются взаимно-зависимыми. По определению схема находится в ЗНФ если она находится в 2НФ и никакой из ее неключевых атрибутов не является зависимым ни от какого другого неключевого атрибута. Поскольку в нашем примере атрибут «сумма_заказа» фактически является избыточным то, для получения ЗНФ, его можно просто удалить.
|
|
Иногда для построения ЗНФ необходимо выразить зависимость между неключевыми атрибутами в виде отдельной схемы. Так для сотрудников, работающих по различным проектам, возможна следующая схема [20]:
Сотрудник (таб_номер, телефон, почасовая_оплата, N_npoeктa, дата_окончания)
Очевидно, что данная схема находится в 2НФ. Однако «N_npoeктa» и «дата_окончания» являются зависимыми атрибутами. После расщепления схемы получим ЗНФ:
Участник проекта (таб_номер, телефон, почасовая_оплата, N_пpoeктa)