Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Methods / Инструментальные средства ИС 2.doc
Скачиваний:
196
Добавлен:
12.03.2015
Размер:
1.82 Mб
Скачать

6.3.6. Нормализация данных

Нормализация - процесс проверки и реорганизации сущностей и атри­бутов с целью удовлетворения требований к реляционной модели данных. Нормализация позволяет быть уверенным, что каждый атрибут определен для своей сущности, значительно сократить объем памяти для хранения информации и устранить аномалии в организации хранения данных. В ре­зультате проведения нормализации должна быть создана структура данных, при которой информация о каждом факте хранится только в одном месте. Процесс нормализации сводится к последовательному приведению структу­ры данных к нормальным формам - формализованным требованиям к ор­ганизации данных. Известны шесть нормальных форм:

  • первая нормальная форма (1NF);

  • вторая нормальная форма (2NF);

  • третья нормальная форма (3NF);

  • нормальная форма Бойса - Кодда (усиленная 3NF);

  • четвертая нормальная форма (4NF);

  • пятая нормальная форма (5NF).

На практике обычно ограничиваются приведением данных к третьей нормальной форме (полная атрибутивная модель, FA, см. 6.3.1). В данном подразделе будут достаточно кратко рассмотрены первые три нормальные формы и, в качестве иллюстрации, четвертая нормальная форма.

Для углубленного изучения нормализации следует рекомендовать книгу К.Дж. Дейта "Введение в системы баз данных" (Киев; М.Диалектика, 1998).

Нормальные формы основаны на понятии функциональной зависимо­сти (в дальнейшем будет использоваться термин "зависимость"). Приведем формальное определение для функциональной зависимости.

Функциональная зависимость (FD). Атрибут В сущности Е функционально зависит от атрибута А сущности Е тогда и только тогда, когда каж­дое значение А в Е связало с ним точно одно значение В в Е, т. е. А однозначно определяет В.

Полная функциональная зависимость. Атрибут В сущности Е полностью функционально зависит от ряда атрибутов А сущности Е тогда и только тогда, когда В функционально зависит от А и не зависит ни от какого под­ряда А.

Рис. 6.23. Ненормализованная сущность «Сотрудник»

На рис. 6.23 в сущности Сотрудник значение атрибутов Фамилия, Имя и Отчество однозначно определяются значением атрибута Табельный но­мер, т.е. атрибуты Фамилия, Имя и Отчество зависят от атрибута Табель­ный номер. Функциональные зависимости определяются бизнес-правилами предметной области. Так, если оклад сотрудника определяется только должностью, то атрибут Оклад зависит от атрибута Должность, если оклад зависит еще, например, от стажа, то такой зависимости нет. В нижеследующих примерах будем считать для определенности, что такая зависимость есть.

Рассмотрим нормальные формы.

Первая нормальная форма (1NF). Сущность находится в первой нормальной форме тогда и только тогда, когда все атрибуты содержат атомарные значения. Среди атрибутов не должно встречаться повторяющихся. На рис. 6.23 атри­буты Телефон и Хобби являются нарушением первой нормальной формы.

Что будет, если у сотрудника несколько рабочих телефонов? Запись значе­ния колонки через разделитель, например "124-56-78, 124-56-79, 124-56-90" или "Аквалангист, мотоциклист, шахматист", приводит к ряду проблем. Размера поля может не хватить для хранения данных (нельзя увеличивать список телефонов до бесконечности), по такой колонке невозможно по­строить индекс и т.д. и т.п. Сущность, приведенная на рис. 6.24, не явля­ется решением проблемы. Что будет, если у сотрудника появится четвертый телефон или третье хобби? Эту информацию будет негде хранить.

Рис. 6.24. Еще один пример ненормализованной сущности

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

Для приведения сущности к первой нормальной форме следует:

  • разделить сложные атрибуты на атомарные,

  • создать новую сущность,

  • перенести в нее все "повторяющиеся" атрибуты,

  • выбрать возможный ключ для нового РК (или создать новый РК).

  • установить идентифицирующую связь от прежней сущности к новой, РК прежней сущности станет внешним ключом (FK) для новой сущности.

На рис. 6.25. показана сущность Сотрудник, приведенная к первой нормальной форме.

Рис. 6.25. Сущность «Сотрудник», приведенная к первой нормальной форме

Вторая нормальная форма (2NF). Сущность находится во второй нормальной форме, если она находится в первой нормальной форме и каждый неключевой атрибут полностью зависит от первичного ключа (не должно быть зависимости от части ключа). Вторая нормальная форма имеет смысл только для сущностей, имеющих сложный первичный ключ.

Рис. 6.26. Сущность «Проект»

Предположим, сущность Проект содержит информацию о проекте, ко­торым руководит сотрудник, причем информация содержится как непо­средственно о проекте, так и о руководителе проекта (рис. 6.26). Атрибуты Фамилия, Имя, Отчество и Должность зависят только от атрибута Табель­ный номер руководителя, но вовсе не от Наименования проекта. Другими словами, имеется зависимость только от части ключа.

Для приведения сущности ко второй нормальной форме следует:

  • выделить атрибуты, которые зависят только от части первичного ключа, создать новую сущность;

  • поместить атрибуты, зависящие от части ключа, в их собственную (новую) сущность;

  • установить идентифицирующую связь от прежней сущности к новой (рис. 6.27).

Рис. 6.27. Сущность «Проект», приведенная ко второй нормальной форме

Вторая нормальная форма позволяет избежать следующих аномалий при выполнении операций:

Обновление (UPDATE). Имеет место дублирование данных о сотрудни­ке, если он руководит несколькими проектами. Если данные о сотруднике изменяются, необходимо менять несколько записей (по числу ведомых проектов).

Вставка (INSERT). Невозможно ввести данные о сотруднике, если он в данный момент не руководит проектами.

Удаление (DELETE). Если сотрудник временно прекращает руководство проектами, данные о нем теряются.

На рис. 6.27. показана сущность Проект, приведенная ко второй нор­мальной форме.

Третья нормальная форма (3NF). Сущность находится в третьей нормальной форме, если она находится во второй нормальной форме и ника­кой неключевой атрибут не зависит от другого неключевого атрибута (не должно быть взаимозависимости между неключевыми атрибутами).

На рис. 6.25. сущность Сотрудник находится во второй нормальной форме (имеется только один атрибут первичного ключа, поэтому не может быть зависимости неключевых атрибутов от части ключа), но неключевой атрибут Оклад зависит от другого неключевого атрибута - Должности.

Для приведения сущности к третьей нормальной форме следует:

  • создать новую сущность и перенести в нее атрибуты с одной и той же зависимостью от неключевого атрибута;

  • использовать атрибут(ы), определяющий эту зависимость, в качестве первичного ключа новой сущности;

  • установить неидентифицирующую связь от новой сущности к старой (рис. 6.28).

Рис. 6.28. Сущность «Сотрудник», приведенная к третьей нормальной форме

В третьей нормальной форме каждый атрибут сущности зависит от клю­ча, от всего ключа целиком и ни от чего другого, кроме как от ключа. Третья нормальная форма также позволяет избежать ряда аномалий:

Обновление (UPDATE). Имеет место дублирование данных об окладе, если должность занимают несколько сотрудников. Если оклад соответст­вующих должности меняется, необходимо менять несколько записей (по числу сотрудников на одной должности).

Вставка (INSERT). Невозможно ввести данные об окладе, соответст­вующем должности, если в данный момент нет сотрудника, занимающего эту должность.

Удаление (DELETE). В случае удаления из таблицы сотрудника, зани­мающего уникальную должность, данные об окладе теряются.

Четвертая нормальная форма (4NF) требует отсутствия многозначных зависимостей между атрибутами.

В примере на рис. 6.29 (слева) преподаватель читает лекции по несколь­ким предметам и курирует несколько групп студентов. Одна группа студен­тов может изучать несколько предметов, одному предмету могут обучаться несколько групп студентов. Имеется многозначная зависимость между атрибутами Предмет и Группа. При этом возможна аномалия: если у преподавателя появляется новая группа, приходится добавлять несколько записей, по числу читаемых предметов.

Для приведения сущности к четвертой нормальной форме следует соз­дать новую сущность и перенести атрибуты с многозначной зависимостью в разные сущности (рис. 6.29, справа). Связь между новыми сущностями при этом устанавливать нельзя, поскольку в результате миграции атрибутов внешних ключей атрибуты с многозначной зависимостью вновь окажутся в одной сущности. Ссылочную целостность в этом случае следует поддержи­вать при помощи триггеров.

Рис. 6.29. Иллюстрация четвертой нормальной формы

Денормализация. В результате нормализации все взаимосвязи данных становятся правильно определены, исключаются аномалии при оперирова­нии с данными, модель данных становится легче поддерживать. Однако часто нормализация данных не ведет к повышению производительности ИС в целом. Рассмотрим примеры на рис. 6.23 и 6.28. Для получения пол­ной информации о сотруднике из ненормализованной структуры данных достаточно обратиться к одной таблице (см. рис. 6.23). После приведения структуры данных к третьей нормальной форме (рис. 6.28) информация о сотруднике содержится уже в четырех таблицах. Хотя общее количество строк в этих таблицах может быть меньше, чем в исходной (до нормализа­ции), теперь для получения полной информации о сотруднике серверу БД необходимо обращаться одновременно к четырем таблицам (объединение таблиц, join). Время выполнения запроса с объединением может во много раз превосходить время выполнения запроса к одной таблице, другими сло­вами, в приведенном примере общая производительность ИС в результате нормализации, скорее всего, упадет. В целях повышения производительно­сти при переходе на физический уровень приходится сознательно отходить от нормальных форм для того, чтобы использовать возможности конкрет­ного сервера или ИС в целом.

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

Примером денормализации могут служить производные атрибуты, кото­рые являются нарушением первой нормальной формы (см. 6.3.2). Другой пример денормализации приведен на рис. 6.30.

а)б)

Рис. 6.30. Пример денормализации

Слева данные находятся в третьей нормальной форме, но для получения из БД информации о сотруднике, включая его оклад, приходится обра­щаться к таблицам Должность и Сотрудник. Если в таблицу Сотрудник добавить колонку Оклад (рис. 6.30, справа), то тогда при выборке инфор­мации о сотруднике достаточно обратиться только к таблице Сотрудник (исключается объединение). При этом нарушается третья нормальная фор­ма и возникают аномалии, в том числе аномалии при обновлении (если оклад соответствующих должности меняется, необходимо менять несколько записей по числу сотрудников на одной должности). Для решения пробле­мы можно делать выборку только из таблицы Сотрудник, а обновлять зна­чение оклада только в таблице Должность. Но при этом возникает проти­воречие между старым значением оклада, хранящимся в таблице Сотруд­ник, и новыми данными, хранящимися в таблице Должность. Чтобы избе­жать противоречия, можно создать утилиту (процедуру сервера), которая будет запускаться во время минимальной загрузки сервера, например но­чью, и выравнивать значения колонок. Если при выборке должности всегда необходимо самое свежее значение, то такое решение неприемлемо. Если задача позволяет подождать до начала следующего дня после редактирова­ния справочника Должность, то такое решение вполне допустимо.

Заметим, что приведенный пример следует воспринимать исключитель­но как иллюстрацию, а не как руководство к действию.