Нормализация отношений. Типы связей

Нормализация – аппарат ограничений на формирование таблиц (устранение аномалий).

Правила нормализованных данных:

1. Не должно быть повторяющихся полей и составных значений.

2. Каждое неключевое поле должно однозначно определяться первичным ключом таблицы.

3. Ни одно из неключевых полей не должно однозначно определяться частью первичного ключа таблицы.

1 NF – Первая нормальная форма

Первая нормальная форма не должна содержать повторяющихся полей и составных значений. Это значит, что каждое поле должно представлять одно значение, а не их комбинацию.

КодЗаказа ДатаЗаказа КодТовара1 КодТовара2 КодТовара3 КодТовара4 СуммаЗаказа
08/04/94 А3426 В8483 С398   59,34

Первая нормальная форма заменяет повторяющие поля одним полем, создавая при этом несколько записей (по одной на каждый вид товара).

КодЗаказа ДатаЗаказа КодТовара СуммаЗаказа
08/04/94 А3426 59,34
08/04/94 В8483 59,34
08/04/94 С398 59,34

Первая нормальная форма иначе называется структурной нормализацией. Предложенное решение дублирует одно и то же значение для даты заказа и кода покупки в нескольких записях. А при наличии повторяющихся значений возможна и неоднозначность результатов. Эта проблема решается последующими нормальными формами.

2 NF – Вторая нормальная форма

Вторая нормальная форма требует зависимость каждого неключевого поля от полного набора полей первичного ключа. Таблица 1 является первой нормальной формой.

Таблица 1

КодЗаказа ДатаЗаказа КодТовара СуммаЗаказа
08/04/94 А3426 59,34
08/04/94 В8483 59,34
08/04/94 С398 59,34
08/05/94 В8483 9,18

Из-за преобразования, выполненного первой нормальной формой, поле КодЗаказа перестало быть уникальным, поскольку его значение теперь повторяется в нескольких записях. А вот сочетание КодЗаказа и КодТовара нигде не повторяется, поэтому его можно принять за новый индекс. После этого необходимо проверить, все ли остальные поля зависят от комбинации КодЗаказа и КодТовара.

ДатаЗаказа не зависит от кода товара, хотя зависит от кода заказа. Это также является справедливым для суммы заказа. Поэтому эти два поля надо поместить в отдельную таблицу вместе с полем КодЗаказа, от которого они зависят. Это приведет к образованию двух таблиц (2, 3).

Таблица 2

КодЗаказа ДатаЗаказа СуммаЗаказа
08/04/94 59,34
08/05/94 9,18

Таблица 3

КодЗаказа КодПродукта СчетчикТовара
А3426
В8483
С398
В8483

Путем простого соблюдения правил нормализации была разработана структура, состоящая из двух таблиц, одна из которых содержит информацию о заказе в целом, а другая включает в себя детали по каждому заказу. В таблице 3 появилось новое поле СчетчикТовара. Это просто счетчик товаров для каждого заказа.

Чтобы связать информацию в таблице 2 с таблицей 3 нужно определить отношение между ними. Отношение будет основано на поле КодЗаказа. Такое отношение называется «один-ко-многим», поскольку каждый заказ, описанный в таблице 2, может быть описан несколькими записями в таблице 3.

3NF – Третья нормальная форма

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

Таблица с деталями заказов не имеет поля, однозначно определяющего запись. В ней может быть более одной записи с одинаковыми значениями кода заказа, да и Код продукта может появляться несколько раз – как в одном заказе, так и в разных. Поле СчетчикТовара повторяет свои значения начиная с 1 для каждого заказа. А вот сочетание полей КодЗаказа и СчетчикТовара уникально для каждой записи. Поэтому говорят, что таблица имеет составной первичный ключ.

Добавим к таблице еще одно поле с наименованием товара ИмяТовара. Таблица примет следующий вид.

Таблица 4

КодЗаказа КодТовара СчетчикТовара ИмяТовара
А3426 Стриммер
В8483 Модем
С398 Мышь
В8483 Модем

Для третьей нормальной формы все неключевые поля должны зависеть только от полного набора ключевых полей. Вначале проверим, зависит ли КодТовара от сочетания КодЗаказа и СчетчикТовара. Ответ будет положительным, поскольку для каждого из сочетаний КодЗаказа и СчетчикТовара может быть только один КодТовара.

Зависит ли ИмяТовара только от ключевых полей? Нет, вместо них оно однозначно завитсит от КодаТовара. Поэтому поле ИмяТовара не удовлетворяет условию третьей нормальной формы.

В качестве решения можно поместить название товара и его код в отдельный файл Товар, где код товара будет индексным полем. Получится структура, показанная в табл. 5.

Таблица 5

КодТовара ИмяТовара
А3426 Стриммер
В8483 Модем
С398 Мышь

Подобный анализ надо произвести для всех таблиц, используемых в приложении. По окончании анализа приложение можно считать нормализованным.

Наши рекомендации