Entities, attributes, relationships — строительные блоки
ER-моделирование (Entity-Relationship modeling) — это техника описания структуры данных через три элемента: сущности, атрибуты и связи. Модель Entity-Relationship придумал Питер Чен (Peter Chen) в 1976 году, и с тех пор это самый распространённый язык для проектирования conceptual- и logical-моделей. Когда вы рисуете «таблички со стрелочками» перед тем, как писать CREATE TABLE, — вы делаете именно ER-моделирование.
В прошлом модуле вы уже неформально рисовали сущности и связи на бумаге. Этот урок превращает интуицию в строгий инструмент. Три элемента — это весь алфавит ER-моделирования, и из них собирается любая модель.
Entity — сущность
Сущность (entity) — это объект или понятие предметной области, о котором система хранит данные. Сущности — это «существительные» вашей предметной области.
Для интернет-магазина сущности: Клиент, Заказ, Товар, Категория. Для университета: Студент, Преподаватель, Курс, Аудитория. Для проката: Клиент, Автомобиль, Аренда.
Важно различать два понятия:
- Тип сущности (entity type) — это класс, шаблон: «Клиент» вообще, как понятие. Именно типы сущностей рисуют на ER-диаграмме.
- Экземпляр сущности (entity instance) — конкретный представитель: «Клиент Иван Петров с id 42». Экземпляры — это строки в будущей таблице.
В обиходе слово «сущность» употребляют для обоих, и обычно из контекста ясно, что имеется в виду. На диаграмме вы всегда работаете с типами; экземпляры появляются, когда базу наполняют данными.
Как выбрать, что является сущностью? Сущность — это то, что:
- имеет самостоятельное существование в предметной области;
- о чём нужно хранить несколько свойств;
- чего может быть много экземпляров.
Если «нечто» имеет ровно одно свойство — это, скорее всего, не сущность, а атрибут чего-то другого.
Attribute — атрибут
Атрибут (attribute) — это свойство, характеристика сущности. Атрибуты отвечают на вопрос «что мы знаем о сущности».
У сущности Клиент атрибуты: имя, email, телефон, дата регистрации. У сущности Товар: название, цена, вес, артикул. В будущей таблице атрибуты станут колонками.
У каждого атрибута есть домен (domain) — множество допустимых значений. Домен атрибута «возраст» — целые числа от 0 до примерно 150. Домен атрибута «email» — строки определённого формата. Домен — это понятие, которое на физическом уровне превратится в тип данных плюс ограничения (CHECK, NOT NULL).
Среди атрибутов один или несколько играют особую роль — идентификатора (ключа): они уникально отличают один экземпляр сущности от другого. У Клиента это может быть id или email. Идентификаторам посвящён отдельный модуль про ключи; здесь достаточно знать, что у сущности обязательно есть чем отличить её экземпляры друг от друга.
Атрибуты бывают разных видов — простые и составные, однозначные и многозначные, хранимые и вычисляемые. Это важная классификация, и ей посвящён следующий урок целиком.
Relationship — связь
Связь (relationship) — это ассоциация между сущностями: как они соотносятся друг с другом в предметной области. Если сущности — существительные, то связи — глаголы: «Клиент делает Заказ», «Заказ содержит Товары», «Преподаватель ведёт Курс».
Связь, как и сущность, имеет два уровня:
- Тип связи — класс ассоциации: «Клиент делает Заказ» как правило.
- Экземпляр связи — конкретная пара: «Клиент Иван делает Заказ номер 100».
У связи есть две важные характеристики, которые делают её точной.
Степень связи (degree) — сколько типов сущностей в ней участвует. Чаще всего связь бинарная — между двумя сущностями (Клиент — Заказ). Бывают унарные (рекурсивные) — сущность связана сама с собой (Сотрудник руководит Сотрудником). Реже — тернарные, между тремя сущностями.
Кардинальность (cardinality) — сколько экземпляров одной сущности может быть связано с экземпляром другой. Три основных вида:
- один-к-одному (1:1) — одному экземпляру A соответствует не более одного экземпляра B;
- один-ко-многим (1:N) — одному экземпляру A соответствует много экземпляров B, но каждому B — один A; самый частый вид;
- многие-ко-многим (M:N) — экземпляру A соответствует много B, и экземпляру B — много A.
Кардинальность — критически важная характеристика, она напрямую определяет, как связь превратится в таблицы. Ей и оптциональности посвящён отдельный модуль; здесь важно усвоить сам факт, что связь — это не просто линия, а линия с указанной кардинальностью.
Связь читается в обе стороны: «один Клиент делает много Заказов» и «один Заказ принадлежит одному Клиенту». Привычка проговаривать связь в обе стороны помогает не ошибиться в кардинальности.
Как три элемента собираются в модель
ER-модель — это сущности, соединённые связями, где у каждой сущности есть атрибуты. Соберём небольшую модель проката автомобилей.
Сущности: Клиент, Автомобиль, Аренда.
Атрибуты:
- Клиент: id, имя, телефон, водительское удостоверение;
- Автомобиль: id, марка, госномер, год выпуска;
- Аренда: id, дата начала, дата окончания, стоимость.
Связи:
- Клиент оформляет Аренду — один-ко-многим (один клиент может оформить много аренд, у каждой аренды один клиент);
- Автомобиль участвует в Аренде — один-ко-многим (один автомобиль за свою жизнь сдаётся много раз, у каждой аренды один автомобиль).
Это полная conceptual/logical ER-модель маленькой системы. Из неё прямо следует структура таблиц — правила трансформации мы разберём в последнем уроке модуля.
От ER к DDL — как сущности превращаются в CREATE TABLEКак находить элементы в тексте требований
Полезный практический приём: элементы ER-модели можно «вытащить» прямо из текста требований по частям речи.
- Существительные — кандидаты в сущности и атрибуты. «Клиент», «заказ», «товар» — сущности; «имя», «цена» — атрибуты.
- Глаголы — кандидаты в связи. «Клиент оформляет заказ», «заказ включает товары».
- Числительные и слова о количестве — подсказки про кардинальность. «У клиента может быть несколько адресов» — связь один-ко-многим.
Возьмём требование: «Покупатель оформляет заказы. Каждый заказ содержит товары. У товара есть категория». Разбор: сущности — Покупатель, Заказ, Товар, Категория (существительные); связи — «оформляет», «содержит», «есть» (глаголы); кардинальность уточняется вопросами к бизнесу.
Этот приём — отличная стартовая точка, но не финал. Не каждое существительное станет сущностью (некоторые — атрибуты, некоторые вообще лишние), не каждый глагол — связью. Разбор по частям речи даёт черновой список, а дальше включается мышление: что действительно нужно хранить, что чем является. Но начать с разбора текста гораздо лучше, чем со взгляда в пустой экран.
Сущность или атрибут: типичная развилка
Частый вопрос новичка: «адрес» — это отдельная сущность или атрибут Клиента? Однозначного ответа нет, он зависит от предметной области.
- Если адрес — это просто строка, которую хранят и показывают, и у клиента он один — это атрибут Клиента.
- Если адресов у клиента несколько (домашний, рабочий, для доставки), либо адрес имеет собственные свойства и связи (например, к нему привязаны зоны доставки) — это отдельная сущность Адрес, связанная с Клиентом.
Это решение — хороший пример того, что моделирование зависит от требований, а не от «правильного ответа из учебника». Один и тот же «адрес» в интернет-магазине с доставкой и в простом сервисе подписки моделируется по-разному. Правило-ориентир: если у «нечто» больше одного свойства, либо его может быть несколько, либо у него есть свои связи — это, скорее всего, сущность, а не атрибут.
Попробуй сам
Возьмите текст требований: «Школа онлайн-курсов. Студенты записываются на курсы. Каждый курс ведёт преподаватель. У курса есть уроки. Студент получает оценки за уроки». Разберите текст по частям речи: выпишите все существительные как кандидатов в сущности, все глаголы как кандидатов в связи. Затем включите мышление: решите, что действительно сущность, а что — атрибут (например, «оценка» — сущность или атрибут?). Для каждой сущности придумайте 3-4 атрибута и отметьте идентификатор. Для каждой связи проговорите её в обе стороны и предположите кардинальность. Нарисуйте получившуюся ER-модель из прямоугольников и линий. Сохраните её — в следующих уроках модуля вы будете её уточнять.