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

Данный тип нормальной формы связан с таким понятием, как функциональная зависимость.

Функциональная зависимость.

Будем говорить, что атрибут (A) таблицы зависит  функционально от атрибута (B), если каждому значению (B) соответствует ровно одно значение (A).

Функциональная зависимость (A от B) обозначается как (B)->(A).

Рассмотрим следующую таблицу

<летчик, дата полета, тип самолета>

В таблице содержится информация о самолетах,  летчиках,  и полетах. Пусть на таблицу налагаются следующие дополнительные условия: а) летчик может делать не более одного полета в сутки, б) летчик может летать только на самолете одного конкретного типа, причем другой летчик не может летать на самолете этого же типа. Легко видеть, что первичным ключом данной таблицы является  (летчик, дата полета). Поскольку первичный ключ таблицы однозначно определяет любую запись таблицы, получается, что поля таблицы функционально зависят от первичного ключа. Кроме этого, поле (тип самолета) функционально зависит от поля (летчик).  На Рис. 1.8 изображены функциональные зависимости атрибута (тип самолета). 

Рис. 1.8. Функциональные зависимости в таблице. Поле (Тип самолета) зависит и от первичного ключа и от поля (летчик).

Дадим следующее определение.

Функционально полная зависимость.

Атрибут (A)  функционально полно зависит от атрибута (B) если он функционально зависит от атрибута (B) и не зависит ни от какой части атрибута (B).

Функциональные зависимости столбца (Тип самолета), представленные на Рис. 1.8, показывают, что зависимость его от первичного ключа не является функционально полной.

Теперь можно сформулировать определение второй нормальной формы (2НФ). 

Определение.

Таблица находится во второй нормальной форме (2НФ), если она находится в первой нормальной форме и функциональная зависимость столбцов таблицы не входящих в первичный ключ от первичного ключа является полной функциональной зависимостью.

Для того чтобы поправить положение с нашей таблицей, разобьем ее по столбцу (летчик) на две другие таблицы.

<летчик, дата полета>

<летчик, тип самолета>

Действительно, в первой таблице первичным ключом является  атрибут (летчик, дата полета), а во второй – (летчик, тип самолета).

Вернемся к таблицам, которые у нас получились в результате декомпозиции. Если говорить по существу, то мы отделили информацию о полетах от информации о типах самолетов. В результате мы получили две простые таблицы, которые связаны друг с другом через поле (летчик). Заметим, также, что обратный процесс, процесс восстановления исходной таблицы вполне однозначен. Объединение или соединение таблиц осуществляется по общему полю  (летчик). Это ключевой момент – именно от этого поля функционально зависело другое поле (тип самолета). Представьте, что мы разделили таблицу по другому принципу: <дата полета, летчик> и <дата полета, тип самолета>. Мы сразу потеряли информацию о связи между летчиками и типами самолетов. Действительно, за сутки может быть сделано несколько вылетов, и определить, какой летчик на каком типе самолета летал не возможно. По этой причине нам бы не удалось при соединении (композиции) этих таблиц получить исходную таблицу.           

Hosted by uCoz