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

Моделирование предметной области. Часть 2

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

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

В результате изучения лекции слушатель будет способен:
1. Определять сущности и их атрибуты для конкретной предметной области.
2. Обосновывать выбор составного первичного ключа из нескольких атрибутов.
3. Различать идентифицирующую и неидентифицирующую связи и корректно применять их при связывании таблиц.
4. Принимать решение об использовании естественных или суррогатных ключей на этапе даталогического проектирования.
5. Анализировать природу отношений между сущностями и выявлять связи «многие ко многим».
6. Оценивать, как интерпретация сущности (физический объект или информационная карточка) влияет на структуру базы данных.
7. Проектировать модель данных, находя компромисс между логической правильностью и эффективностью будущей физической реализации.
Показывать лекцию целиком
Краткое изложение
Введение

Мы продолжаем знакомство с моделированием баз данных. Сегодняшнее занятие посвящено проектированию конкретной предметной области — построению модели данных для сети кинотеатров. Поскольку механизм продажи билетов и организации сеансов всем хорошо знаком, мы пропустим формальное описание технического задания и сразу перейдём к моделированию. Работать мы будем в приложении ERwin Data Modeler (или аналоге), используя гибридную модель, сочетающую логический и физический уровни.

Базовые справочники: города и кинотеатры

Сущность «Город»
Предположим, что все кинотеатры сети находятся в одной стране, и города с одинаковыми названиями в ней отсутствуют. Это позволяет создать сущность Город (City) с единственным атрибутом Название города (CityName). Поскольку название уникально, оно может выступать в роли первичного ключа (Primary Key).

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

Сущность «Кинотеатр»
Переходим к сущности Кинотеатр (Cinema). В одном городе может находиться несколько кинотеатров. Адрес здания уникален в пределах города, но может повториться в разных городах. Поэтому первичный ключ должен быть составным: он включает Адрес (Address) и мигрировавший внешний ключ CityName.

Создаём идентифицирующую связь от сущности «Город» к сущности «Кинотеатр». Внешний ключ CityName становится частью первичного ключа кинотеатра. Комбинация (CityName, Address) однозначно идентифицирует каждый зал сети. В качестве вторичного атрибута добавим Название кинотеатра (CinemaName) — для удобства различения филиалов в речи.

 Справочники персонала и должностей

Сущность «Должность»
Создаём справочник Должность (JobTitle) с очевидным первичным ключом Наименование должности (TitleName). Добавим вторичный атрибут Описание (Description) для хранения должностных обязанностей.

Сущность «Персонал»
Для хранения данных о сотрудниках создаётся сущность Персонал (Personnel). Чтобы гарантировать уникальность, вводим Персональный номер (PersonnelNumber) как первичный ключ, несмотря на общий отказ от суррогатов (в реальной жизни это внутренний номер карточки сотрудника). Другие атрибуты: Имя (FirstName), Фамилия (LastName), Дата рождения (BirthDate) и Номер паспорта (PassportNumber).

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

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

Моделирование фильмов: карточка фильма и связи «многие ко многим»

Выбор интерпретации сущности
Переходим к самой тонкой части проектирования. Фильм может демонстрироваться в нескольких форматах: 2D, 3D, IMAX. Ключевой вопрос: считать ли один и тот же фильм в разных форматах разными сущностями (как разные физические плёнки) или одной (как информационную карточку)?

С точки зрения чистоты предметной области фильм для кинотеатра — это конкретная бобина с плёнкой, которая имеет формат. Однако мы выбираем интерпретацию в пользу будущей физической реализации и внешних приложений (по аналогии с карточкой фильма на IMDb). Мы рассматриваем фильм как информационный объект, без привязки к формату. Это упростит написание клиентского кода и работу фронтальных приложений, пусть даже ценой некоторого отхода от «идеальной» логики.

Сущность «Фильм»
Создаём сущность Фильм (Film). Попытка сделать первичный ключ на основе атрибутов Название (FilmName), Год выпуска (ReleaseYear) и Режиссёр наталкивается на проблему: у одного фильма может быть несколько режиссёров, а значит, режиссёр не может быть частью уникального идентификатора фильма. Кроме того, фильм может одновременно принадлежать к нескольким жанрам.

Решение находится элегантное: в реальной жизни каждый фильм получает прокатную лицензию с уникальным номером. Поэтому вводим атрибут Номер лицензии (LicenseNumber) и делаем его первичным ключом сущности «Фильм». Название и год выпуска становятся вторичными атрибутами, добавляется также Синопсис (Synopsis).

Связи «многие ко многим»
Для отражения того факта, что фильм может относиться к нескольким жанрам, сниматься несколькими режиссёрами и иметь множество актёров, мы сталкиваемся с отношениями «многие ко многим» (Many-to-Many). Для их разрешения необходимы дополнительные ассоциативные таблицы.

Предварительно создаются три справочные сущности:
Жанр (Genre) с первичным ключом Название жанра (GenreName).
Режиссёр (Director) с составным первичным ключом: Имя (FirstName), Фамилия (LastName), Дата рождения (BirthDate).
Актёр (Actor) с идентичным набором ключевых полей.

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

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

Процесс проектирования начинается с вычленения базовых справочников, выступающих фундаментом всей модели. На примере городов и кинотеатров сразу проявляется дилемма: использовать естественные ключи или суррогатные идентификаторы. Осознанный отказ от суррогатов на этапе даталогического анализа позволяет сохранить истинную природу связей — идентифицирующую миграцию ключа в дочернюю сущность, что напрямую влияет на понимание зависимости объектов. Составной ключ кинотеатра, объединяющий город и адрес, демонстрирует, как контекст родительской сущности формирует уникальность зависимой.

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

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

Лекция посвящена практическому построению модели данных для сети кинотеатров. Мы работаем на даталогическом уровне в ERwin Data Modeler, сознательно отказываясь от суррогатных ключей, чтобы лучше понять природу связей.

Базовые справочники

Город (City). Атрибут: CityName (первичный ключ). Мы исходим из того, что названия городов уникальны в пределах страны. Отказ от суррогатного ID сохраняет идентифицирующую связь, когда ключ мигрирует в дочернюю таблицу как часть её первичного ключа.
Кинотеатр (Cinema). Первичный ключ — составной: CityName (внешний ключ) и Address. Связь идентифицирующая. Вторичный атрибут: CinemaName.

Персонал и должности

Должность (JobTitle). Первичный ключ: TitleName, вторичный: Description.
Персонал (Personnel). Первичный ключ: PersonnelNumber. Атрибуты: имя, фамилия, дата рождения, номер паспорта. Внешний ключ TitleName ссылается на справочник должностей неидентифицирующей связью (пунктир), так как не входит в первичный ключ сотрудника.

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

Центральная проблема фильмов

Форматы и интерпретация
Фильм может идти в форматах 2D, 3D, IMAX. Ключевой выбор: считать ли это разными сущностями? Мы принимаем прагматичное решение в пользу физической реализации — фильм как информационная карточка (как на IMDb), а не как плёнка с форматом. Это упростит клиентские приложения.

Построение сущности «Фильм»
Начальный проект ключа: FilmName + ReleaseYear + Director. Но у фильма может быть несколько режиссёров, что разрушает атомарность ключа. Выход: введение номера прокатной лицензии (LicenseNumber) как естественного уникального ключа. FilmName и ReleaseYear становятся вторичными атрибутами, добавляется Synopsis.

Связи «многие ко многим»
Фильм может принадлежать к нескольким жанрам, иметь несколько режиссёров и актёров. Для этого создаются справочники:
Жанр (Genre): ключ GenreName.
Режиссёр (Director): составной ключ FirstName + LastName + BirthDate.
Актёр (Actor): аналогичный ключ.

Между «Фильмом» и этими справочниками возникают отношения «многие ко многим». Их реализуют через отдельные ассоциативные таблицы. Внешние ключи не могут быть просто добавлены в одну из сторон, так как один фильм требует множества ссылок.

Заключение

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

Выводы

1. Суррогатные ключи упрощают физический поиск, но на этапе даталогического проектирования их отсутствие помогает сохранить истинный характер связей.
2. Если внешний ключ входит в состав первичного ключа дочерней сущности, связь является идентифицирующей и отображается сплошной линией.
3. Для однозначной идентификации кинотеатра недостаточно одного адреса — требуется составной ключ, включающий город.
4. Неидентифицирующая связь возникает, когда внешний ключ играет роль лишь вторичного атрибута и не определяет уникальность записи.
5. Любую статическую таблицу можно сделать динамической, добавив механизмы версионирования или фиксации периода действия записи.
6. Интерпретация сущности может варьироваться от физического объекта (плёнка) до логического понятия (карточка фильма) в угоду оптимизации разработки.
7. Наличие у одной сущности нескольких значений одного атрибута (несколько режиссёров) делает невозможным включение этого атрибута в первичный ключ.
8. Номер лицензии является идеальным естественным ключом для фильма, так как гарантирует уникальность и стабильность.
9. Отношения «многие ко многим» требуют создания отдельных ассоциативных таблиц и не могут быть напрямую реализованы через внешний ключ в одной из исходных сущностей.
10. Состав ключа родительской таблицы полностью мигрирует в дочернюю при идентифицирующей связи, фиксируя логическую зависимость.
11. Справочные таблицы (жанры, должности) обычно имеют простой первичный ключ и описываются неидентифицирующими связями при ссылке на них.
12. Выбор типа ключа и связи всегда должен мотивироваться не только текущей логикой, но и предполагаемыми сценариями работы внешних приложений с базой.

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

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