Нормализация реляционной модели данных
Нормализация– это формальный метод анализа отношений на основе их первичного ключа (или потенциальных ключей, как в случае нормальной формы Бойса–Кодда) и существующих функциональных зависимостей. Он включает ряд правил, которые могут использоваться для проверки отдельных отношений таким образом, чтобы вся база данных могла быть нормализована до желаемой степени нормализации. Если некоторое требование не удовлетворяется, то нарушающее данное требование отношение должно быть декомпозировано на отношения, каждое из которых (в отдельности) удовлетворяет всем требованиям нормализации.
Зачастую нормализация осуществляется в несколько последовательно выполняющихся этапов, каждый из которых соответствует некоторой нормальной форме, обладающей известными свойствами. В ходе нормализации формат отношений становится все более строгим и менее уязвимым по отношению к аномалиям обновления. При работе с реляционной моделью данных важно понимать, что только удовлетворение требований первой нормальной формы (1НФ) обязательно для создания отношений приемлемого качества. Все остальные формы могут использоваться по желанию проектировщиков. Однако нормализацию рекомендуется выполнять как минимум до ЗНФ.
На рис. 12 показана схема процесса нормализации и продемонстрирована взаимосвязь между разными нормальными формами. Видно, что одни 1НФ-отношения могут находиться во 2НФ, другие 2НФ-отношения – в ЗНФ и т.д.
Покажем процесс нормализации на примере преобразования данных, которые в исходном состоянии имели табличный формат со строками и столбцами.
Первая нормальная форма (1 НФ).Перед обсуждением первой нормальной формы целесообразно предварительно дать определение того состояния, которое предшествует ей.
Рис. 12. Схема взаимосвязей между отдельными нормальными формами
Ненормализованная форма –таблица, содержащая одну или несколько повторяющихся групп данных
Первая нормальная форма (1НФ) –отношение, в котором на пересечении каждой строки и каждого столбца содержится только одно значение.
Процесс нормализации начинается с преобразования данных из формата источника (например, из формата стандартной формы ввода данных) в формат таблицы со строками и столбцами. На исходном этапе таблица находится в ненормализованной форме (ННФ) и часто называется ненормализованной таблицей. Для преобразования ненормализованной таблицы в первую нормальную форму (1НФ) в исходной таблице следует найти и устранить все повторяющиеся группы данных. Повторяющейся группой называется группа, состоящая из одного и более атрибутов таблицы, в которой возможно наличие нескольких значений для единственного значения ключевого атрибута таблицы. Обратите внимание на то, что в данном контексте термин “ключ” равным образом относится и к одному атрибуту, и к группе атрибутов, которые единственным образом идентифицируют каждую строку ненормализованной таблицы. Существует два подхода исключения повторяющихся групп из ненормализованных таблиц.
В первом подходе повторяющиеся группы устраняются путем ввода соответствующих данных в пустые столбцы строк с повторяющимися данными. Иначе говоря, пустые места при этом заполняются дубликатами неповторяющихся данных. Этот подход часто называют “выравниванием” (“flattening”) таблицы. Полученная в результате этих действий таблица, которая теперь будет называться отношением, содержит атомарные (или единственные) значения на пересечении каждой строки с каждым столбцом, а потому находится в первой нормальной форме. В результате такого подхода в полученное отношение вносится некоторая избыточность данных, которая в ходе дальнейшей нормализации будет устранена.
Во втором подходе один атрибут или группа атрибутов назначаются ключом ненормализованной таблицы, а затем повторяющиеся группы изымаются и помещаются в отдельные отношения вместе с копиями ключа исходной таблицы. Далее в новых отношениях устанавливаются первичные ключи. Иногда ненормализованные отношения могут содержать одну или несколько повторяющихся групп внутри повторяющихся групп первого порядка. В таких случаях данный прием применяется до тех пор, пока повторяющихся групп совсем не останется. Полученный набор отношений будет находиться в первой нормальной форме только тогда, когда ни в одном из них не будет повторяющихся групп атрибутов.
Хотя оба этих подхода одинаково корректны, следует отметить, что при использовании второго подхода полученные отношения находятся как минимум в 1НФ и обладают меньшей избыточностью данных. При выборе первого подхода выровненное 1НФ-отношение декомпозируется в ходе дальнейшей нормализации на те же отношения, которые могли бы быть получены с помощью второго подхода.
Пример. В табл. 15 содержатся сведения об объектах недвижимости, арендованных клиентами. Для упрощения этого примера предположим, что клиент арендует некоторый объект только один раз и не может арендовать одновременно сразу несколько объектов.
Таблица 15
Ненормализованная таблица Customer Rental
В качестве ключевого атрибута ненормализованной таблицы Customer Rental (Клиенты-арендаторы) выберем атрибут Customer No (Номер клиента). Дальше найдем в ней группы сведений об объектах, которые могут повторяться у разных клиентов. Структура повторяющейся группы имеет следующий вид:
Повторяющаяся группа = (Property_No, Paddress, RentStart, RentFinish, Rent, Owner_No, OName).
Из-за наличия этой повторяющейся группы на пересечении некоторых строк и столбцов таблицы находится сразу несколько значений. Например, два значения, PG4 и PG16, номера объекта (атрибут Property_No) присутствуют в строке клиента John Kay. Чтобы преобразовать ненормализованную таблицу в первую нормальную форму, необходимо добиться того, чтобы на пересечении каждой строки и каждого cтолбца находилось единственное значение. Эта цель достигается путем устранения повторяющихся групп.
При использовании первого подхода повторяющаяся группа (сведения об объекте недвижимости) устраняется с помощью ввода в каждую строку с описанием объекта недвижимости соответствующих сведений о клиенте. Полученное в результате этих действий отношение Customer_Rental, находящееся в первой нормальной форме, представлено в табл. 16. Потенциальные ключи этого отношения являются составными и включают следующие группы атрибутов: (Customer_No, Property No), (Customer No, RentStart), (Property_No, RentStart). В качестве первичного ключа этого отношения выберем группу (Customer_No, Property_No) и для большей ясности разместим атрибуты данного первичного ключа рядом, с левой стороны отношения. (В нашем примере предполагается, что атрибут RentFinish не может быть использован в качестве компонента потенциального ключа.)
Таблица 16