Основы моделирования и базы данных

Теория реляционных БД. Часть 7

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

Основные мысли

В результате изучения лекции слушатель будет способен:
1. Объяснять требования первой, второй, третьей нормальной формы и нормальной формы Бойса-Кодда.
2. Выявлять нарушения атомарности, неполной функциональной зависимости и транзитивных зависимостей в реляционных таблицах.
3. Выполнять декомпозицию таблиц для приведения их ко второй, третьей нормальной форме и форме Бойса-Кодда.
4. Отличать ситуации, в которых третья нормальная форма совпадает с формой Бойса-Кодда, от случаев их расхождения.
5. Обосновывать влияние нормализации на целостность и устранение избыточности данных.
Показывать лекцию целиком
Краткое изложение
Первая нормальная форма (1NF)

Первая нормальная форма уже рассматривалась ранее. Переменная отношения находится в 1NF тогда и только тогда, когда в любом допустимом значении отношения каждый кортеж содержит ровно одно значение для каждого атрибута. Иными словами, соблюдается атомарность: в одной ячейке не может храниться несколько значений. Атомарность во многом определяется предметной областью. Например, поле «ФИО» можно считать атомарным, если фамилия, имя и отчество не участвуют в фильтрации или выборках по отдельности. Если же требуется поиск по фамилии, ФИО необходимо разбить на три независимых атрибута.

Дополнительные требования к таблицам в реляционной модели: отсутствие упорядоченности строк и столбцов, недопустимость строк-дубликатов, обязательное наличие первичного ключа (primary key), ровно одно значение из домена на каждом пересечении строки и столбца, а также отсутствие скрытых или вычисляемых компонентов, не описанных в схеме.

Пример нарушения 1NF. Таблица «Сотрудник» с полями «Сотрудник» и «Номер телефона», где у Иванова в поле «Номер телефона» записано два номера. Это нарушает атомарность. Первичным ключом выбран «Сотрудник», значения уникальны.
Приводим к 1NF: разбиваем строку с двумя телефонами на две строки — Иванов с первым номером, Иванов со вторым номером. Теперь атрибут «Сотрудник» перестаёт быть уникальным, и новый первичный ключ становится составным: {Сотрудник, Номер телефона}.

Вторая нормальная форма (2NF)

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

Пример. Таблица с полями «Модель», «Фирма», «Цена», «Скидка». Первичный ключ — {Модель, Фирма}, так как разные фирмы могут выпускать модели с одинаковыми названиями. Атрибут «Цена» зависит и от модели, и от фирмы — полная функциональная зависимость. Атрибут «Скидка» зависит только от «Фирмы»: BMW всегда даёт 5%, Nissan — 10%. Это неполная функциональная зависимость, значит, таблица не находится во 2NF.

Приведение ко 2NF. Декомпозируем таблицу на две:
• {Модель, Фирма, Цена} с первичным ключом {Модель, Фирма};
• {Фирма, Скидка} с первичным ключом {Фирма}.

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

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

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

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

Пример. Таблица «Модель», «Магазин», «Телефон». Первичный ключ — «Модель» (модели уникальны). Таблица находится во 2NF, так как ключ простой. Однако «Телефон» однозначно определяется «Магазином»: у магазина «Реал Авто» всегда один и тот же номер. Возникает транзитивная зависимость: Модель → Магазин → Телефон. Если бы у магазина могло быть несколько телефонов, зависимость бы отсутствовала.

Проблемы транзитивности:
• Дублирование данных о телефоне для каждой модели магазина.
• Аномалии обновления: ошибочно указанный номер для одной модели создаст противоречие с другими записями того же магазина.

Приведение к 3NF. Выделяем две таблицы:
• {Модель, Магазин} — связь модели с магазином;
• {Магазин, Телефон} — телефон как свойство магазина.

Теперь «Телефон» зависит непосредственно от ключа «Магазин», транзитивность устранена.

Нормальная форма Бойса-Кодда (BCNF)

Нормальная форма Бойса-Кодда (BCNF) является усиленной третьей нормальной формой. Переменное отношение находится в BCNF тогда и только тогда, когда каждая нетривиальная и неприводимая слева функциональная зависимость имеет в качестве детерминанта некоторый потенциальный ключ (candidate key).

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

Пример. Бронирование теннисных кортов. Таблица содержит поля: «Номер корта», «Время начала», «Время окончания», «Тариф», «Член клуба».
Возможные потенциальные ключи:
• {Номер корта, Время начала}
• {Номер корта, Время окончания}
• {Тариф, Время начала}
• {Тариф, Время окончания}

Эти комбинации уникальны, так как нельзя забронировать один корт на одно время дважды, и тариф совместно с временной меткой однозначно определяет бронь.
Таблица удовлетворяет 2NF и 3NF: неключевых атрибутов в строгом смысле нет (все атрибуты входят в какие-либо ключи), транзитивных зависимостей не наблюдается. Однако существует функциональная зависимость {Номер корта, Член клуба} → Тариф. Детерминант этой зависимости не является потенциальным ключом (он не определяет всю строку). Это нарушает BCNF. Из-за этого можно по ошибке приписать тариф, не соответствующий данному корту и членству.

Приведение к BCNF. Декомпозируем на две таблицы:
• Бронирование: {Номер корта, Время начала, Время окончания, Член клуба} с потенциальными ключами, не включающими тариф.
• Тарифы: {Номер корта, Член клуба, Тариф} с первичным ключом {Номер корта, Член клуба}.

Теперь детерминант зависимости «Тариф» является первичным ключом своей таблицы. Форма BCNF достигнута.

Если в таблице только один потенциальный ключ, 3NF и BCNF совпадают. Необходимость в BCNF возникает именно при множественных ключах-кандидатах. На практике проектировщики обычно стремятся довести схему до 3NF; BCNF применяется в специфических случаях.

Дальнейшие нормальные формы

Существуют четвёртая, пятая и шестая нормальные формы. В данном курсе они подробно не рассматриваются, за исключением шестой нормальной формы (6NF), которая будет затронута в контексте анкорного моделирования современных хранилищ данных. Анкорная модель использует 6NF и предполагает очень высокую степень декомпозиции — вместо нескольких таблиц в 3NF могут получаться десятки таблиц.

Ключевые правила:
1NF — атомарность значений.
2NF — 1NF + полная функциональная зависимость неключевых атрибутов от всего первичного ключа.
3NF — 2NF + отсутствие транзитивных зависимостей.
BCNF — каждый детерминант зависимости должен быть потенциальным ключом (актуально при нескольких потенциальных ключах).

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

Краткие итоги

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

Сначала проверяется, что каждое поле хранит единственное значение и таблица имеет надёжный первичный ключ. Затем фокус смещается на полную функциональную зависимость: любой описательный атрибут должен определяться всем составным ключом, а не его фрагментом. Такой подход исключает ситуации, когда характеристика одного объекта «зашита» в таблицу другого, порождая дублирование при повторении части ключа. Декомпозиция по неполным зависимостям вычленяет справочники и связи, делая структуру более гибкой.

Следующий уровень — устранение транзитивности. Когда неключевой атрибут фактически описывает не саму сущность, а другой неключевой атрибут, возникает скрытая иерархия зависимостей. Это ведёт к размножению одной и той же информации и аномалиям при обновлении: изменение свойства одного объекта требует согласованной правки во множестве строк. Выделение промежуточной связи в самостоятельную таблицу разрывает эту цепочку, оставляя лишь прямые ссылки.

Особое место занимает нормальная форма Бойса-Кодда. Она вступает в силу, когда у отношения несколько потенциальных ключей, и стандартная третья форма пропускает зависимости, чьи детерминанты не являются ключом. Игнорирование этого сценария может приводить к противоречиям вроде назначения недопустимого тарифа на корт определённого уровня членства. Решение — дополнительная декомпозиция, гарантирующая, что любая значимая функциональная связь опирается на полный потенциальный ключ.

Практическое применение этих принципов позволяет строить устойчивые схемы, в которых каждое свойство хранится в единственном месте, а связи между сущностями явны и недвусмысленны. Владение инструментарием 1NF–BCNF даёт возможность не только исправлять унаследованные структуры, но и проектировать новые с минимальным риском возникновения аномалий вставки, удаления и обновления.
Первая нормальная форма (1NF)

Таблица находится в 1NF, если каждое поле содержит только одно (атомарное) значение. Атомарность трактуется относительно предметной области: если фамилию и имя не нужно обрабатывать по отдельности, «ФИО» может считаться атомарным; иначе его разбивают на компоненты.

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

Пример. Таблица «Сотрудник» (Сотрудник, Телефон). У Иванова записано два телефона — нарушение 1NF. Приведение: дублируем строку Иванова для каждого телефона. Новый первичный ключ — {Сотрудник, Телефон}.

Вторая нормальная форма (2NF)

Отношение во 2NF, если оно в 1NF и каждый неключевой атрибут функционально полно зависит от первичного ключа (неприводимая зависимость). Неключевой атрибут не должен зависеть лишь от части составного ключа.

Пример. Таблица {Модель,Фирма, Цена, Скидка}, ключ {Модель, Фирма}. Цена зависит от обоих атрибутов, а Скидка — только от Фирмы (BMW=5%, Nissan=10%). Это неполная зависимость, таблица не во 2NF.

Декомпозиция: {Модель, Фирма, Цена} и {Фирма, Скидка}. Теперь каждая неключевая характеристика полностью зависит от своего ключа.

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

Отношение в 3NF, если оно во 2NF и отсутствуют транзитивные зависимости неключевых атрибутов от ключа. Транзитивная зависимость: ключ определяет один неключевой атрибут, а тот — другой неключевой.

Пример. Таблица {Модель, Магазин, Телефон}, ключ «Модель». Модель уникальна, 2NF выполняется. Телефон однозначно задаётся магазином, поэтому имеем Модель → Магазин → Телефон. Это вызывает дублирование телефона и риск ошибки.

Декомпозиция: {Модель, Магазин} и {Магазин, Телефон}. Телефон теперь напрямую зависит от ключа «Магазин».

Нормальная форма Бойса-Кодда (BCNF)

Отношение в BCNF, если каждая нетривиальная неприводимая слева функциональная зависимость имеет детерминант, являющийся потенциальным ключом. BCNF ужесточает 3NF, когда у таблицы есть несколько потенциальных ключей.

Пример. Бронирование кортов: {Номер корта, Время начала, Время окончания, Тариф, Член клуба}. Потенциальные ключи: {Номер корта, Время начала}, {Номер корта, Время окончания}, {Тариф, Время начала}, {Тариф, Время окончания}. Зависимость {Номер корта, Член клуба} → Тариф есть, но её детерминант не является потенциальным ключом, поэтому 3NF соблюдена (нет транзитивности между неключевыми), а BCNF — нет. Ошибка: можно приписать тариф «Премиум» корту, где он не действует.

Декомпозиция: Бронирование {Номер корта, Время начала, Время окончания, Член клуба} и Тарифы {Номер корта, Член клуба, Тариф}. Теперь детерминант — ключ.

Если потенциальный ключ один, 3NF автоматически означает BCNF.

Резюме

1NF — атомарность значений.
2NF — полная зависимость неключевых атрибутов от всего первичного ключа.
3NF — отсутствие транзитивных зависимостей между неключевыми атрибутами.
BCNF — все детерминанты зависимостей являются потенциальными ключами.

Практическая цель — приводить схему к 3NF, а при наличии нескольких потенциальных ключей проверять и при необходимости обеспечивать BCNF.

Выводы

1. Первая нормальная форма требует атомарности каждого значения, исключая множественные данные в одной ячейке.
2. Атомарность не абсолютна: её границы задаются контекстом предметной области и сценариями использования.
3. Вторая нормальная форма устраняет неполные функциональные зависимости неключевых атрибутов от частей составного первичного ключа.
4. Если неключевой атрибут определяется лишь частью ключа, таблицу необходимо разбить, выделив эту зависимость в отдельное отношение.
5. Третья нормальная форма запрещает транзитивные зависимости, когда неключевой атрибут зависит от другого неключевого атрибута.
6. Транзитивность ведёт к избыточному дублированию и аномалиям обновления данных.
7. Приведение к 3NF выполняется декомпозицией: цепочка «ключ → неключевой → неключевой» разделяется на две прямые связи.
8. Нормальная форма Бойса-Кодда ужесточает 3NF: детерминант любой функциональной зависимости обязан быть потенциальным ключом.
9. BCNF и 3NF различаются только при наличии нескольких потенциальных ключей в одном отношении.
10. Классический пример нарушения BCNF — зависимость тарифа от номера корта и членства, когда в таблице есть множество ключей-кандидатов.
11. Декомпозиция до BCNF выделяет потенциальный ключ, не являющийся ключом в исходной таблице, в самостоятельное отношение.
12. На практике целью нормализации обычно служит третья нормальная форма с дополнительной проверкой на BCNF в сложных случаях.

Вопросы для самопроверки

1. Что такое атомарность и как она связана с первой нормальной формой?
2. Каким образом предметная область влияет на решение о том, является ли составное поле (например, ФИО) атомарным?
3. Почему после приведения таблицы «Сотрудник» к 1NF первичный ключ стал составным?
4. В чём отличие полной и неполной функциональной зависимости неключевого атрибута от первичного ключа?
5. Как определить, находится ли отношение во второй нормальной форме, если его первичный ключ состоит из одного столбца?
6. Приведите пример транзитивной зависимости, нарушающей третью нормальную форму.
7. Какие практические проблемы возникают из-за транзитивных зависимостей?
8. Как декомпозиция таблицы «Модель–Магазин–Телефон» устраняет транзитивность?
9. В чём главное отличие нормальной формы Бойса-Кодда от третьей нормальной формы?
10. Почему в примере с бронированием теннисных кортов таблица соответствует 3NF, но не BCNF?
11. При каком условии третья нормальная форма автоматически гарантирует BCNF?
12. Какие действия необходимы для приведения таблицы с несколькими потенциальными ключами к BCNF?
Вернуться к учебному плану