Нормализация – аппарат ограничений на формирование таблиц (устранение аномалий).
Правила нормализованных данных:
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 | Мышь |
Подобный анализ надо произвести для всех таблиц, используемых в приложении. По окончании анализа приложение можно считать нормализованным.