Модель сущность-связь — различия между версиями
м (→Слабые сущности) (Метки: правка с мобильного устройства, правка из мобильной версии) |
м (Изменение размера картинок) (Метки: правка с мобильного устройства, правка из мобильной версии) |
||
Строка 49: | Строка 49: | ||
! style="background-color:#F0F8FF;" |Обозначение | ! style="background-color:#F0F8FF;" |Обозначение | ||
|- | |- | ||
− | |style="padding: | + | |style="padding: 3px" |Один |
− | |[[Файл:Db | + | |[[Файл:Db mandatory.png|50px]] |
|- | |- | ||
− | |style="padding: | + | |style="padding: 3px" | Много |
− | |[[Файл:Db many.png| | + | |[[Файл:Db many.png|50px]] |
|- | |- | ||
|Обязательный | |Обязательный | ||
− | |[[Файл:Db mandatory.png| | + | |[[Файл:Db mandatory.png|50px]] |
|- | |- | ||
− | |style="padding: | + | |style="padding:3px"| Необязательный |
− | |[[Файл:Db optional.png| | + | |[[Файл:Db optional.png|50px]] |
|} | |} | ||
Строка 70: | Строка 70: | ||
! style="background-color:#F0F8FF;" |По умолчанию | ! style="background-color:#F0F8FF;" |По умолчанию | ||
|- | |- | ||
− | |[[Файл:Many to many.png| | + | |style="padding: 2px"|[[Файл:Many to many.png|120px]] |
|Многие ко многим | |Многие ко многим | ||
− | |style="padding: | + | |style="padding: 2px"|Единственность, необязательность |
|- | |- | ||
− | |[[Файл:One to many.png| | + | |style="padding: 2px"|[[Файл:One to many.png|120px]] |
|Один ко многим | |Один ко многим | ||
|Единственность, обязательность | |Единственность, обязательность | ||
|- | |- | ||
− | |[[Файл:One to one.png| | + | |style="padding: 2px"|[[Файл:One to one.png|120px]] |
|Один к одному | |Один к одному | ||
|Единственность, обязательность | |Единственность, обязательность | ||
|- | |- | ||
|} | |} | ||
+ | |||
+ | '''Замечание:''' В дальнейшем будем считать, что значениями по умолчанию будет «один» и «необязательный». | ||
== Ассоциации == | == Ассоциации == |
Версия 21:55, 21 января 2021
Содержание
Сущности
Определение: |
Сущностью (англ. entity) называют некоторый объект, обладающий именем и атрибутами. |
Определение: |
Атрибутом (англ. attribute) называют некоторую характеристику объекта, содержащую имя атрибута и домен и обладающую некоторыми свойствами. |
Домен не указывает конкретный физический тип, однако позволяет указать, какие атрибуты будут иметь одинаковый тип в физической модели. Так, например, атрибуты $FirstName$ и $LastName$ сущности $Student$ будут обладать одним физическим типом.
Типы доменов:
- Простой — атомарное значение, например, $id$
- Составной — состоящий из нескольких значений, например,
passport { series: char(4), number: char(6) }
Свойства атрибутов:
Обозначение | Свойство |
---|---|
M | Обязательное (англ. mandatory) |
O | Необязательное (англ. optional) |
PK | Основной ключ (англ. primary key) |
Kn | Дополнительный ключ $n$ (англ. key) |
Связи
Связь обозначается линией с двумя концами и обладает следующими характеристиками:
- Имя
- Связываемые сущности и их роли
- Тип связи (задается типами концов)
На примере показано, что студен принадлежит одной группе, а в группе может быть несколько студентов (в том числе нуль).
Типы концов:
Тип | Обозначение |
---|---|
Один | |
Много | |
Обязательный | |
Необязательный |
Можно выбрать значение по умолчанию, которое будет обозначаться сплошной линией без символов.
Примеры:
Связь | Значение | По умолчанию |
---|---|---|
Многие ко многим | Единственность, необязательность | |
Один ко многим | Единственность, обязательность | |
Один к одному | Единственность, обязательность |
Замечание: В дальнейшем будем считать, что значениями по умолчанию будет «один» и «необязательный».
Ассоциации
Определение: |
Ассоциацией (англ. association) называется многосторонняя связь, нагруженная произвольными не ключевыми атрибутами. |
Замечания:
- Ассоциация обозначается прямоугольником с закругленными краями
- Может содержать не ключевые атрибуты
- Имеет произвольное количество концов с произвольными ролями и типами
Проанализируем пример. Контракт заключается с одним студентом, на одну специальность, которая может быть не указана на момент заключения контракта. У контракта должен быть один или более поручителей. Контракт нагружен информацией о датах, когда контракт был подготовлен (обязательный атрибут) и подписан (опциональный атрибут, поскольку контракт может быть подписан не сразу).
Как понять, что использовать: ассоциацию, связь или сущность?
- Если нужно два конца и нет нагруженности, используем связь
- Если нужно идентифицировать, используем сущность, поскольку связь не идентифицируется из-за отсутствия ключевых элементов
- Иначе используется ассоциация
Многосторонние ассоциации
Многостороннюю ассоциацию можно интерпретировать по-разному. Так, например, на рисунке может быть обозначено следующее:
- У каждого контракта есть один поручитель
- Можно быть поручителем у ровно одного контракта
Также существуют обобщенные ограничения (англ. generic), позволяющие зафиксировать произвольное подмножество.
Слабые сущности
Определение: |
Слабой сущностью называется сущность, у которой недостаточно атрибутов для идентификации. |
Слабая сущность обозначается прямоугольником с двойной границей.
Определение: |
Идентифицирующей связью называется связь, позволяющая слабой сущности получить атрибуты, необходимые для ее идентификации. |
Идентифицирующая связь обозначается двойной сплошной линией.
Например, название учебной группы уникально в рамках одного университета. Если же мы будем рассматривать несколько университетов, для идентификации группы будет недостаточно лишь ее названия. В таком случае можно считать группу слабой сущностью, для идентификации которой необходим университет.
Альтернативные нотации
Выше рассматривалась нотация Crow's foot, предложенная Гордоном Эверестом.
Нотация Питера Чена
Модель Сущность-связь была предложена Питером Ченом в 1976 году, им же была предложена следующая графическая нотация:
UML-нотация
Для каждой таблицы явно подписывается, что она обозначает (ассоциацию, сущность и т.д.). Ограничения прописываются в виде $i..k$ (например, $1..n$), это позволяет наложить ограничение $2..n$, что было невозможно в Crow's foot.
Object Definition Language
class Student { int Id; string Name; Group group inverse Group::Students; } class Group { int id; Set<Student> students inverse Student::group; }