Рассмотрим несколько определений для обсуждения первой нормальной формы.
Первая нормальная форма
Простой атрибут – атрибут, который имеет атомарные (неделимые) значения.
Глубину структурирования определяет практическая необходимость при работе с данными. Можно привести пример глубины структурирования адреса. Весь адрес с указанием города, улицы, дома, квартиры можно хранить в одном поле. Этот атрибут является атомарным, если не нужно выполнять операции над отдельными улицами или городами, иначе данный атрибут не будет атомарным и нужно его далее разбивать на отдельные атрибуты с указанием города, улицы, дома, квартиры.
Сложный атрибут – атрибут, который получен в результате соединения нескольких атомарных атрибутов, определенных на одном или разных доменах.
Сложный атрибут также называют вектором или агрегатом данных.
Отношение находится в первой нормальной форме (1NF) при атомарности значений всех его атрибутов.
Иначе говоря, значениями в домене каждого атрибута отношения не могут быть ни списки, ни множества сложных или простых значений.
Рассмотрим пример.
База данных отдела кадров организации должна хранить информацию о служащих, которую можно представить с помощью отношения
При рассмотрении данного отношения можно определить, что атрибуты ДЕТИ и ИСТОРИЯ_РАБОТЫ – сложные, к тому же атрибут ИСТОРИЯ_РАБОТЫ содержит сложный атрибут ИСТОРИЯ_ЗАРПЛАТЫ.
Названные сложные атрибуты имеют следующий вид:
Связь названных сложных атрибутов показана на рисунке 3:
Чтобы привести исходное отношение СЛУЖАЩИЙ к первой нормальной форме нужно разбить его на 4 отношения, которые представлены на рисунке 4:
Синей рамкой выделен первичный ключ каждого отношения, шрифтом синего цвета набраны названия внешних ключей. Обратим внимание, что для представления функциональных зависимостей, которые существуют в исходном отношении, служат именно внешние ключи. Линиями со стрелками обозначены существующие функциональные зависимости.
Е.Ф.Кодд описал алгоритм нормализации следующим образом:
- В отношении, которое находится на верху дерева (рисунок 1), нужно взять его первичный ключ, и расширить каждое непосредственно подчиненное отношение с помощью вставки домена или их комбинации данного первичного ключа.
- Каждое расширенное отношение имеет первичный ключ, который состоит из первичного ключа этого отношения до расширения и первичного ключа родительского отношения.
- Далее из родительского отношения нужно вычеркнуть все непростые домены, удалить верхний узел дерева. Такую процедуру нужно повторить для каждого из оставшихся поддеревьев.
Рассмотрим еще один пример, в котором таблица не соответствует первой нормальной форме.
Значением атрибута № здания является множество зданий, в которых выполняется работа данным человеком.
Пусть необходимо получить список работников, которые отделывают здание 312. Получить такую информацию довольно сложно, поскольку идентификатор необходимого значения спрятан в середине множества в кортеже. Реляционная таблица РАБОТНИК не соответствует первой нормальной форме, поскольку значения атрибута № здания не атомарны. Но таблица на рисунке 4 имеет первую нормальную форму, поскольку необходимое значение (номер конкретного здания) можно выбрать с помощью простой ссылки на имя атрибута № здания.