Теоретический конспект студента

Нормализация БД: проверка связей

Фундаментальный конспект по проверке декомпозиции схемы отношений: свойство соединения без потерь, возникновение ложных кортежей, теорема Риссанена, алгоритм табло, многозначные зависимости (4НФ), зависимости соединения (5НФ) и осознанная денормализация в аналитических системах.

1. Зачем проверять связи при декомпозиции?

В процессе проектирования реляционной базы данных исходные «плоские» таблицы декомпозируются (расщепляются) на несколько более компактных отношений. Цель нормализации — устранение аномалий вставки, обновления и удаления, обусловленных избыточностью функциональных зависимостей (ФЗ).

Однако произвольное расщепление таблицы может разрушить проект базы данных. Чтобы декомпозиция была корректной, она обязана удовлетворять двум фундаментальным критериям:

  1. Соединение без потерь данных (Lossless-Join Property): при обратном объединении таблиц с помощью операции естественного соединения мы должны получить в точности исходное состояние без потери фактов и без появления паразитных строк.
  2. Сохранение функциональных зависимостей (Dependency Preservation): все исходные бизнес-правила должны проверяться локально внутри полученных таблиц без выполнения дорогостоящих межтабличных соединений.
Важнейший парадокс терминологии

Термин «декомпозиция с потерями» (Lossy Decomposition) в теории баз данных означает вовсе не пропажу строк! Напротив, строк становится больше, чем было. «Потеря» заключается в потере точности информации: в таблице возникают ложные кортежи (Spurious Tuples), искажающие реальность.

2. Иллюстрация возникновения ложных кортежей (Spurious Tuples)

Рассмотрим конкретное отношение R(Студент, Факультет, Куратор), отражающее назначение куратора студенту в рамках факультета. Исходное отношение содержит 2 реальных кортежа:

Студент Факультет Куратор
Иванов ИТ Петров
Смирнов ИТ Сидоров

Вариант А. Корректная декомпозиция (по первичному ключу «Студент»)

Разбиваем отношение на две подсхемы: R1(Студент, Факультет) и R2(Студент, Куратор). Общий атрибут — Студент, который является первичным ключом для исходного отношения R.

Проекции содержат:

Выполняем естественное соединение R1 ⋈ R2 по общему ключу Студент: получаем ровно 2 исходных кортежа. Декомпозиция является соединением без потерь.

Вариант Б. Ошибочная декомпозиция (по неключевому атрибуту «Факультет»)

Разбиваем отношение на подсхемы: R1(Студент, Факультет) и R3(Факультет, Куратор). Общий атрибут — Факультет. Ни в R1, ни в R3 факультет не является ключом (на одном факультете учится много студентов и работает много кураторов).

Выполняем обратное естественное соединение R1 ⋈ R3 по условию R1.Факультет = R3.Факультет:

Студент Факультет Куратор Статус кортежа в БД
Иванов ИТ Петров Истинный кортеж (был в исходной БД)
Иванов ИТ Сидоров ЛОЖНЫЙ КОРТЕЖ (Spurious Tuple)! У Иванова куратор не Сидоров!
Смирнов ИТ Петров ЛОЖНЫЙ КОРТЕЖ (Spurious Tuple)! У Смирнова куратор не Петров!
Смирнов ИТ Сидоров Истинный кортеж (был в исходной БД)
Катастрофические последствия

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

3. Теорема Риссанена для бинарной декомпозиции

Чтобы не моделировать ошибочные соединения вручную, финский ученый Йорма Риссанен в 1977 году доказал фундаментальную теорему:

Теорема Риссанена:
Декомпозиция отношения R на два отношения R₁ и R₂ (R₁ ∪ R₂ = R) является соединением без потерь относительно множества функциональных зависимостей F тогда и только тогда, когда:

(R₁ ∩ R₂ → R₁) ∈ F⁺   ИЛИ   (R₁ ∩ R₂ → R₂) ∈ F⁺

Практическое правило инженера:

  1. Найдите пересечение атрибутов двух подсхем: X = R₁ ∩ R₂.
  2. Вычислите замыкание атрибутов X⁺ относительно заданного множества ФЗ F.
  3. Проверьте: содержит ли X⁺ все атрибуты R₁ (то есть X — суперключ R₁) либо все атрибуты R₂ (то есть X — суперключ R₂).
  4. Если хотя бы одно условие выполнено — соединение гарантированно без потерь. Если ни одно не выполнено — декомпозиция породит ложные кортежи.

4. Алгоритм табло (Tableau Algorithm) для произвольной декомпозиции

Если отношение разбивается на 3 и более подсхем, теорема Риссанена не дает прямого ответа. В этом случае применяется матричный алгоритм табло (Ахо, Бири, Ульман).

Пример проверки декомпозиции табло

Дано отношение R(A, B, C, D) и множество ФЗ F = {A → B, B → C, C → D}.
Предложена декомпозиция на 3 подсхемы: R₁(A, B), R₂(B, C), R₃(C, D). Проверим ее на соединение без потерь.

Шаг 0. Исходное табло

Строим матрицу: строки — подсхемы, столбцы — атрибуты. Если атрибут входит в подсхему, пишем a_j, иначе b_{ij}:

Подсхема A B C D
R₁(A, B) a₁ a₂ b₁₃ b₁₄
R₂(B, C) b₂₁ a₂ a₃ b₂₄
R₃(C, D) b₃₁ b₃₂ a₃ a₄

Шаг 1. Применяем зависимость B → C

Строки R₁ и R₂ имеют одинаковое значение в столбце B (a₂). Следовательно, по зависимости B → C их значения в столбце C должны совпасть. В строке R₂ стоит a₃, заменяем b₁₃ в первой строке на a₃:

Подсхема A B C D
R₁(A, B) a₁ a₂ a₃ b₁₄
R₂(B, C) b₂₁ a₂ a₃ b₂₄
R₃(C, D) b₃₁ b₃₂ a₃ a₄

Шаг 2. Применяем зависимость C → D

Теперь строки R₁, R₂ и R₃ имеют одинаковое значение в столбце C (a₃). В строке R₃ в столбце D стоит a₄. Распространяем a₄ на строки R₁ и R₂:

Подсхема A B C D
R₁(A, B) a₁ a₂ a₃ a₄
R₂(B, C) b₂₁ a₂ a₃ a₄
R₃(C, D) b₃₁ b₃₂ a₃ a₄
Результат проверки табло

В строке R₁ получена полная последовательность универсальных символов (a₁, a₂, a₃, a₄). Алгоритм завершается успешно: декомпозиция R₁(A, B), R₂(B, C), R₃(C, D) обладает свойством соединения без потерь!

5. Сохранение функциональных зависимостей (Dependency Preservation)

Декомпозиция D = {R₁, …, Rₖ} отношения R сохраняет функциональные зависимости, если объединение зависимостей, проецируемых на отдельные таблицы, логически эквивалентно полному исходному множеству ФЗ:

(π_{R₁}(F) ∪ π_{R₂}(F) ∪ … ∪ π_{Rₖ}(F))⁺ = F⁺

Если зависимость разорвана, то при выполнении оператора INSERT в одну из таблиц СУБД не сможет проверить целостность бизнес-правила через обычный индекс PRIMARY KEY / UNIQUE — придется вызывать межтабличный JOIN, что снижает производительность на порядки.

3НФ против НФБК

Любая реляционная схема может быть декомпозирована в 3НФ с одновременным сохранением ФЗ и соединением без потерь. Для НФБК (BCNF) соединение без потерь гарантируется всегда, но сохранение зависимостей удается обеспечить не для всех схем отношений!

6. Многозначные зависимости (MVD) и Четвертая нормальная форма (4NF)

Что делать, когда функциональных зависимостей нет (все поля входят в первичный ключ), но избыточность все равно колоссальна? Классический пример: отношение R(Преподаватель, Дисциплина, Учебник).

Таблица вынуждена содержать декартово произведение всех дисциплин на все учебники каждого преподавателя:

Преподаватель Дисциплина Учебник
Кузнецов Базы данных Дейт К.
Кузнецов Базы данных Коннолли Т.
Кузнецов Сети ЭВМ Дейт К.
Кузнецов Сети ЭВМ Коннолли Т.

Если Кузнецов начнет рекомендовать 3-й учебник (Гарсиа-Молина), придется вставить 2 новые строки (по одной на каждую дисциплину). Это аномалия обновления!

Определение MVD:
В отношении R(X, Y, Z) выполняется многозначная зависимость X ↠ Y, если набор значений Y, соответствующих заданной паре (X, Z), зависит только от X и никак не зависит от Z.
Теорема Фейгина (Fagin's Theorem):
Декомпозиция R(X, Y, Z) на R₁(X, Y) и R₂(X, Z) является соединением без потерь тогда и только тогда, когда в R выполняется X ↠ Y | Z.
Четвертая нормальная форма (4NF):
Отношение находится в 4НФ, если оно находится в НФБК и для любой нетривиальной многозначной зависимости X ↠ Y множество атрибутов X является суперключом отношения.

Переход к 4НФ: разбиваем отношение на 2 независимые таблицы:

  1. R₁(Преподаватель, Дисциплина)
  2. R₂(Преподаватель, Учебник)

Избыточность устранена, аномалии исчезли!

7. Зависимости соединения (JD) и Пятая нормальная форма (5NF / PJNF)

В редких практических задачах возникают циклические трехсторонние ограничения, которые невозможно разбить на 2 таблицы без потерь, но можно разбить на 3 таблицы. Это описывается зависимостью соединения (Join Dependency):

⋈ [R₁, R₂, …, Rₘ] означает, что R = R₁ ⋈ R₂ ⋈ … ⋈ Rₘ.

Пятая нормальная форма (5NF / PJNF): отношение находится в 5НФ, если любая зависимость соединения в нем является тривиальной либо следует исключительно из потенциальных ключей отношения. 5НФ является теоретическим пределом декомпозиции без потерь в реляционной алгебре.

8. Контролируемая денормализация в аналитических системах (OLAP)

Хотя нормализация до 3НФ/4НФ защищает транзакционные системы (OLTP) от аномалий, в аналитических системах (хранилища данных, BI, витрины данных) нормализованная структура может вызывать серьезные проблемы производительности:

В связи с этим в OLAP применяется осознанная денормализация:

  1. Схема «Звезда» (Star Schema): центральная таблица фактов денормализуется, а измерения делаются максимально плоскими (отказ от соединений ради скорости чтения).
  2. Дублирование реквизитов: в строку чека или заказа дублируется неизменяемое название товара и артикул на момент покупки.
  3. Материализованные представления: СУБД хранит физически предрассчитанные суммы и агрегаты.
Компенсирующие механизмы

Денормализация допустима только при наличии компенсирующих архитектурных механизмов: триггеров согласования данных, потоков CDC (Change Data Capture) или регулярных регламентных ETL-пакетов сверки целостности.

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

1. Что произойдет, если выполнить естественное соединение двух таблиц по полю, которое не является ключом ни в одной из них?

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

2. Сформулируйте теорему Риссанена своими словами.

При разбиении одной таблицы на две обратное соединение будет точным и без потерь тогда и только тогда, когда общие столбцы этих таблиц однозначно определяют все столбцы первой таблицы ИЛИ все столбцы второй таблицы (то есть общий столбец является ключом хотя бы для одной из них).

3. В чем разница между функциональной и многозначной зависимостью?

При функциональной зависимости X → Y каждому значению X соответствует ровно одно значение Y. При многозначной зависимости X ↠ Y значению X соответствует целое множество независимых значений Y, не зависящих от других атрибутов таблицы.

4. Почему в хранилищах данных (OLAP) сознательно нарушают правила нормализации?

Для ускорения чтения и построения тяжелых отчетов. Денормализация исключает ресурсоемкие операции соединения (JOIN) десятков таблиц на петабайтных массивах данных.