Введение в дисциплину «Безопасность систем баз данных». Теоретические основы построения реляционных баз данных. Верификация баз данных и проведение аудита в СБД. Распределенные базы данных, страница 9

·  каждый сотрудник может занимать только одну должность;

·  сотрудники, занимающие одинаковую должность, получают одинаковую зарплату;

·  сотрудник может участвовать в нескольких проектах, но в каждом проекте ему разрешается выполнять только одно задание.

В качестве первичного ключа этого отношения выбран составной атрибут СОТРУДНИК, ПРОЕКТ.

СОТРУДНИК

ДОЛЖНОСТЬ

ЗАРПЛАТА

ПРОЕКТ

ЗАДАНИЕ

С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. Ранее было установлено, что в отношении СОТРУДНИКИ-ДОЛЖНОСТИ имеются следующие функциональные зависимости:

СОТРУДНИК -> ДОЛЖНОСТЬ;

ДОЛЖНОСТЬ -> ЗАРПЛАТА;

СОТРУДНИК -> ЗАРПЛАТА.

Нетрудно видеть, что функциональная зависимость СОТРУДНИК -> ЗАРПЛАТА является транзитивной. Зарплата, которая, по условию примера, является характеристикой должности, оказывается жестко привязанной к сотруднику, в результате чего возникают следующие аномалии в отношении СОТРУДНИКИ-ДОЛЖНОСТИ: