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

Базовые операции SQL. Часть 3

В материале рассматривается приведение схемы базы данных кинотеатра к третьей нормальной форме (3НФ). Исходная проблема: таблица расписания способна связать фильм в определённом формате с залом, который этот формат не поддерживает. Чтобы исключить такую аномалию, автор последовательно удаляет промежуточные таблицы «Фильм-Формат» и «Зал-Формат», создавая вместо них одну — «Фильм-Зал-Формат», пересекающую все три сущности. Далее анализируются достоинства и недостатки решения: гарантируется непротиворечивость данных, но появляется управляемая избыточность. Итогом становится полностью нормализованная схема, готовая к наполнению и последующей работе с SQL.

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

В результате изучения лекции слушатель будет способен:
1. Объяснить, какое требование третьей нормальной формы нарушено в исходной схеме с таблицами Film_Format и Hall_Format.
2. Идентифицировать транзитивные зависимости, ведущие к аномалиям при вставке и обновлении данных в расписании.
3. Спроектировать связующую таблицу, объединяющую фильм, зал и формат, для устранения конфликта.
4. Сравнить сильные и слабые стороны подхода с полным пересечением трёх сущностей.
5. Обосновать компромисс между допустимой избыточностью данных и обеспечением ссылочной целостности.
6. Применить методику нормализации для преобразования схемы «фильм–зал–формат» в третью нормальную форму.
Показывать лекцию целиком
Краткое изложение
Проблема в исходной схеме

Перед завершением заполнения базы данных её необходимо привести к третьей нормальной форме (3НФ).
В текущей структуре присутствуют таблицы:
Film_Format — связь фильмов и форматов, в которых они закуплены;
Hall_Format — связь залов и форматов, которые они способны показывать;
Schedule (расписание) — пересекает фильм, формат и зал, добавляя время начала сеанса.

Конфликт возникает именно в расписании. Его структура допускает назначение фильма в формате, который выбранный зал не поддерживает. Например, можно указать, что фильм показывается в 3D, и одновременно привязать зал без поддержки 3D. Это нарушает третью нормальную форму, так как присутствует транзитивная зависимость: формат фильма косвенно зависит от зала через расписание.

Удаление проблемных таблиц

Одно из возможных, но отклонённых решений — оставить схему как есть, добавив хранимую процедуру (stored procedure) проверки совместимости формата и зала при каждом добавлении строки в расписание. Такой подход сохранил бы схему во второй нормальной форме (2НФ), однако требовал бы написания дополнительного кода, а главное — не устранял нарушение 3НФ.

Выбран другой путь. Таблицы Film_Format и Hall_Format удаляются, поскольку они больше не будут нужны. Также удаляются связи от этих таблиц к расписанию.

Создание единой таблицы Film_Hall_Format

Вместо двух промежуточных таблиц создаётся одна — Film_Hall_Format (Фильм-Зал-Формат). Она пересекает сразу три сущности:
ID_Film (фильм),
ID_Hall (зал),
ID_Format (формат).

Все три поля объявляются составным первичным ключом (primary key). Тип каждого поля — целочисленный (int). Устанавливаются внешние ключи к соответствующим таблицам-справочникам.

Избыточность как осознанный компромисс

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

Однако появляется управляемая избыточность. Если кинотеатр имеет пять залов с поддержкой 3D и два фильма в 3D-формате, в таблицу Film_Hall_Format нужно внести все 5 × 1 = 5 комбинаций для каждого фильма (итого 10 строк), даже если реально каждый фильм будет демонстрироваться лишь в одном-двух залах. Фактически перечисляются все потенциально возможные варианты показа.

Это допустимо по двум причинам:
• большинство фильмов всё равно идут во многих залах;
• избыточность сводится к хранению нескольких целочисленных идентификаторов, что создаёт ничтожную нагрузку.

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

Итоговая схема

Таким образом, схема приведена к третьей нормальной форме. Расписание остаётся связанным с заказом (Order) и деталями заказа (Order_Detail) для продажи конкретных мест. Дальнейшая работа будет заключаться в полном наполнении базы данными, создании резервной копии и последующем использовании SQL для написания сложных запросов, триггеров и хранимых процедур.

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

Процесс нормализации схемы базы данных кинотеатра наглядно демонстрирует, как выбор между строгим соблюдением теоретических требований и прагматичными компромиссами определяет качество информационной системы. В центре анализа — противоречие, порождённое раздельным хранением связей «фильм–формат» и «зал–формат» при наличии расписания, которое должно объединять все три сущности. Разнесение допустимых комбинаций по двум таблицам создаёт транзитивную зависимость и открывает возможность для внесения некорректных данных, когда фильм в конкретном формате назначается в зал без поддержки этого формата.

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

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

Практическая значимость рассмотренного примера выходит за пределы кинотеатрального бизнеса. Подобная ситуация типична для любых систем бронирования или расписаний, где требуется стыковка ресурсов с переменными характеристиками. Умение распознавать транзитивные зависимости и выбирать между полной нормализацией и управляемой избыточностью становится ключевой компетенцией проектировщика, позволяя находить баланс между теоретической чистотой схемы и эксплуатационными удобствами без ущерба для целостности данных.
Исходная схема кинотеатра включала таблицы Film_Format (фильм и его форматы) и Hall_Format (зал и поддерживаемые форматы). Расписание (Schedule) связывало фильм, формат и зал. Нарушение третьей нормальной формы (3НФ) состояло в том, что можно было указать в расписании формат, который зал не поддерживает, — возникала транзитивная зависимость.

Для устранения аномалии обе промежуточные таблицы удалены. Вместо них создана одна — Film_Hall_Format, содержащая поля ID_Film, ID_Hall и ID_Format, которые вместе образуют составной первичный ключ. Она фиксирует все допустимые тройки «фильм–зал–формат». Теперь любое сочетание, попадающее в расписание, может ссылаться только на проверенные комбинации, и противоречие «формат не поддерживается залом» исключено.

Цена решения — управляемая избыточность: приходится перечислять все залы, технически способные показать фильм в заданном формате, даже если реально задействована лишь часть из них. Поскольку избыточность сводится к хранению целочисленных идентификаторов, она практически не нагружает систему. Выигрыш же — полная согласованность данных без дополнительных проверок в коде. Схема переведена в 3НФ, готова к заполнению и дальнейшей работе с SQL (сложные запросы, триггеры, хранимые процедуры).

Выводы

1. Нарушение 3НФ в исходной схеме вызвано транзитивной зависимостью формата фильма от зала через расписание.
2. Таблицы Film_Format и Hall_Format порождают риск несогласованности, позволяя назначить несовместимые формат и зал.
3. Полноценное устранение аномалии требует структурного изменения модели, а не добавления проверочных процедур.
4. Удаление промежуточных таблиц и создание единой таблицы Film_Hall_Format переводит схему в 3НФ.
5. Составной первичный ключ из ID_Film, ID_Hall, ID_Format гарантирует допустимость каждой тройки.
6. Новая таблица перечисляет все потенциально возможные сочетания фильмов, залов и форматов.
7. Решение вносит избыточность: комбинаций заносится больше, чем будет реально использоваться.
8. Избыточность ограничена хранением целочисленных идентификаторов, что практически не нагружает систему.
9. Выгода от исключения логических противоречий значительно превышает издержки небольшой избыточности.
10. Перенос контроля целостности на уровень декларативных ограничений БД надёжнее проверок в прикладном коде.
11. Полученная схема полностью готова к безопасному наполнению данными и построению расписания.
12. Описанный подход применим в любых системах, где требуется непротиворечивое пересечение трёх и более сущностей.

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

1. Какая нормальная форма была нарушена в исходной схеме и в чём конкретно выражалось это нарушение?
2. Почему таблица расписания могла содержать противоречивые данные о формате фильма и возможностях зала?
3. Что представляют собой таблицы Film_Format и Hall_Format и какую проблему они создают?
4. Почему вариант с написанием хранимой процедуры проверки не решает проблему 3НФ?
5. Какие две таблицы и почему необходимо удалить при переходе к новой схеме?
6. Какую таблицу предлагается создать вместо Film_Format и Hall_Format и какова её структура?
7. Почему в таблице Film_Hall_Format все три поля объявляются составным первичным ключом?
8. Каким образом новая таблица предотвращает появление несогласованных сочетаний фильма, зала и формата?
9. В чём заключается управляемая избыточность, возникающая после создания Film_Hall_Format?
10. Почему появившаяся избыточность считается приемлемой с практической точки зрения?
11. Какое преимущество достигается ценой этой избыточности?
12. Какая работа с базой данных планируется после приведения схемы к 3НФ?
Вернуться к учебному плану