На предыдущем занятии мы привели таблицы к 3НФ и НФБК. Казалось бы, проект идеален? В реальности декомпозиция может скрывать фатальные дефекты:
R1 ⋈ R2 обязана восстанавливать исходное отношение в точности.Декомпозиция без соединения без потерь — это профессиональная непригодность схемы БД!
Термин «потеря данных» (Lossy) обманчив. В реляционной алгебре всегда выполняется включение:
Физически строки не пропадают. Теряется точность информации! В базе возникают строки-призраки (Spurious Tuples), комбинации которых никогда не существовало в реальном мире.
Исходное отношение R(Студент, Факультет, Куратор). Ошибочно разбиваем по неключевому атрибуту Факультет:
| Студент | Факультет | Куратор | Результат естественного соединения R1(Студент, Факультет) ⋈ R3(Факультет, Куратор) |
|---|---|---|---|
| Иванов | ИТ | Петров | Истинный факт (исходная запись) |
| Иванов | ИТ | Сидоров | ЛОЖНЫЙ КОРТЕЖ! Система прикрепила Иванова ко второму куратору! |
| Смирнов | ИТ | Петров | ЛОЖНЫЙ КОРТЕЖ! Система прикрепила Смирнова к чужому куратору! |
| Смирнов | ИТ | Сидоров | Истинный факт (исходная запись) |
Итог: 2 исходные строки превратились в 4 строки из-за соединения по неключевому полю!
Как математически гарантировать отсутствие ложных кортежей при разбиении таблицы на две части?
Инженерное правило: общий набор столбцов (R₁ ∩ R₂) обязан быть суперключом хотя бы одной из полученных таблиц!
X = R₁ ∩ R₂.X⁺ по заданным ФЗ.X⁺ ⊇ R₁ или X⁺ ⊇ R₂ — соединение гарантированно БЕЗ потерь!Что делать, если отношение декомпозировано на 3, 4 или более таблиц? Теорема Риссанена для бинарных декомпозиций здесь бессильна. Используется метод табло (Ахо, Бири, Ульман):
R₁, R₂, …, Rₖ.A₁, A₂, …, Aₙ.Aⱼ ∈ Rᵢ, в ячейку пишется универсальный символ aⱼ.bᵢⱼ.По очереди применяются ФЗ X → Y: строки, совпадающие по столбцам X, уравниваются по столбцам Y (с приоритетом универсального символа aⱼ).
Если хотя бы одна строка матрицы заполнилась целиком символами a₁…aₙ — соединение без потерь доказано!
Схема R(A, B, C, D), зависимости F = {A → B, B → C, C → D}. Подсхемы: R₁(A,B), R₂(B,C), R₃(C,D).
| Подсхема | A | B | C | D | Ход вывода |
|---|---|---|---|---|---|
| R₁(A, B) | a₁ | a₂ | a₃ (по B→C) | a₄ (по C→D) | Строка полностью заполнена символами a! |
| R₂(B, C) | b₂₁ | a₂ | a₃ | a₄ (по C→D) | Подтянуто значение a₄ |
| R₃(C, D) | b₃₁ | b₃₂ | a₃ | a₄ | Исходные значения |
Вывод: строка R₁ содержит (a₁, a₂, a₃, a₄) — декомпозиция является соединением без потерь!
Декомпозиция сохраняет ФЗ, если объединение всех локальных зависимостей логически покрывает исходное множество ограничений.
Если зависимость разорвана между таблицами, СУБД не может проверить бизнес-правило через индекс PRIMARY / UNIQUE KEY.
Приходится делать дорогостоящие триггеры или межтабличные JOIN на каждую вставку, что обрушивает производительность OLTP.
Теорема: 3НФ гарантирует одновременное сохранение ФЗ и соединение без потерь. Для НФБК сохранение ФЗ гарантировано не всегда!
Представим отношение R(Преподаватель, Дисциплина, Учебник):
В этом отношении нет нетривиальных функциональных зависимостей! Первичный ключ — все три атрибута: {Преподаватель, Дисциплина, Учебник}.
Отношение формально находится в НФБК, но содержит чудовищное декартово произведение строк: 2 курса × 2 книги = 4 строки. Добавление 1 книги требует вставки 2 строк! Это аномалия обновления.
Если в отношении R(X, Y, Z) выполняется X ↠ Y, то автоматически выполняется и симметричная многозначная зависимость X ↠ Z.
Преподаватель ↠ Дисциплина
Преподаватель ↠ Учебник
Дисциплины и учебники полностью независимы друг от друга в рамках одного преподавателя.
Декомпозиция отношения R(X, Y, Z) на R₁(X, Y) и R₂(X, Z) является соединением без потерь тогда и только тогда, когда в R выполняется X ↠ Y | Z.
Отношение находится в 4НФ, если оно в НФБК и для любой нетривиальной зависимости X ↠ Y детерминант X является суперключом.
Решение: декомпозируем на 2 независимые таблицы:
R₁(Преподаватель, Дисциплина) и R₂(Преподаватель, Учебник)
Отношение R удовлетворяет JD, если оно равно естественному соединению m своих проекций. Существуют циклические схемы, которые нельзя разбить на 2 таблицы без потерь, но можно без потерь разбить на 3 таблицы!
Проективно-соединительная нормальная форма (Project-Join Normal Form): любая зависимость соединения следует из потенциальных ключей отношения.
5НФ — теоретический предел нормализации без потерь в реляционной модели данных.
Инженерный баланс: в аналитике мы жертвуем дисковым пространством и простотой обновления ради сверхбыстрого чтения терабайтных таблиц.
Денормализация — это не отказ от проектирования, а управляемый архитектурный компромисс. При дублировании полей возникают риски:
Robert'); DROP TABLE Students;--.