Вторая нормальная форма: отсутствие зависимостей частичного ключа
Следующий шаг в процессе нормализации состоит в удалении всех неключевых атрибутов, которые зависят только от части первичного ключа. Такие атрибуты называются частично зависимыми. Те поля, которые зависят только от части первичного ключа, должны быть выделены в отдельные таблицы. Для приведения к 2НФ в таблице «ОТПУСК ТОВАРОВ» выделим поля, потенциально входящие в первичный ключ. «Дата накладной», «Покупатель» и «Номер накладной» не могут однозначно определять запись, поскольку они будут одинаковыми для всех товаров, отпускаемых по одной накладной. Поэтому введем в первичный ключ еще и поле «Товар».
|
|
|
| ||||||||||||||||||||||||||||||||
Рис. 2.13 - Таблица «ОТПУСК ТОВАРОВ», приведенная к 1НФ | Рис. 2.14 - Таблица «ОТПУСК ТОВАРОВ» с уточненным первичным ключом | Рис. 2.15 - Таблицы «ТОВАР» и «ОТПУСК ТОВАРОВ» |
Нетрудно увидеть, что созданный нами первичный ключ избыточен: поле «Номер накладной» однозначно определяет дату и покупателя. Для данной накладной не может быть иной даты и иного покупателя. А поле «Товар» в комбинации с полем «Номер накладной», напротив, однозначно идентифицирует запись. После уточнения состава первичного ключа получим новую таблицу «ОТПУСК ТОВАРОВ» (см. Рис. 2.14).
Первое требование 2НФ выполнено, чего не скажешь о втором. Некоторые поля зависят только от части первичного ключа. Поля «Ед_измер», «Цена_за_ед_измер» зависят от значения поля «Товар», но не зависят от значения поля «Номер накладной». Поэтому выделяем эти поля в таблицу «ТОВАР» и определяем связь 1:М между таблицами «ОТПУСК ТОВАРОВ» и «ТОВАР», так как один товар может присутствовать во многих накладных (см. Рис. 2.15).
|
|
| |||||||||||
Рис. 2.16 - Таблицы «ТОВАР», «ОТПУСК ТОВАРОВ» и «ПОКУПАТЕЛИ» |
Дальнейший анализ полученных таблиц показывает, что значения поля «Покупатель» не зависят от первичного ключа «Номер накладной» и «Товар», а зависит только от значения «Номер накладной». Поэтому данное поле, и зависящие от его значения поля «Город» и «Адрес» выделим в таблицу «ПОКУПАТЕЛИ» (см. Рис. 2.16).
Анализируя далее структуру таблицы «ОТПУСК ТОВАРОВ», обнаружим, что поле «Дата» зависит только от значения поля «Номер накладной». Поэтому выделяем поля «Дата» и «Номер накладной» в самостоятельную таблицу «НАКЛАДНЫЕ». Установим связи между этими таблицами. Один покупатель может встретиться во многих накладных. Поэтому между таблицами «ПОКУПАТЕЛИ» и «НАКЛАДНЫЕ» имеется связь 1:М по полю «Покупатель». Одной накладной может соответствовать несколько товаров. Поэтому между таблицами «НАКЛАДНЫЕ» и «ОТПУСК ТОВАРОВ» установим связь 1:М по полю «Номер накладной». В итоге получим схему базы данных, приведенную на Рис. 2.17.
Итак, чтобы перейти от 1НФ к 2НФ, нужно выполнить следующие шаги:
1. Определить, на какие части можно разбить первичный ключ так, чтобы некоторые из неключевых полей зависели от одной из этих частей.
2. Создать новую таблицу для каждой части ключа и группы зависящих от нее полей и переместить их в эту таблицу. Часть бывшего первичного ключа при этом станет первичным ключом новой таблицы.
Рис. 2.17 - База данных, приведенная к 2НФ |
3. Удалить из исходной таблицы поля, перемещенные в другие таблицы, кроме тех из них, которые станут вторичными ключами.