Валюта Продажа валюты
Номер валюты продается Проданная.Номер валюты(FK)
Купленная.Номер валюты(FK)
Название валюты покупается
Рисунок 1.22 – Случай обязательности имен ролей
На рисунке 1.22 сущность Продажа валютысодержит информацию об акте обмены валюты, в котором участвуют две валюты – проданная и купленная. Информация о валютах содержится в сущности Валюта.Следовательно сущности Продажа валюты и Валюта должны быть связаны дважды и первичный ключ – Номер валюты должен дважды мигрировать в сущность Валютав качестве внешнего ключа. Необходимо различать эти атрибуты, которые содержат информацию о номере проданной и купленной валюты (имеют разный смысл), но ссылаются на одну и ту же сущность Валюта (имеют общую область значений). В данном примере атрибуты получили имена ролей Проданная и Купленная.
Другим примером обязательности присвоения имен ролей являются рекурсивные связи(иногда их называют «рыболовный крючок» - fish hook), когда одна и также сущность является и родительской и дочерней одновременно. При задании рекурсивной связи атрибут должен мигрировать в качестве внешнего ключа в состав неключевых атрибутов той же сущности. Атрибут не может появиться дважды в одной сущности под одним именем, поэтому обязательно должен получить имя роли. На рисунке 21 сущность «Сотрудник» содержит атрибут первичного ключа Табельный номер. Информация о руководителе сотрудника содержится в той же сущности, поскольку руководитель работает в той же организации. Чтобы сослаться на руководителя сотрудника следует создать рекурсивную связь (на рисунке связь руководит/подчиняется) и присвоить имя роли («Руководитель»). Причем рекурсивная связь может быть только неидентифицирующей. В противном случае внешний ключ должен был бы войти в состав первичного ключа и получить при генерации схемы признак NO NULL. Это сделало бы невозможным построение иерархии – у дерева подчиненности должен быть корень – сотрудник, который никому не подчиняется в рамках данной организации.
Связь руководит/подчиняется на рисунке 1.21 позволяет хранить древовидную иерархию подчиненности сотрудников. Такой вид рекурсивной связи называется иерархической рекурсией (hierarchical recursion)и задает связь, когда руководитель (экземпляр родительской сущности) может иметь множество подчиненных (экземпляров дочерней сущности). Но подчиненный имеет только одного руководителя (рис. 1.22)
Иерархическая рекурсия Сетевая рекурсия
Рисунок 1.22 - Подчиненность экземпляров сущности в иерархической и сетевой рекурсии
Другим видом рекурсии является сетевая рекурсия (network recursion), когда руководитель может иметь множество подчиненных, и наоборот, подчиненный может иметь множество руководителей. Сетевая рекурсия задает паутину отношений между экземплярами родительской и дочерней сущностей. Это случай, когда сущность находится сама с собой в связи многие-ко-многим. Для разрешения связи многие-ко-многим необходимо создать новую сущность (подробно связь многие – ко – многим будет рассмотрена ниже). На рисунке 1.23 рассмотрен пример реализации сетевой рекурсии. Структура моделирует родственные отношения между членами семьи любой сложности. Атрибут Тип отношения может принимать значения «отец-сын», «мать-дочь», «дед-внук», «свекровь-невестка», «тесть-зять» и т.д. Поскольку родственное отношение связывает всегда двух людей, от сущности Родственник к сущности Родственное отношение установлены две идентифицирующие связи с именами ролей «Старший» и «Младший». Каждый член семьи может быть в родственных отношениях с любым другим членом семьи, более того, одну и ту же пару родственников могут связывать разные типы родственных отношений.