18.5. Нормализация

Бог веселый винограда

Позволяет нам три чаши

Выпивать в пиру вечернем.

А. С. Пушкин. Бог веселый винограда

18.5.1. Нормализация

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

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

  1. Атрибут Y сущности R функционально зависит от атрибута Х сущности R (символически записывается как Х ? Y), тогда и только тогда, когда каждое значение Х в сущности R связано в точности с одним значением Y в сущности R. Иными словами, Х уникально определяет Y.

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

Процесс нормализации сводится к последовательному приведению структуры данных к нормальным формам – формализованным требованиям к организации данным. Нормальные формы изменяются в порядке от первой (1НФ) до пятой (5НФ). Каждая последующая форма удовлетворяет требования предыдущей. На практике обычно ограничиваются приведением данных к третьей нормальной форме.

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

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

  3. Атрибут полностью зависит от первичного ключа, когда он функционально зависит от полного первичного ключа, а не от его отдельных компонентов (атрибутов).

В пользу нормализации обычно приводят следующие три основных  довода [9]:

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

Нормализация обычно приводит к разделению сущности на две или более связанных сущности, которые могут быть соединены вместе с помощью операции объединения. Результатом разделения и является уменьшение избыточности данных.

Создание формальной модели, как можно более независимой от специфики приложения. Другими словами, нормализация способствует тому, что модель опирается на данные, а не на процессы их обработки. На практике это означает, что структура БД остается неизменной даже при изменении процессов обработки.

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