· каждый сотрудник может занимать только одну должность;
· сотрудники, занимающие одинаковую должность, получают одинаковую зарплату;
· сотрудник может участвовать в нескольких проектах, но в каждом проекте ему разрешается выполнять только одно задание.
В качестве первичного ключа этого отношения выбран составной атрибут СОТРУДНИК, ПРОЕКТ.
СОТРУДНИК |
ДОЛЖНОСТЬ |
ЗАРПЛАТА |
ПРОЕКТ |
ЗАДАНИЕ |
С1 |
Д1 |
300 |
П1 |
З1_1 |
С2 |
Д2 |
500 |
П2 |
З2_1 |
С3 |
Д3 |
1000 |
П3 |
З3_1 |
С1 |
Д1 |
300 |
П2 |
З2_2 |
Рисунок 2.5 – Универсальное отношение
Все допущения, принятые ранее, можно выразить с помощью функциональных зависимостей:
СОТРУДНИК -> ЗАРПЛАТА
СОТРУДНИК -> ДОЛЖНОСТЬ
ДОЛЖНОСТЬ -> ЗАРПЛАТА
СОТРУДНИК, ПРОЕКТ -> ЗАДАНИЕ
Обращают на себя внимание первые две функциональные зависимости. Принимая сотрудника на некоторую должность и устанавливая ему зарплату, не обязательно сразу включать его в какой-то проект. Можно сделать это некоторое время спустя. С другой стороны, в рассматриваемом отношении атрибут СОТРУДНИК является частью первичного ключа, в паре с атрибутом – ПРОЕКТ. А это значит, что для принятия сотрудника на должность необходимо сразу включить сотрудника в проект, чтобы первичный ключ не содержал неопределенных значений. А это есть не что иное, как аномалия вставки: невозможно добавить кортеж, устанавливающий связь сотрудника с должностью, если сотрудник еще не участвует ни в одном проекте.
Функциональные зависимости атрибутов ДОЛЖНОСТЬ и ЗАРПЛАТА от атрибута СОТРУДНИК приводят также к следующим аномалиям:
· при удалении кортежа не только разрушается связь сотрудника с проектом, но и утрачивается информация о том, что он занимает некоторую должность;
· при переводе сотрудника на другую должность необходимо модифицировать все кортежи, описывающие этого сотрудника.
Избавиться от перечисленных аномалий можно, если разбить универсальное отношение на две отношения, приведенных ко 2НФ.
Отношение R находится во второй нормальной форме в том и только том случае, если оно находится в 1 НФ, и каждый неключевой атрибут его функционально зависит от первичного ключа и не зависит от любой части первичного ключа.
Разбиение следует выполнить по следующему принципу. Функциональные зависимости, приводящие к аномалиям, нужно вынести в отдельное отношение. Атрибут СОТРУДНИК будет в нем уже не частью первичного ключа, а первичным ключом. Неключевые атрибуты – ДОЛЖНОСТЬ и ЗАРПЛАТА – оказываются функционально зависимыми от первичного ключа. Во втором отношении первичным ключом остается составной атрибут СОТРУДНИК, ПРОЕКТ, и от него функционально зависит неключевой атрибут ЗАДАНИЕ. Оба отношения находятся во 2НФ (рис. 2.6).
СОТРУДНИКИ-ДОЛЖНОСТИ
СОТРУДНИК |
ДОЛЖНОСТЬ |
ЗАРПЛАТА |
С1 |
Д1 |
300 |
С2 |
Д2 |
500 |
С3 |
Д3 |
1000 |
СОТРУДНИКИ-ПРОЕКТЫ
СОТРУДНИК |
ПРОЕКТ |
ЗАДАНИЕ |
С1 |
П1 |
З1_1 |
С2 |
П2 |
З2_1 |
С3 |
П3 |
З3_1 |
С1 |
П2 |
З2_2 |
Рисунок 2.6 – Приведение отношений во вторую НФ
Третья нормальная форма (3НФ)
Функциональные зависимости обладают свойством транзитивности: если A->B и B->C, то A->C. Зависимости A->B и B->C в этом случае называются простыми функциональными зависимостями, а A->C – транзитивной функциональной зависимостью.
Обратимся к рис. 2.6. Ранее было установлено, что в отношении СОТРУДНИКИ-ДОЛЖНОСТИ имеются следующие функциональные зависимости:
СОТРУДНИК -> ДОЛЖНОСТЬ;
ДОЛЖНОСТЬ -> ЗАРПЛАТА;
СОТРУДНИК -> ЗАРПЛАТА.
Нетрудно видеть, что функциональная зависимость СОТРУДНИК -> ЗАРПЛАТА является транзитивной. Зарплата, которая, по условию примера, является характеристикой должности, оказывается жестко привязанной к сотруднику, в результате чего возникают следующие аномалии в отношении СОТРУДНИКИ-ДОЛЖНОСТИ:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.