Нормализация реляционных баз данных - 1НФ

ОГЛАВЛЕНИЕ

 

1НФ

Сначала, как всегда, формальное определение.

Схема отношения R находится в 1НФ, если значения в dom(A) являются атомарными для каждого атрибута A в R.

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

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

Простейший пример: в БД отдела кадров предприятия в таблице, хранящей личные сведения о сотрудниках, имеется атрибут "домашний-адрес", в котором адрес хранится в формате: город, улица, дом[/корпус], [квартира] (следуя общепринятой нотации, здесь в квадратных скобках указаны опциональные фрагменты адреса, которые могут отсутствовать). В данном случае адрес хранится в виде единой текстовой строки, поскольку маловероятно, чтобы потребовалось выбрать сотрудников, скажем, по номеру квартиры. Таким образом, в контексте БД отдела кадров адрес является атомарным понятием, и его деление на составные части не имеет смысла, т.к. только внесет в БД излишнюю громоздкость.

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

Итак, очевидно, что в отрыве от контекста затруднительно дать строгое определение атомарности, за исключением самых простых случаев (например, домен натуральных чисел). В большинстве случаев необходимо располагать сведениями о предметной области, а также о том, каким образом планируется обрабатывать хранимые в БД данные.

Приведение отношения к 1НФ - довольно простая операция. Мы должны просмотреть схему отношения и разделить составные атрибуты на различные строки/столбцы. Возможно, эту операцию придется повторить несколько раз до тех пор, пока каждый из атрибутов не станет атомарным (с учетом сказанного в предыдущем абзаце).

Приведу небольшой пример. (Этот пример, как и остальные в данной статье, любезно предоставила мне Never, за что я ей сердечно благодарен, поскольку это позволило мне сэкономить массу времени и избежать выдумывания достаточно правдоподобных примеров).

В БД имеется таблица контрагентов, в которой хранятся следующие сведения:
  • наименование агента;
  • город;
  • адрес;
  • электронный адрес;
  • веб-страница;
  • вид агента (поставщик или клиент);
  • контактные лица (может быть несколько), должность контактного лица, телефон контактного лица.

Табл. 2
Наим.ГородАдресЭл. почтаWWWВидКонт. лица
Поршневой з-дВладимирУл. 2-я Кольцевая, 17Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.www.plunger.ruПоставщикИванов И.И., зам. дир., тел (3254)76-15-95
Петров П.П., нач. отд. сбыта, тел (3254)76-15-35
ООО ВымпелКурскУл. Гоголя, 25Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. КлиентСидоров С.С., директор, тел. (7634)66-65-38
ИЧП АльфаВладимирУл. Пушкинская, 37, оф. 565Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. КлиентВасильев В.В., директор, тел (3254)74-57-45

Очевидно, что в данном случае атрибут "конт-лица" не является атомарным, поскольку в нем попадаются списки из нескольких лиц. Разделим эти кортежи таким образом, чтобы каждый кортеж содержал данные только об одном лице:

Табл.3
Наим.ГородАдресЭл. почтаWWWВидКонт. лица
Поршневой з-дВладимирУл. 2-я Кольцевая, 17Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.www.plunger.ruПоставщикИванов И.И., зам. дир., тел (3254)76-15-95
Поршневой з-дВладимирУл. 2-я Кольцевая, 17Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.www.plunger.ruПоставщикПетров П.П., нач. отд. сбыта, тел (3254)76-15-35
ООО ВымпелКурскУл. Гоголя, 25Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. КлиентСидоров С.С., директор, тел. (7634)66-65-38
ИЧП АльфаВладимирУл. Пушкинская, 37, оф. 565Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. КлиентВасильев В.В., директор, тел (3254)74-57-45

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

Разобьем его на несколько атрибутов:

Табл. 4
Наим.ГородАдресЭл. почтаWWWВидДолжностьФ.И.О.Код городаТел.
Поршневой з-дВладимирУл. 2-я Кольцевая, 17Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.www.pler.ruПоставщикзам. дир.Иванов И.И. 325476-1595
Поршневой з-дВладимирУл. 2-я Кольцевая, 17Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.www.pler.ruПоставщикнач. отд. сбытаПетров П.П.,32547615-35
ООО ВымпелКурскУл. Гоголя, 25Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. КлиентдиректорСидоров С.С. 76346665-38
ИЧП АльфаВладимирУл. Пушкинская, 37, оф. 565Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. КлиентдиректорВасильев В.В.3254745745


Теперь можем считать, что каждое значение каждого из атрибутов нашего отношения является атомарным. Следовательно, отношение находится в 1НФ.