Изменения

Перейти к: навигация, поиск

Модель сущность-связь

4444 байта добавлено, 23:11, 21 января 2021
Object Definition Language
|Дополнительный ключ $n$ (англ. ''key'')
|}
 
'''Замечания:'''
* Так как любой атрибут обладает либо свойством обязательности, либо свойством необязательности, будем считать атрибуты необязательными по умолчанию, не указывая это свойство явно.
* Основной ключ можно выделить, подчеркнув атрибуты, входящие в него, сплошной линией.
== Связи ==
! style="background-color:#F0F8FF;" |Обозначение
|-
|style="padding: 10px3px" |Один|[[Файл:Db onemandatory.png|100px50px]]
|-
|style="padding: 10px3px" | Много|[[Файл:Db many.png|100px50px]]
|-
|Обязательный
|[[Файл:Db mandatory.png|100px50px]]
|-
|style="padding:20px3px"| Необязательный|[[Файл:Db optional.png|100px50px]]
|}
! style="background-color:#F0F8FF;" |По умолчанию
|-
|style="padding: 2px"|[[Файл:Many to many.png|200px120px]]
|Многие ко многим
|style="padding: 10px2px"|Единственность, необязательность
|-
|style="padding: 2px"|[[Файл:One to many.png|200px120px]]
|Один ко многим
|Единственность, обязательность
|-
|style="padding: 2px"|[[Файл:One to one.png|200px120px]]
|Один к одному
|Единственность, обязательность
|-
|}
 
'''Замечание:''' В дальнейшем будем считать, что значениями по умолчанию будет «один» и «необязательный».
== Ассоциации ==
[[Файл:Db erm contract.png|400px|thumb|left|Пример с ассоциацией]]
Проанализируем пример. Контракт заключается со обязательным и единственным с одним студентом , на одну специальность, которая может быть не указана на момент заключения контракта. У контракта должен быть один или более поручителей. Контракт нагружен информацией о датах, когда котракт контракт был подготовлен (обязательный атрибут) и подписан (опциональный атрибут, поскольку контракт может быть подписан не сразу).
'''Как понять, что использовать: ассоциацию, связь или сущность?'''
* Иначе используется ассоциация
===Многосторонние ассоциации===[[Файл:Association неопределнность нотации.png|thumb|right|400px350px|Пример неоднозначности интерпретации связей]]
Многостороннюю ассоциацию можно интерпретировать по-разному. Так, например, на рисунке может быть обозначено следующее:
* У каждого контракта есть один поручитель
* Можно быть поручителем у ровно одного контракта
 
{| class="wikitable" style="background-color:#FFF; text-align:center"
|'''Ограничение по Чену''' <br /> (англ. ''Chen-like'', ''Look-across'')
|[[Файл:Chen-like.png|350px]]
|style="padding: 10px;"|Зафиксировав остальные сущности, получаем<br/> ограничение на рассматриваемую. <br/> У каждого контракта есть поручитель.
|-
|'''Ограничение по Мерис''' <br /> (англ. ''Merise-like'', ''Look-here'')
|[[Файл:Merise-like.png|350px]]
|style="padding: 10px;"|Ограничение непосредственно на сущность. <br/> Можно быть поручителем у одного контракта.
|}
Также существуют '''обобщенные ограничения''' (англ. ''generic''), позволяющие зафиксировать произвольное подмножество.
[[Файл:Все ограничения.png|600px]]
 
=== Выразительная мощность ограничений ===
* Для ассоциаций с двумя концами:
** Чен = Мерис = Обобщенные
* Для ассоциаций с тремя концами:
** Чен + Мерис = Обобщенные
* Для ассоциации с четырьмя и более концами:
** Чен + Мерис < Обобщенные
== Слабые сущности ==
|definition =
'''Слабой сущностью''' называется сущность, у которой недостаточно атрибутов для идентификации.}}
Слабая сущность обозначается двойным прямоугольникомс двойной границей.
{{Определение
|definition =
== Альтернативные нотации ==
Выше рассматривалась нотация '''Crow's foot''', предложенная Гордоном Эверестом.
===Нотация Питера Чена===
Модель Сущность-связь была предложена Питером Ченом в 1976 году, им же была предложена следующая графическая нотация:
 
[[Файл:Нотация Питера Чена.png|600px]]
 
===UML-нотация===
Для каждой таблицы явно подписывается, что она обозначает (ассоциацию, сущность и т.д.). Ограничения прописываются в виде $i..k$ (например, $1..n$), это позволяет наложить ограничение $2..n$, что было невозможно в Crow's foot.
 
[[Файл:UML-нотация.png|400px]]
 
===Object Definition Language===
Позволяет задавать схему базы данных кодом.
 
Рассмотрим пример. У студента есть идентификатор <code>Id</code>, имя <code>Name</code>, а также ссылка на группу <code>group</code>. Явно указываем, что противоположностью этой ссылки является соответствующее поле класса <code>Group</code>: <code>inverse Group::students</code>.
 
У группы есть <code>Id</code> и смножество студентов <code>students</code>, учащихся в группе. Указываем, что у студентов ссылка хранится в поле <code>group</code>.
 
В данном примере выражена связь один ко многим: студент зачислен в одну группу, в каждой группе есть несколько студентов.
 
'''class''' Student {
int Id;
string Name;
Group group inverse Group::students;
}
'''class''' Group {
int id;
Set<Student> students inverse Student::group;
}
128
правок

Навигация