3.1 Нормализация базы данных
Нормальная форма — свойство отношения в реляционной модели данных, характеризующее его с точки зрения избыточности, потенциально приводящей к логически ошибочным результатам выборки или изменения данных. Нормальная форма определяется как совокупность требований, которым должно удовлетворять отношение (таблиц в базе данных).
Процесс преобразования отношений базы данных к виду, отвечающему нормальным формам, называется нормализацией. Нормализация предназначена для приведения структуры БД к виду, обеспечивающему минимальную логическую избыточность, и не имеет целью уменьшение или увеличение производительности работы или же уменьшение или увеличение физического объёма базы данных.
Конечной целью нормализации является уменьшение потенциальной противоречивости, хранимой в базе данных информации. Общее назначение процесса нормализации заключается в следующем:
- исключение некоторых типов избыточности;
- устранение некоторых аномалий обновления;
- разработка проекта базы данных, который является достаточно «качественным» представлением реального мира, интуитивно понятен и может служить хорошей основой для последующего расширения;
- упрощение процедуры применения необходимых ограничений целостности.
Устранение избыточности производится, как правило, за счёт декомпозиции отношений таким образом, чтобы в каждом отношении хранились только первичные факты (то есть факты, не выводимые из других хранимых фактов).
При том, что идеи нормализации весьма полезны для проектирования баз данных, они отнюдь не являются универсальным или исчерпывающим средством повышения качества проекта БД. Это связано с тем, что существует слишком большое разнообразие возможных ошибок и недостатков в структуре БД, которые нормализацией не устраняются.
Несмотря на эти рассуждения, теория нормализации является очень ценным достижением реляционной теории и практики, поскольку она даёт научно строгие и обоснованные критерии качества проекта БД и формальные методы для усовершенствования этого качества. Этим теория нормализации резко выделяется на фоне чисто эмпирических подходов к проектированию, которые предлагаются в других моделях данных. Более того, можно утверждать, что во всей сфере информационных технологий практически отсутствуют методы оценки и улучшения проектных решений, сопоставимые с теорией нормализации реляционных баз данных по уровню формальной строгости.
Нормализацию иногда упрекают на том основании, что «это просто здравый смысл», а любой компетентный профессионал и сам «естественным образом» спроектирует полностью нормализованную БД без необходимости применять теорию зависимостей.
Однако, как отмечал профессор Кристофер Дейт, нормализация в точности и является теми принципами здравого смысла, которыми руководствуется в своём сознании зрелый проектировщик, то есть принципы нормализации — это формализованный здравый смысл. Между тем, идентифицировать и формализовать принципы здравого смысла — весьма трудная задача, и успех в её решении является существенным достижением.
3.2 Первая нормальная форма
Первая нормальная форма (1НФ) — базовая нормальная форма отношения в реляционной модели данных.
Переменная отношения находится в первой нормальной форме тогда и только тогда, когда в любом допустимом значении этой переменной каждый кортеж отношения содержит только одно значение для каждого из атрибутов.
В реляционной модели отношение всегда находится в первой нормальной форме по определению понятия отношение.
Что же касается различных таблиц, то они могут не быть правильными представлениями отношений и, соответственно, могут не находиться в 1НФ. В соответствии с определением Кристофера Дейта для такого случая таблица нормализована (эквивалентно — находится в первой нормальной форме) тогда и только тогда, когда она является прямым и верным представлением некоторого отношения. Конкретнее, рассматриваемая таблица должна удовлетворять следующим пяти условиям:
- Нет упорядочивания строк сверху вниз (другими словами, порядок строк не несет в себе никакой информации).
- Нет упорядочивания столбцов слева направо (другими словами, порядок столбцов не несет в себе никакой информации).
- Нет повторяющихся строк.
- Каждое пересечение строки и столбца содержит ровно одно значение из соответствующего домена (и больше ничего).
- Все столбцы являются «обычными».
«Обычность» всех столбцов таблицы означает, что в таблице нет «скрытых» компонентов, которые могут быть доступны только в вызове некоторого специального оператора взамен ссылок на имена регулярных столбцов, или которые приводят к побочным эффектам для строк или таблиц при вызове стандартных операторов.
Исходная ненормализованная (то есть не являющаяся правильным представлением некоторого отношения) таблица:
Сотрудник | Номер телефона |
---|---|
Иванов И. И. | 283-56-82 390-57-34 |
Петров П. П. | 708-62-34 |
Сидоров С.С. |
Таблица, приведённая к 1НФ, являющаяся правильным представлением некоторого отношения:
Сотрудник | Номер телефона |
---|---|
Иванов И. И. | 283-56-82 |
Иванов И. И. | 390-57-34 |
Петров П. П. | 708-62-34 |
3.3 Вторая нормальная форма
Переменная отношения находится во второй нормальной форме тогда и только тогда, когда она находится в первой нормальной форме и каждый неключевой атрибут неприводимо зависит от (каждого) её потенциального ключа.
Неприводимость означает, что в составе потенциального ключа отсутствует меньшее подмножество атрибутов, от которого можно также вывести данную функциональную зависимость. Для неприводимой функциональной зависимости часто используется эквивалентное понятие «полная функциональная зависимость».
Если потенциальный ключ является простым, то есть состоит из единственного атрибута, то любая функциональная зависимость от него является неприводимой (полной). Если потенциальный ключ является составным, то, согласно определению второй нормальной формы, в отношении не должно быть неключевых атрибутов, зависящих от части составного потенциального ключа.
Пример приведения отношения ко второй нормальной форме
Пусть в следующем отношении первичный ключ образует пара атрибутов {Филиал компании, Должность}:
Филиал компании | Должность | Зарплата | Наличие компьютера |
---|---|---|---|
Филиал в Томске | Уборщик | 20000 | Нет |
Филиал в Москве | Программист | 40000 | Есть |
Филиал в Томске | Программист | 25000 | Есть |
Допустим, что зарплата зависит от филиала и должности, а наличие компьютера зависит только от должности.
Существует функциональная зависимость Должность -> Наличие компьютера, в которой левая часть (детерминант) является лишь частью первичного ключа, что нарушает условие второй нормальной формы.
Для приведения к 2NF исходное отношение следует декомпозировать на два отношения:
Филиал компании | Должность | Зарплата |
---|---|---|
Филиал в Томске | Уборщик | 20000 |
Филиал в Москве | Программист | 40000 |
Филиал в Томске | Программист | 25000 |
Должность | Наличие компьютера |
---|---|
Уборщик | Нет |
Программист | Есть |
Программист | Есть |
3.4 Третья нормальная форма (3НФ, 3NF)
Переменная отношения R находится в 3NF тогда и только тогда, когда выполняются следующие условия:
- R находится во второй нормальной форме.
- ни один неключевой атрибут R не находится в транзитивной функциональной зависимости от потенциального ключа R.
Пояснения к определению:
Неключевой атрибут отношения R — это атрибут, который не принадлежит ни одному из потенциальных ключей R.
Функциональная зависимость множества атрибутов Z от множества атрибутов X (записывается X → Z, произносится «икс определяет зет») является транзитивной, если существует такое множество атрибутов Y, что X → Y и Y → Z. При этом ни одно из множеств X, Y и Z не является подмножеством другого, то есть функциональные зависимости X → Z, X → Y и Y → Z не являются тривиальными, а также отсутствует функциональная зависимость Y → X.
Определение 3NF, эквивалентное определению Кодда, но по-другому сформулированное, дал Карло Заниоло в 1982 году. Согласно ему, переменная отношения находится в 3NF тогда и только тогда, когда для каждой из её функциональных зависимостей X → A выполняется хотя бы одно из следующих условий:
- Х содержит А (то есть X → A — тривиальная функциональная зависимость)
- Х — суперключ
- А — ключевой атрибут (то есть А входит в состав потенциального ключа).
Определение Заниоло чётко определяет разницу между 3NF и более строгой нормальной формой Бойса-Кодда (НФБК): НФБК исключает третье условие («А — ключевой атрибут»).
Запоминающееся и, по традиции, наглядное резюме определения 3NF Кодда было дано Биллом Кентом: каждый неключевой атрибут «должен предоставлять информацию о ключе, полном ключе и ни о чём, кроме ключа».
Условие зависимости от «полного ключа» неключевых атрибутов обеспечивает то, что отношение находится во второй нормальной форме; а условие зависимости их от «ничего, кроме ключа» — то, что они находятся в третьей нормальной форме.
Крис Дейт говорит о резюме Кента как об «интуитивно привлекательной характеристике» 3NF, и замечает, что с небольшим изменением она может служить и как определение более строгой нормальной формы Бойса-Кодда: «каждый атрибут должен предоставлять информацию о ключе, полном ключе и ни о чём, кроме ключа».
Вариант определения 3NF Кента является менее строгим, чем вариант нормальной формы Бойса-Кодда в формулировке Дейта, поскольку первая утверждает только то, что неключевые атрибуты зависят от ключей.
Первичные атрибуты (которые являются ключами или их частями) вовсе не должны быть функционально зависимыми; каждый из них предоставляет информацию о ключе предоставлением самого ключа или его части. Здесь следует отметить, что это правило справедливо только для неключевых атрибутов, так как применение его ко всем атрибутам будет полностью запрещать все сложные альтернативные ключи, поскольку каждый элемент такого ключа будет нарушать условие «полного ключа».
Рассмотрим в качестве примера переменную отношения R1:
Сотрудник | Отдел | Телефон |
---|---|---|
Гришин | Бухгалтерия | 11-22-33 |
Васильев | Бухгалтерия | 11-22-33 |
Петров | Снабжение | 44-55-66 |
Каждый сотрудник относится исключительно к одному отделу; каждый отдел имеет единственный телефон. Атрибут Сотрудник является первичным ключом. Личных телефонов у сотрудников нет, и телефон сотрудника зависит исключительно от отдела.
В примере существуют следующие функциональные зависимости: Сотрудник → Отдел, Отдел → Телефон, Сотрудник → Телефон.
Переменная отношения R1 находится во второй нормальной форме, поскольку каждый атрибут имеет не приводимую функциональную зависимость от потенциального ключа Сотрудник.
Зависимость Сотрудник → Телефон является транзитивной, следовательно, отношение не находится в третьей нормальной форме.
В результате разделения R1 получаются две переменные отношения, находящиеся в 3NF:
Отдел | Телефон |
---|---|
Бухгалтерия | 11-22-33 |
Снабжение | 44-55-66 |
Сотрудник | Отдел |
---|---|
Гришин | Бухгалтерия |
Васильев | Бухгалтерия |
Петров | Снабжение |
Исходное отношение R1 при необходимости легко получается в результате операции соединения отношений R2 и R3.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ