Вторая нормальная форма: отсутствие зависимостей частичного ключа

Следующий шаг в процессе нормализации состоит в удалении всех неключевых атрибутов, которые зависят только от части первичного ключа. Такие атрибуты называются частично зависимыми. Те поля, которые зависят только от части первичного ключа, должны быть выделены в отдельные таблицы. Для приведения к 2НФ в таблице «ОТПУСК ТОВАРОВ» выделим поля, потенциально входящие в первичный ключ. «Дата накладной», «Покупатель» и «Номер накладной» не могут однозначно определять запись, поскольку они будут одинаковыми для всех товаров, отпускаемых по одной накладной. Поэтому введем в первичный ключ еще и поле «Товар».

 
Номер накладной
Дата
Покупатель
Город
Адрес
Товар
Един_измер
Цена_за_ед_изм
Отпущ_единиц
Общая_стоим
Номер накладной
Товар
Дата
Покупатель
Город
Адрес
Един_измер
Цена_за_ед_изм
Отпущ_единиц
Общая_стоим
Товар
Един_измер
Цена_за_ед_изм
Номер накладной
Товар (FK)
Дата
Покупатель
Город
Адрес
Отпущ_единиц
Общая_стоим
Рис. 2.13 - Таблица «ОТПУСК ТОВАРОВ», приведенная к 1НФ Рис. 2.14 - Таблица «ОТПУСК ТОВАРОВ» с уточненным первичным ключом Рис. 2.15 - Таблицы «ТОВАР» и «ОТПУСК ТОВАРОВ»

Нетрудно увидеть, что созданный нами первичный ключ избыточен: поле «Номер накладной» однозначно определяет дату и покупателя. Для данной накладной не может быть иной даты и иного покупателя. А поле «Товар» в комбинации с полем «Номер накладной», напротив, однозначно идентифицирует запись. После уточнения состава первичного ключа получим новую таблицу «ОТПУСК ТОВАРОВ» (см. Рис. 2.14).

Первое требование 2НФ выполнено, чего не скажешь о втором. Некоторые поля зависят только от части первичного ключа. Поля «Ед_из­мер», «Цена_за_ед_измер» зависят от значения поля «Товар», но не зависят от значения поля «Номер накладной». Поэтому выделяем эти поля в таблицу «ТОВАР» и определяем связь 1:М между таблицами «ОТПУСК ТОВАРОВ» и «ТОВАР», так как один товар может присутствовать во многих накладных (см. Рис. 2.15).

Товар
Един_измер
Цена_за_ед_изм
Номер накладной
Товар (FK)
Дата
Отпущ_единиц
Общая_стоим
Покупатель
Город
Адрес
Рис. 2.16 - Таблицы «ТОВАР», «ОТПУСК ТОВАРОВ» и «ПОКУПАТЕЛИ»

Дальнейший анализ получен­ных таблиц показывает, что значения поля «Покупатель» не зависят от первичного ключа «Номер накладной» и «Товар», а зависит только от значения «Номер накладной». Поэто­му данное поле, и завися­щие от его значения поля «Город» и «Адрес» выделим в таблицу «ПОКУПАТЕЛИ» (см. Рис. 2.16).

Анализируя далее стру­к­туру таблицы «ОТПУСК ТОВАРОВ», обнаружим, что поле «Дата» зависит только от значения поля «Номер накладной». Поэтому выделяем поля «Дата» и «Номер накладной» в самостоятельную таб­лицу «НАКЛАДНЫЕ». Установим связи между этими табли­цами. Один покупатель может встретиться во многих накладных. Поэтому между таблицами «ПОКУПАТЕЛИ» и «НАКЛАДНЫЕ» имеется связь 1:М по полю «Покупатель». Одной накладной может соответствовать несколько товаров. Поэтому между таблицами «НАКЛАД­НЫЕ» и «ОТПУСК ТОВАРОВ» установим связь 1:М по полю «Номер накладной». В итоге получим схему базы данных, приведенную на Рис. 2.17.

Итак, чтобы перейти от 1НФ к 2НФ, нужно выполнить следующие шаги:

1. Определить, на какие части можно разбить первичный ключ так, чтобы некоторые из неключевых полей зависели от одной из этих частей.

2. Создать новую таблицу для каждой части ключа и группы зависящих от нее полей и переместить их в эту таблицу. Часть бывшего первичного ключа при этом станет первичным ключом новой таблицы.

Рис. 2.17 - База данных, приведенная к 2НФ

3. Удалить из исходной таблицы поля, перемещенные в другие таблицы, кроме тех из них, которые станут вторичными ключами.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: