Learning Platform
Глоссарий Troubleshooting
Урок 04.01 · 19 мин
Начальный
er-modelingentityattributerelationship

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. Идентификаторам посвящён отдельный модуль про ключи; здесь достаточно знать, что у сущности обязательно есть чем отличить её экземпляры друг от друга.

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

Сущность и её атрибуты
Сущность: КлиентТип сущности — класс объектов предметной области, о которых хранятся данные. В будущем станет таблицей.
описывается атрибутами
Атрибуты: id, имя, email, телефонСвойства сущности. Отвечают на вопрос, что мы знаем о клиенте. В будущей таблице станут колонками. id — идентификатор.

Relationship — связь

Связь (relationship) — это ассоциация между сущностями: как они соотносятся друг с другом в предметной области. Если сущности — существительные, то связи — глаголы: «Клиент делает Заказ», «Заказ содержит Товары», «Преподаватель ведёт Курс».

Связь, как и сущность, имеет два уровня:

  • Тип связи — класс ассоциации: «Клиент делает Заказ» как правило.
  • Экземпляр связи — конкретная пара: «Клиент Иван делает Заказ номер 100».

У связи есть две важные характеристики, которые делают её точной.

Степень связи (degree) — сколько типов сущностей в ней участвует. Чаще всего связь бинарная — между двумя сущностями (Клиент — Заказ). Бывают унарные (рекурсивные) — сущность связана сама с собой (Сотрудник руководит Сотрудником). Реже — тернарные, между тремя сущностями.

Кардинальность (cardinality) — сколько экземпляров одной сущности может быть связано с экземпляром другой. Три основных вида:

  • один-к-одному (1:1) — одному экземпляру A соответствует не более одного экземпляра B;
  • один-ко-многим (1:N) — одному экземпляру A соответствует много экземпляров B, но каждому B — один A; самый частый вид;
  • многие-ко-многим (M:N) — экземпляру A соответствует много B, и экземпляру B — много A.

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

Связь между сущностями: глагол с кардинальностью
КлиентПервая сущность связи. Со стороны клиента кардинальность — один: у заказа ровно один клиент.
делает (1 : N)
ЗаказВторая сущность связи. Со стороны заказа кардинальность — многие: у клиента может быть много заказов.

Связь читается в обе стороны: «один Клиент делает много Заказов» и «один Заказ принадлежит одному Клиенту». Привычка проговаривать связь в обе стороны помогает не ошибиться в кардинальности.

Как три элемента собираются в модель

ER-модель — это сущности, соединённые связями, где у каждой сущности есть атрибуты. Соберём небольшую модель проката автомобилей.

Сущности: Клиент, Автомобиль, Аренда.

Атрибуты:

  • Клиент: id, имя, телефон, водительское удостоверение;
  • Автомобиль: id, марка, госномер, год выпуска;
  • Аренда: id, дата начала, дата окончания, стоимость.

Связи:

  • Клиент оформляет Аренду — один-ко-многим (один клиент может оформить много аренд, у каждой аренды один клиент);
  • Автомобиль участвует в Аренде — один-ко-многим (один автомобиль за свою жизнь сдаётся много раз, у каждой аренды один автомобиль).
ER-модель проката: три сущности, две связи
КлиентСущность Клиент. Атрибуты: id, имя, телефон, водительское удостоверение. Идентификатор — id.
оформляет (1:N)
АрендаСущность Аренда. Атрибуты: id, дата начала, дата окончания, стоимость. Связывает клиента и автомобиль.
участвует в (1:N)
АвтомобильСущность Автомобиль. Атрибуты: id, марка, госномер, год выпуска. Идентификатор — id.

Это полная conceptual/logical ER-модель маленькой системы. Из неё прямо следует структура таблиц — правила трансформации мы разберём в последнем уроке модуля.

От ER к DDL — как сущности превращаются в CREATE TABLE

Как находить элементы в тексте требований

Полезный практический приём: элементы ER-модели можно «вытащить» прямо из текста требований по частям речи.

  • Существительные — кандидаты в сущности и атрибуты. «Клиент», «заказ», «товар» — сущности; «имя», «цена» — атрибуты.
  • Глаголы — кандидаты в связи. «Клиент оформляет заказ», «заказ включает товары».
  • Числительные и слова о количестве — подсказки про кардинальность. «У клиента может быть несколько адресов» — связь один-ко-многим.

Возьмём требование: «Покупатель оформляет заказы. Каждый заказ содержит товары. У товара есть категория». Разбор: сущности — Покупатель, Заказ, Товар, Категория (существительные); связи — «оформляет», «содержит», «есть» (глаголы); кардинальность уточняется вопросами к бизнесу.

TIP

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

Сущность или атрибут: типичная развилка

Частый вопрос новичка: «адрес» — это отдельная сущность или атрибут Клиента? Однозначного ответа нет, он зависит от предметной области.

  • Если адрес — это просто строка, которую хранят и показывают, и у клиента он один — это атрибут Клиента.
  • Если адресов у клиента несколько (домашний, рабочий, для доставки), либо адрес имеет собственные свойства и связи (например, к нему привязаны зоны доставки) — это отдельная сущность Адрес, связанная с Клиентом.
NOTE

Это решение — хороший пример того, что моделирование зависит от требований, а не от «правильного ответа из учебника». Один и тот же «адрес» в интернет-магазине с доставкой и в простом сервисе подписки моделируется по-разному. Правило-ориентир: если у «нечто» больше одного свойства, либо его может быть несколько, либо у него есть свои связи — это, скорее всего, сущность, а не атрибут.

Попробуй сам

Возьмите текст требований: «Школа онлайн-курсов. Студенты записываются на курсы. Каждый курс ведёт преподаватель. У курса есть уроки. Студент получает оценки за уроки». Разберите текст по частям речи: выпишите все существительные как кандидатов в сущности, все глаголы как кандидатов в связи. Затем включите мышление: решите, что действительно сущность, а что — атрибут (например, «оценка» — сущность или атрибут?). Для каждой сущности придумайте 3-4 атрибута и отметьте идентификатор. Для каждой связи проговорите её в обе стороны и предположите кардинальность. Нарисуйте получившуюся ER-модель из прямоугольников и линий. Сохраните её — в следующих уроках модуля вы будете её уточнять.


Проверка знанийKnowledge check
Назовите три строительных блока ER-моделирования и объясните, что такое степень и кардинальность связи и почему связь — это не просто линия между сущностями.
ОтветAnswer
Три строительных блока ER-моделирования: сущность (entity) — объект или понятие предметной области, о котором хранятся данные, «существительное»; атрибут (attribute) — свойство сущности, отвечает на вопрос «что мы знаем о ней», у каждого атрибута есть домен (множество допустимых значений); связь (relationship) — ассоциация между сущностями, «глагол». Связь — не просто линия, потому что у неё есть две точные характеристики. Степень связи (degree) — сколько типов сущностей в ней участвует: бинарная (две сущности, самый частый случай), унарная или рекурсивная (сущность связана сама с собой), тернарная (три сущности). Кардинальность (cardinality) — сколько экземпляров одной сущности может быть связано с экземпляром другой: один-к-одному (1:1), один-ко-многим (1:N, самый частый вид), многие-ко-многим (M:N). Кардинальность критически важна, потому что она напрямую определяет, как связь превратится в таблицы. Поэтому связь на ER-диаграмме — это всегда линия с указанной степенью и кардинальностью, а не безымянная черта, и читать её нужно в обе стороны.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 4. Чем тип сущности (entity type) отличается от экземпляра сущности (entity instance)?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5