Название: Базы данных. Концепция баз данных, реляционная модель данных, языки SQL и XML (Токмаков Г. П.)

Жанр: Информационные системы и технологии

Просмотров: 1420


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

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

Нетрудно увидеть, что созданный нами первичный ключ избыточен: поле

«Номер накладной» однозначно определяет дату и покупателя. Для данной на- кладной не может быть иной даты и иного покупателя. А поле «Товар» в ком- бинации с полем «Номер накладной», напротив, однозначно идентифицирует запись. После уточнения состава первичного ключа получим новую таблицу

«ОТПУСК ТОВАРОВ» (см. 0).

Первое требование 2НФ выполнено, чего не скажешь о втором. Некоторые по-

ТОВАР

Товар

Един_измер

Цена_за_ед_изм

 

 

ОТПУСК ТОВАР

Номер накладной

Товар (FK)

Дата

Покупатель

Город

Адрес

Отпущ_единиц

Общая_стоим

 

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

 

 

ОТПУСК ТОВАРОВ

 

Номер накладной

Дата

Покупатель

Город

Адрес

Товар

Един_измер

Цена_за_ед_изм

Отпущ_единиц

Общая_стоим

 

ОТПУСК ТОВАРОВ

Номер накладной

Товар

Дата

Покупатель

Город

Адрес

Един_измер

Цена_за_ед_изм

Отпущ_единиц

Общая_стоим

 

 
Рис. 2.13. Таблица

«ОТПУСК ТОВАРОВ»,

приведенная к 1НФ

Рис. 2.14. Таблица

«ОТПУСК ТОВАРОВ» с первичным ключом

Рис. 2.15. Таблицы «ТОВАР»

и          «ОТПУСК ТОВАРОВ»

Дальнейший анализ  полученных таблиц  показывает, что  значения  поля

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

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

НЫЕ». Установим связи между этими таблицами. Один покупатель может встре-

ТОВАР

Товар

Един_измер

Цена_за_ед_изм

 

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

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

ОТПУСК ТОВАРОВ

 

Номер накладной

Товар (FK) Дата Отпущ_единиц Общая_стоим

ПОКУПАТЕЛИ

 

Покупатель Город Адрес

схему базы данных, при-

веденную на 0.

Итак, чтобы перей-

Рис. 2.16. Таблицы «ТОВАР», «ОТПУСК ТОВАРОВ»

и          «ПОКУПАТЕЛИ»

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

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

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

при этом станет первичным ключом новой таблицы.

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

кроме тех из них, которые станут вторичными ключами.

 

 

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