Нормализация данных
В данном пункте даются самые общие понятия о нормализации данных.
Под нормализацией понимается процесс анализа и реорганизации информационной модели (модели данных) с целью приведения ее в соответствие с требованиями реляционной модели данных и устранения избыточности.
Положительные эффекты от нормализации:
1. сокращение размера конечной БД;
2. уменьшение возможностей возникновения аномалий в процессе эксплуатации БД или их устранение.
Обычно в результате нормализации получается структура данных, в которой некоторый факт хранится только в одном месте (в одной строке или ячейке некоторой таблицы).
Отрицательные эффекты:
1. замедление (часто существенное) выполнения сложных запросов, поскольку в условиях нормализации часто требуется производить большое количество ресурсоемких операций соединения таблиц;
2. усложнение запросов.
Собственно процесс нормализации можно рассматривать как последовательное приведение структуры модели к так называемым нормальным формам (НФ). НФ представляет собой совокупность формализованных требований к структуре модели. Обычно выделяют шесть НФ:
1. первая НФ (1NF);
2. вторая НФ (2NF);
3. третья НФ (3NF);
4. НФ Бойса-Кодда (BCNF);
5. четвертая НФ (4NF);
6. пятая НФ (5NF).
Наиболее слабые требования к структуре предъявляются в первой НФ, наиболее жесткие — в пятой. Следует заметить, что далеко не любую модель в принципе можно представить в пятой НФ.
На практике чаще всего выполняется приведение модели к третьей НФ. Множество средств разработки и СУБД ориентированы именно на такую структуру. Далее будут рассмотрены вопросы приведения модели к первой, второй и третьей нормальным формам как самые типичные.
В таблицы дана краткая характеристика рассматриваемых нормальных форм.
Наименование формы | Описание |
Первая (1NF) | Атрибуты всех сущностей содержат только атомарные значения. |
Вторая (2NF) | Выполняются требования к первой НФ, а также каждый неключевой атрибут любой сущности зависит только целиком от всего первичного ключа этой сущности, а не от части первичного ключа. |
Третья (3NF) | Выполняются требования ко второй НФ, а также в каждой сущности ни один неключевой атрибут не находится в функциональной зависимости с другим неключевым атрибутом этой сущности. |
Необходимые определения.
Функциональная зависимость: атрибут A сущности E находится в функциональной зависимости от атрибута B сущности E, если значение B однозначно определяет A. Иначе говоря, существует некоторая функция f, так что A = f(B). Можно назвать A атрибутом-функцией, B — атрибутом-аргументом. Замечание. Из существования A = f(B) в общем случае не следует существование B = g(A).
Полная функциональная зависимость:атрибут A сущности E находится в полной функциональной зависимости от набора атрибутов B1, B2, …, Bn сущности E, если A функционально зависит от B1, B2, …, Bn, но не зависит функционально ни от какого подмножества из B1, B2, …, Bn.
Первая НФ
Смысл ограничений первой НФ в том, что среди атрибутов сущности не должно встречаться групп атрибутов, каждый из которых описывает, фактически, одно из возможных значений одной и той же характеристики.
Например:
Здесь пара атрибутов "Телефон 1" и "Телефон 2" являются явным нарушением первой НФ, поскольку описывают, фактически, одну и ту же характеристику. С другой стороны, продемонстрированный "экстенсивный" подход к описанию характеристик сущности не решает проблему, или решает на короткий срок и в рамках узкой предметной области. Действительно, если у какого-то студента наберется десяток любимых занятий, то придется либо добавлять еще 7 атрибутов в сущность, либо вводе данных в систему принудительно отсекать все списки хобби размером более 3 элементов. Очевидно, что такой подход в общем случае не правилен.
Для приведения сущности к первой НФ необходимо:
1. выделить атрибуты, действительно характеризующие разные признаки сущности;
2. для каждой группы атрибутов, соответствующих одному признаку, создать новую сущность и перенести в нее один атрибут, описывающий этот признак;
3. задать идентифицирующую связь между прежней сущностью, где теперь остались только те атрибуты, которые не входили в группы, и каждой созданной сущностью, при этом новая сущность является дочерней;
4. выбрать в созданных сущностях первичный ключ или создать первичный ключ.
Для приведенного примера:
Вторая НФ
Требования второй НФ имеют смысл только в том случае, если первичный ключ сущности составной. Если первичный ключ является только одним атрибутом, то выполнение условий первой НФ автоматически означает выполнение требований второй НФ.
Пример:
Пусть в соответствии с состоянием предметной области табельный номер преподавателя курса однозначно задает ФИО преподавателя и кафедру, к которой приписан курс. Тогда эта сущность не удовлетворяет требованиям второй НФ.
Для приведения сущности, удовлетворяющей первой НФ, ко второй НФ необходимо:
1. найти атрибуты, которые зависят только от части первичного ключа;
2. для каждого набора атрибутов, зависящих от одной и той же части первичного ключа, создать новую сущность и перенести в нее этот набор атрибутов, а также эту часть первичного ключа; первичным ключом новой сущности станет соответствующая часть первичного ключа исходной сущности;
3. установить идентифицирующие отношения между новыми сущностями и прежней, при этом новые сущности являются родительскими; в результате этой операции в преобразованную сущность "вернутся" части ее первичного ключа как внешние ключи.
В случае сущности "Курс" модификация будет такой:
Третья НФ
Смысл требований третьей НФ состоит в том, что не должно быть детерминированных зависимостей между неключевыми атрибутами. Естественно, при этом должны выполняться и условия для "младшей" НФ — второй.
Пусть в уже использовавшейся для иллюстрации сущности "Курс" имеется также атрибут "Факультет":
Если считать, что каждая кафедра приписана только к одному факультету, то в данной сущности имеется аномалия не только с точки зрения второй НФ, но и третьей НФ.
Последовательность шагов для приведения сущности от второй НФ к третьей:
1. выделить наборы атрибутов, зависящих от одного и того же неключевого атрибута (или совокупности неключевых атрибутов);
2. для каждого такого набора создать новую сущность и перенести в нее этот набор атрибутов, а также тот неключевой атрибут, который определяет функциональную зависимость (атрибут-аргумент); последний станет уникальным ключом новой сущности;
3. задать неидентифицирующую связь между новыми сущностями и исходной; при этом новые сущности являются родительскими.
В соответствии с таким алгоритмов получается следующая структура:
Дата добавления: 2018-11-25; просмотров: 519;