Сущность связей и связь сущностей
Сущности и связи
Самым простым и распространенным способом описания реляционной модели данных является диаграмма сущностей и связей.
Давайте вернемся к нашему примеру с авиаперевозками. Какую информацию можно извлечь из постановки (user stories), описанных в предыдущей главе? Города, расписание рейсов, самолеты, бронирование билетов, билеты, информация о пассажирах, и т.д. Обратите внимание, всю информацию можно поделить на три типа:
- Данные. Например, ФИО пассажира, название города, дата билета, модель самолета. Эти данные представляют основной интерес. Ради них, собственно, и формируется БД. Эти данные называются атрибутами сущности.
- Классы одинаковых объектов. Например, города, самолеты, билеты, перелеты. Эти классы объектов формируют структуру БД, ту самую схему. Собственно, эти классы объектов и называются сущностями. При этом, у нас имеются конкретные город, модель самолета, билет, выписанный конкретному пассажиру. Эти объекты именуются экземпляром (объектом, записью).
- Взаимосвязи. Данные между собой взаимосвязанны. Например, билет принадлежит конкретному пассажиру; город находится в конкретной стране; перелет происходит на конкретном самолете. Эти взаимосвязи как раз и называются связью (отношением).
Из этих элементов и состоит диаграмма сущностей и связей (entity-relationship diagram, ERD).
Итак, сущность - это класс однотипных объектов, из которых состоит схема БД. Она определяется набором атрибутов. Собственно, вокруг сущностей и строится предметная область.
Если мы обратим внимание на реальную жизнь, то увидим, что сущности между собой взаимосвязаны:
- у гражданина есть паспорт
- у родителей есть дети
- студенты учатся в группе
- у книг есть автор
- у авиакомпании есть самолеты, на которых производятся рейсы, на которые продаются билеты для пассажиров
Это и есть связи (отношения, relationships) между сущностями. Связи можно классифицировать по типу и модальности
Типы связей
- Один-к-одному (one-to-one) - один экземпляр первой сущности связан с одним экземпляром второй сущности. Данный вид связи встречается редко. В основном служит для декомпозиции сущности с какой-либо целью.
- Один-ко-многим (one-to-many) - один экземпляр первой сущности связан с несколькими экземплярами второй сущности. Самый распространенный тип связи.
- Много-ко-многим (many-to-many) - каждый экземпляр первой сущности связан с несколькими экземплярами второй сущности. Этот тип связи временный и допустим только на ранних этапах разработки. Затем, чаще всего, он заменяется двумя связями один-ко-многим и промежуточной сущностью.
Для определения связей удобно использовать фразы "сущность А принадлежит сущности Б" ("A belongs to B") и "у сущности А имеется сущность Б" ("A has many/one B"). Взгляните на примеры и попробуйте определить тип связи. При этом, важно взглянуть на связь с обеих сторон:
- одна Книга принадлежит нескольким Авторам. У одного Автора имеются несколько Книг. Это связь много-ко-многим.
- В одной Группе имеются несколько Студентов. Один Студент принадлежит одной Группе. Это связь один-ко-многим (одна группа - много студентов)
- У одного Гражданина имеется один Паспорт. Один Паспорт принадлежит одному Гражданину. Это связь один-к-одному (опустим на этот раз тот факт, что гражданин меняет паспорт в течение жизни)
Стоит заметить, что некоторые формулировки звучат не совсем по-русски. Например, фраза "в группе учатся студенты" звучит лучше. На самом деле, глагол не имеет особого значения, т.к. по форме фразы можно понять, какая подразумевается связь (в крайнем случае, любую фразу можно привести к форме со словом "принадлежит" или "имеется"). Собственно, это навык, который необходимо развить. И немного практики быстро повысят уровень мастерства проектирования предметной области.
В связях важно определить, какая из сущностей является родительской, а какая - дочерней (зависимой). Зачем это важно - станет понятно в следующих главах. Это актуально для связей один-к-одному. В связях один-ко-многим зависимая всегда та, которых "много" (студенты в связи "Группа - Студент"). В связях много-ко-многим обе сущности родительские.
Модальность
Еще одной характеристикой связи является модальность.
Существует 2 вида модальности:
- Может - экземпляр первой сущности может быть связан с одним, несколькими или вообще не связан с экземплярами второй сущности.
- Должен - экземпляр первой сущности обязан быть связан не менее чем с одним экземпляром второй сущности.
Как определить? Построить фразу:
<Каждый экземпляр 1 сущности><Модальность><Вид связи><Тип связи><Экземпляр второй сущности>
Пример:
- <Каждый преподаватель> <может> <преподавать> <несколько> <предметов>
- <Каждый предмет> <обязан> <принадлежать> <не менее чем одному> <преподавателю>
ERD
Одним из самых популярных способов изображения сущностей и связей является диаграмма сущностей и связей (entity-relationship diagram, ERD). При этом имеется различные нотации. Мы разберем и будем использовать одну из них (Crow's Foot, aka Fork, Inverted Arrow, воронья лапка, предложенная Гордоном Эверестом).
Диаграмма строится по следующим правилам:
- Сущность изображается прямоугольником;
- Связь изображается линией между соответствующими прямоугольниками;
- На концах линии изображен тип (вилка или просто линии) и модальность связи (налицие нолика).
--+
|-o|-- один или ноль
--+
--+
|-||-- один (и только один)
--+
--+
|\
|-o--- ноль или много
|/
--+
--+
|\
|-|--- один или много
|/
--+
- Также можно писать название связи: сверху - левого, снизу - правого.
Пример. В данном примере имеются некоторые отличия (взято из IDEF1X):
- необязательная связь изображена пунктирной линией;
- имеется "отношение категоризации" (круг, от которого идет две линии), эквивалентное по смыслу "иерархической связи".
Также имеются альтернативные способы описания схемы БД, с которыми вы можете познакомиться самостоятельно.
Best Practices
Есть некоторые общепринятые правила именования сущностей, связей и атрибутов. Некоторые правила могут отличаться в различных сообществах, но важно в рамках одного проекта придерживаться одного принятого командой стандарта.
- Сущности именуются в
CamelCase
илиsnake_case
. - Сущности именуются в единственном или множественном числе.
- Сущности и атрибуты именуются на правильном английском языке (учитывая множественное число, если необходимо).
- Идентификатор сущности именуется
id
,ID
илиentity_name_id
. - Идентификатор связанной сущности именуется
foreign_entity_name_id
в единственном числе.
Глоссарий
ER-модель (entity-relationship model/сущность-связь) - модель данных, конструкция, позволяющая проектировать схему базы данных, с помощью графических средств (ER-диаграмм).
ER-диаграмма (ERD) - графическое изображение сущностей предметной области, их атрибутов и связей. ER-диаграмма может быть концептуальной (не учитывать особенности бд) и физической.
Сущность (Entity) - класс однотипных объектов. То, что представляет интерес для пользователя базы данных.
Экземпляр сущности (Instance) - конкретный элемент сущности. Синонимы: объект (object), запись (record).
Атрибут сущности (attribute) - именованная характеристика, являющаяся некоторым свойством сущности.
Ключ сущности - не избыточный набор атрибутов, значения которых в совокупности является уникальным.
Связь (relationship) - некоторая ассоциация между двумя сущностями. Синоним: отношение (relationship).
Вопросы
- Что такое бронирование и расписание? К какому типу информации они относятся?
- Определите типа связей в выражениях из этой главы.
- Почему в связи много-ко-многим обе сущности родительские? Как такое возможно?
- Как реализовать связь много-ко-многим?
- Проведите сравнительный анализ различных способов представления схемы БД. Какие плюсы и минусы имеются у каждого из них?