Довольно часто первичный ключ отношения может включать несколько атрибутов (тогда он называется составным).
К примеру, отношение ДЕТИ, которое показано на рисунке 1.
Полная функциональная зависимость
Рассмотрим понятие полная функциональная зависимость.
Неключевой атрибут находится в полной функциональной зависимости от составного ключа, если он находится в функциональной зависимости от всего ключа в целом, но функционально не зависит от какого-нибудь атрибута, который входит в него.
Рассмотрим отношение ПОСТАВКИ (НОМЕР_ПОСТАВЩИКА, ТОВАР, СТОИМОСТЬ).
Поставщиком могут поставляться различные товары, а одинаковый товар может поставляться разными поставщиками. Тогда ключом отношения будет НОМЕР_ПОСТАВЩИКА + ТОВАР. Предположим, что всеми поставщиками поставляется товар по одинаковой цене. Тогда будут существовать следующие функциональные зависимости:
- НОМЕР_ПОСТАВЩИКА, ТОВАР $\to$ СТОИМОСТЬ
- ТОВАР $\to$ СТОИМОСТЬ
При неполной функциональной зависимости атрибута СТОИМОСТЬ от ключа возможно появление следующей аномалии: если изменится стоимость товара, необходимо полностью просмотреть отношения для изменения всех записей о его поставщиках. Такая аномалия появляется вследствие того, что два семантических факта объединены в одной структуре данных.
Рассмотрим разложение, которое дает отношения во второй нормальной форме:
- ПОСТАВКИ (НОМЕР_ПОСТАВЩИКА, ТОВАР)
- СТОИМОСТЬ_ТОВАРА (ТОВАР, СТОИМОСТЬ)
Вторая нормальная форма касается отношений между неключевыми и ключевыми атрибутами.
Вторая нормальная форма
Отношение находится во второй нормальной форме (2NF), если находится в первой нормальной форме и каждый неключевой атрибут находится в полной функциональной зависимости от ключа.
Следовательно, вторая нормальная форма может быть нарушена лишь в том случае, если ключ является составным, т.е. ключ состоит из нескольких атрибутов.
Рассмотрим таблицу «Назначение 1», представленную на рисунке 1. В таблице ключ состоит из набора атрибутов № здания и № работника. Атрибут Фамилия определяет атрибут № работника, а значит состоит в функциональной зависимости от части ключа. То есть для того, чтобы определить фамилию работника достаточно узнать № работника. Следовательно, таблица не удовлетворяет второй нормальной форме.
Если данную таблицу не приводить ко второй нормальной форме, могут появиться такие проблемы:
- Фамилия работника будет повторяться в каждой строке, которая относится к назначению данного работника.
- При изменении фамилии работника необходимо выполнить обновление всех строк, которые содержат записи о назначениях данного работника. Такая проблема называется аномалией изменения данных.
- Вследствие подобной избыточности возможно несоответствие данных – в разных строках для одного и того же работника могут содержаться разные имена.
- В ситуации, когда в какой-либо момент времени у работника нет назначений, может не быть строки, в которой будет храниться имя работника. Такая проблема называется аномалией ввода данных.
Для решения этих проблем необходимо выполнить разбиение таблицы на 2 реляционные таблицы, которые будут удовлетворять второй нормальной форме (рисунок 3).
Полученные реляционные таблицы «Работник» и «Назначение» находятся во второй нормальной форме и не содержат перечисленных выше проблем. Следовательно, 2NF уменьшает избыточность данных и исключает возможность аномалий.
Этапы разбиения на 2 таблицы в 2NF:
- Создание новой таблицы, которая состоит из атрибутов исходной таблицы. Детерминант функциональной зависимости станет ключом новой таблицы.
- Исключение атрибута, который стоит в правой части функциональной зависимости, из исходной таблицы.
- Повторение 1 и 2 шагов для каждой функциональной зависимости, которая нарушает 2NF.
- При вхождении одного и того же детерминанта в несколько функциональных зависимостей, все функционально зависящие от детерминанта атрибуты располагаются как неключевые атрибуты в таблицу, в которой детерминант будет ключом.