Связь является логическим соотношением между сущностями. Каждая связь должна именоваться глаголом или глагольной фразой (Relationship Verb Phrases) (рис. 11). Имя связи выражает некоторое ограничение или бизнес-правило и облегчает чтение диаграммы, например:
· Каждый ОТДЕЛ <включает> СОТРУДНИКов;
· Каждый СОТРУДНИК <работает> в ОТДЕЛе;
Рис. 11. Имя связи - Relationship Verb Phrases
Связь показывает, какие именно сотрудники работают в отделе. По умолчанию имя связи на диаграмме не показывается. Для отображения имени следует в контекстном меню, которое появляется, если щелкнуть левой кнопкой мыши по любому месту диаграммы, не занятому объектами модели, выбрать пункт Relationship Display и затем включить опцию Verb Phrase.
На логическом уровне можно установить идентифицирующую связь один-ко-многим, связь многие-ко-многим и неидентифицирующую связь один-ко-многим (соответственно это кнопки слева направо в палитре инструментов).
При установлении идентифицирующей связи атрибуты первичного ключа родительской сущности автоматически переносятся в состав первичного ключа дочерней сущности (рис.12). Эта операция дополнения атрибутов дочерней сущности при создании связи называется миграцией атрибутов. В дочерней сущности новые атрибуты помечаются как внешний ключ - (FK).
Рис. 12. Идентифицирующая связь между независимой и зависимой таблицей
При установлении неидентифицирующей связи (рис. 13) дочерняя сущность остается независимой, а атрибуты первичного ключа родительской сущности мигрируют в состав неключевых компонентов родительской сущности. Неидентифицирующая связь служит для связывания независимых сущностей. Экземпляр сущности Сотрудник может существовать безотносительно к какому-либо экземпляру сущности Отдел, т. е. сотрудник может работать в организации, не числясь в каком-либо отделе. В этом случае сущность Сотрудник будет ссылающейся.
|
Рис. 13. Обязательная неидентифицирующая связь
Идентифицирующая связь показывается на диаграмме сплошной линией с жирной точкой на дочернем конце связи (см. рис. 12), неидентифицирующая - пунктирной (рис. 13).
Для создания новой связи следует:
- установить курсор на нужной кнопке в палитре инструментов ToolBox (идентифицирующая или неидентифицирующая связь) и нажать левую кнопку мыши;
- щелкнуть сначала по родительской, а затем по дочерней сущности.
Форму линии связи можно изменить. Для этого нужно захватывать мышью нужную линию связи и переносить ее с места на место, пока линия не начнет выглядеть лучше.
В палитре инструментов кнопка соответствует идентифицирующей связи, кнопка связи многие-ко-многим и кнопка соответствуют неидентифицирующей связи.
Для редактирования свойств связи следует "кликнуть" правой кнопкой мыши по связи и выбрать на контекстном меню пункт Relationship Properties, либо дважды кликнуть мышью по связи.
В закладке General диалога можно задать мощность, имя и тип связи (рис. 14).
Мощность связи (Cardinality) - служит для обозначения отношения числа экземпляров родительской сущности к числу экземпляров дочерней. Различают четыре типа мощности. Чаще выбирают наиболее общий случай Zero, One or More, когда одному экземпляру родительской сущности соответствуют 0, 1 или много экземпляров дочерней сущности не помечается каким-либо символом (связь один ко многим). По умолчанию символ, обозначающий мощность связи, не показывается на диаграмме. Для отображения имени следует в контекстном меню, которое появляется, если щелкнуть левой кнопкой мыши по любому месту диаграммы, не занятому объектами модели, выбрать пункт Relationship Display и затем включить опцию Cardinality.
|
Рис. 14. Диалог Relationship Properties
Имя связи (Verb Phrase) - фраза, характеризующая отношение между родительской и дочерней сущностями. Для связи один-ко-многим идентифицирующей или неидентифицирующей достаточно указать имя, характеризующее отношение от родительской к дочерней сущности (Parent-to-Child). Для связи многие-ко-многим следует указывать имена как Parent-to-Child так и Child-to-Parent.
Тип связи (идентифицирующая/неидентифицирующая). Для неидентифицирующей связи можно указать обязательность (Nulls).
Группа переключателей Nulls - позволяет определить для атрибута внешнего ключа возможность содержать неопределенное значение (Nulls Allowed). В большинстве случаев следует запретить иметь неоапределенные значения (No Nulls). Исключение составляет ситуация, когда в сущности присутствуют атрибуты, имеющие альтернативный характер (заполнен может только один из атрибутов в каждой строке). Например, в сущности могут присутствовать аттрибуты Код поощрения и Код взыскания. В каждой записи может быть заолнен только один из атрибутов (либо поощрение, либо взыскание). В таком случае данные атрибуты внешнего ключа должны имет опцию Nulls Allowed. Необязательная неидентифицирующая связь помечается прозрачным ромбом со стороны родительской сущности (см. рис. 15). В обязательной неидентифицирующая связи отсутсвует прозрачный ромб со стороны родительской сущности (см. рис. 13).
|
Рис. 15. Необязательная неидентифицирующая связь
В закладке RI Actions можно задать правила ссылочной целостности (Рис. 16).
Правила ссылочной целостности (referential integrity, RI) - логические конструкции, которые выражают бизнес-правила использования данных и представляют собой правила вставки, замены и удаления. При генерации схемы БД на основе опций логической модели, задаваемых в закладке RI Actions, будут сгенерированы правила декларативной ссылочной целостности, которые должны быть предписаны для каждой связи, и триггеры, обеспечивающие ссылочную
Рис. 16. Закладка задания правил ссылочной целостности RI Actions
целостность. Триггеры представляют собой программы, выполняемые всякий раз при выполнении команд вставки, замены или удаления (INSERT, UPDATE или DELETE). Наиболее полезными являются правила по операциям со стороны родительской сущности (Parent). Такие правила рассматриваются ниже.
Правила удаления управляют тем, что будет происходить в БД при удалении строки.
На рис. 15 установлена необязательная неидентифицирующая связь между сущностями Отдел и Сотрудник. Экземпляр сущности Сотрудник может существовать без ссылки на отдел (атрибут внешнего ключа Где работает. Номер отдела может принимать значение NULL). В этом случае возможно установление правила установки в неопределенное значение - SET NULL. При удалении отдела атрибут внешнего ключа сущности Сотрудник - Где работает. Номер отдела примет значение NULL. Это означает, что при удалении отдела сотрудник остается работать в организации не будучи приписан к какому-либо отделу и информация о нем сохраняется.
На рис. 13 отображена обязательная неидентифицирующая связь между сущностями Отдел и Сотрудник. Что будет, если удалить отдел? Экземпляр сущности Сотрудник не может существовать без отдела (атрибут внешнего ключа Номер отдела не может принимать значение NULL), следовательно, нужно либо запретить удаление отдела, пока в ней числится хотя бы один сотрудник (для удаления отдела сначала нужно удалить всех сотрудников), либо сразу удалять вместе с отделом всех его сотрудников. Такие правила удаления называются "ограничение" и "каскад" (Parent RESTRICT и Parent CASCADE). Выполнение команды на удаление одной строки реально может привести к удалению тысячи строк в БД, поэтому использовать правило удаления каскадом следует с осторожностью. В том случае, если установлено правило ограничения удаления, при попытке выполнить удаление отдела, в которой есть хотя бы один сотрудник, сервер реляционной СУБД возвратит ошибку.
Аналогично правила вставки и обновления управляют тем, что будет происходить с БД, если строки изменяются или добавляются.
В закладке Rolename можно задать имя роли.
Имя роли (функциональное имя) - это синоним атрибута внешнего ключа, который показывает, какую роль играет атрибут в дочерней сущности (рис. 17).
Рис. 17. Закладка задания имени роли Rolename
В сущности Сотрудник внешний ключ Код отдела (базовое имя) имеет имя роли (функциональное имя) "Где работает", которое показывает, какую роль играет этот атрибут в сущности. По умолчанию в списке атрибутов показывается только имя роли (функциональное имя). Для отображения полного имени внешнего ключа (как функционального имени, так и базового имени атрибута) следует в контекстном меню, которое появляется, если щелкнуть левой кнопкой мыши по любому месту диаграммы, не занятому объектами модели, выбрать пункт Entity Display и затем включить опцию Rolename/Attribute. Полное имя показывается как функциональное имя и базовое имя, разделенные точкой (см. рис. 18).
Рис. 18. Имя роли внешнего ключа сущности Сотрудник.
Обязательным является применение имен ролей в том случае, когда два или более атрибутов одной сущности определены по одной и той же области, т.е. они имеют одинаковую область значений, но разный смысл. На рис. 19 сущность Книга операций (проводок) содержит информацию о бухгалтерской проводке, в котором участвуют два счета – счет дебета (счет прихода) и счет кредита (счет расхода). Информация о счетах содержится в сущности План счетов. Следовательно, сущности Книга операций и План счетов должны быть связаны дважды и первичный ключ - Номер счета должен дважды мигрировать в сущность Книга операций в качестве внешнего ключа. Необходимо различать эти атрибуты, которые содержат информацию о номере счета дебета(на который приходуются средства) и номер счета кредита (с которого расходуются средства), которые имеют разный смысл, но ссылаются на одну и ту же сущность План счетов (имеют общую область значений). В примере на рис. 20 атрибуты получили имена ролей Дебет и Кредит.
Рис. 19. Случай обязательности имен ролей для двух атрибутов
Другим примером обязательности присвоения имен ролей являются рекурсивные связи (иногда их называют "рыболовный крючок" - fish hook), когда одна и та же сущность является и родительской и дочерней одновременно. При задании рекурсивной связи атрибут должен мигрировать в качестве внешнего ключа в состав неключевых атрибутов той же сущности. Атрибут не может появиться дважды в одной сущности под одним именем, поэтому обязательно должен получить имя роли. На рис. 20 сущность Сотрудник содержит атрибут первичного ключа Табельный номер. Информация о руководителе сотрудника содержится в той же сущности, поскольку руководитель работает в той же организации. Чтобы сослаться на руководителя сотрудника следует создать рекурсивную связь (связь руководит/подчиняется) и присвоить имя роли ("Руководитель"). Заметим, что рекурсивная связь может быть только неидентифицирующей. В противном случае внешний ключ должен был бы войти в состав первичного ключа и получить при генерации схемы признак NOT NULL. Это сделало бы невозможным построение иерархии - у дерева подчиненности должен быть корень - сотрудник, который никому не подчиняется в рамках данной организации.
Связь руководит/подчиняется на рис. 20 позволяет хранить древовидную иерархию подчиненности сотрудников. Такой вид рекурсивной связи называется иерархической рекурсией (hierarchical recursion) и задает связь, когда руководитель (экземпляр родительской сущности) может иметь множество подчиненных (экземпляров дочерней сущности), но подчиненный имеет только одного руководителя.
Рис. 20. Подчиненность экземпляров сущности в иерархической рекурсии
Связь многие-ко-многим возможна только на уровне логической модели данных. На рис. 21 показан пример связи многие-ко-многим. Преподаватель может вести занятия во многих группах, Группа может учиться у нескольких преподавателей. Такая связь обозначается сплошной линией с двумя точками на концах.
Рис. 21. Связь многие-ко-многим
Для внесения связи следует установить курсор на кнопке в палитре инструментов, щелкнуть сначала по одной, а затем по другой сущности.
Связь многие-ко-многим должна именоваться двумя фразами - в обе стороны (в примере "преподает/учится у"). Это облегчает чтение диаграммы. Связь на рис. 21 следует читать Преподаватель <преподает> Группе, а Группа <учится> у Преподавателя.
При переходе к физическому уровню ERwin автоматически преобразует связь многие-ко-многим, добавляя новую таблицу и устанавливая две новые связи один-ко-многим от старых таблиц к новой таблице. Для такого автоматического преобразования необходимо в диалоге Model Properties на вкладке General включить флаг Many-To-Many Relationships with Association Table. При этом имя новой таблице присваивается автоматически как Имя1_Имя2, в примере Преподаватель_Группа (рис. 22).
Рис. 22. Иллюстрация автоматического разрешения связи многие-ко-многим на уровне физической модели
Добавление ключей
Каждый экземпляр сущности должен быть уникален и отличатьсяотдругих атрибутов.
Первичный ключ (primary key) - это атрибут или группа атрибутов, однозначно идентифицирующая экземпляр сущности. Атрибуты первичного ключа на диаграмме не требуют специального обозначения - это те атрибуты, которые находятся в списке атрибутов выше горизонтальной линии (см., например, рис. 11). При внесении нового атрибута в диалоге Attributes для того, чтобы сделать его атрибутом первичного ключа, нужно включить флажок Primary Key в нижней части закладки General. На диаграмме неключевой атрибут можно внести в состав первичного ключа, воспользовавшись режимом переноса атрибутов (захват и перетаскивание атрибута при изображении указателя мыши «рука»).
Выбор первичного ключа может оказаться непростой задачей, решение которой может повлиять на эффективность будущей ИС. В одной сущности могут оказаться несколько атрибутов или наборов атрибутов, претендующих на роль первичного ключа. Такие претенденты называются потенциальными ключами (candidate key).
Ключи могут быть сложными (составными), т. е. содержащими несколько атрибутов. Сложные первичные ключи не требуют специального обозначения - это список атрибутов выше горизонтальной линии:"
Рассмотрим кандидатов на первичный ключ сущности Сотрудник (рис. 23).
Здесь можно выделить следующие потенциальные ключи:
1. Табельный номер
2. ИНН
3. Фамилия + Имя + Отчество
Рис. 23. Определение первичного ключа для сущности "Сотрудник"
Для того чтобы стать первичным, потенциальный ключ должен удовлетворять ряду требований:
- Уникальность. Два экземпляра не должны иметь одинаковых значений возможного ключа. Потенциальный ключ № 3 (Фамилия + Имя + Отчество) является плохим кандидатом, поскольку в организации могут работать полные тезки.
- Компактность. Сложный возможный ключ не должен содержать ни одного атрибута, удаление которого не приводило бы к утрате уникальности. Для обеспечения уникальности ключа № 3 дополним его атрибутами Дата рождения и Цвет волос. Если бизнес-правила говорят, что сочетания атрибутов Фамилия + Имя + Отчество + Дата рождения достаточно для однозначной идентификации сотрудника, то Цвет волос оказывается лишним, т. е. ключ Фамилия + Имя + Отчество + Дата рождения + Цвет волос не является компактным.
При выборе первичного ключа предпочтение должно отдаваться более простым ключам, т. е. ключам, содержащим меньшее количество атрибутов. В примере ключи № 1 и 2 предпочтительней ключа № 3.
Вернемся к сущности Обучение (рис. 22), которая содержала составной первичный ключ из двух атрибутов. Учитывая требование наличия простого и компактного первичного ключа, необходимо введение служебного атрибута для выполнения функций первичного ключа. Таким атрибутом может быть Идентификатор обучения, которому на физическом уровне будет соответствовать числовое автоинкрементное поле (рис. 24). При этом идентифицирующие связи необходимо заменить на обязательные неидентифицирующие.
Рис. 24. Использование служебного поля первичного ключа для сущности "Обучение"
Каждая сущность должна иметь по крайней мере один потенциальный ключ. Многие сущности имеют только один потенциальный ключ. Такой ключ становится первичным. Некоторые сущности могут иметь более одного возможного ключа. Тогда один из них становится первичным, а остальные - альтернативными ключами. Альтернативный ключ (Alternate Key) - это потенциальный ключ, не ставший первичным. ERwin позволяет выделить атрибуты альтернативных ключей, и по умолчанию в дальнейшем при генерации схемы БД по этим атрибутам будет генерироваться уникальный индекс.
Неуникальные индексы (Inversion Key). При работе ИС часто бывает необходимо обеспечить доступ к нескольким экземплярам сущности, объединенным каким-либо одним признаком. Для повышения производительности в этом случае используются неуникальные индексы. ERwin позволяет на уровне логической модели назначить атрибуты, которые будут участвовать в неуникальных индексах. Атрибуты, участвующие в неуникальных индексах, называются Inversion Entries (инверсионные входы). Inversion Entry - это атрибут или группа атрибутов, которые не определяют экземпляр сущности уникальным образом, но часто используются для обращения к экземплярам сущности. ERwin генерирует неуникальный индекс для каждого Inversion Entry.
Создать альтернативные ключи и инверсионные входы можно в закладке Key Group диалога Attributes (рис. 25). Если щелкнуть по кнопке , расположенной в правой верхней части закладки, вызывается диалог Key Group Editor (рис. 26). В верхней части диалога находится список ключей, в нижней - список атрибутов, доступных для включения в состав ключа (слева), и список ключевых атрибутов. Каждый вновь созданный ключ должен иметь хотя бы один атрибут.
Рис. 25. Закладка Key Group диалога Attributes
Рис. 26. Диалог Key Group Editor
Для создания нового ключа следует щелкнуть по кнопке New. Появляется диалог New Key Group (рис. 27). Имя нового ключа присваивается автоматически ("Alternate Key N" для альтернативного ключа и "Inversion Entry N" для инверсионного входа, где N - порядковый номер ключа).
Рис. 27. Диалог New Key Group
Каждому ключу соответствует индекс, имя которого также присваивается автоматически ("XAK<Порядковый номер><Название сущности>" для альтернативного ключа и " XIE<Порядковый номер><Название сущности>" для инверсионного ключа. Имена ключа и индекса при желании можно изменить вручную.
После задания имени и нажатия кнопки Ok необходимо в диалоге Key Groups задать атрибуты ключа. Для включения атрибута в состав ключа следует выделить его в левом списке и щелкнуть по кнопке (Рис. 28)
Рис. 28. Добавление атрибутов в ключ Номер паспорта
Список всех ключей приведен на рис.29.
Рис. 29. Список ключей сущности Сотрудник
На диаграмме (рис.30) атрибуты альтернативных ключей обозначаются как (AKn.m), где n - порядковый номер ключа, m - порядковый номер атрибута в ключе. Когда альтернативный ключ содержит несколько атрибутов, (AKn.m) ставится после каждого. На рис. 2.45 атрибуты Фамилия, Имя, Отчество и Дата рождения входят в альтернативный ключ № 1 (АК1), Номер паспорта составляет альтернативный ключ № 2 (АК2). Инверсионные входы обозначаются как (IEn.m), где n - порядковый номер входа, m -порядковый номер атрибута. Инверсионный вход IE1 (атрибут Должность) позволяет выбрать всех сотрудников, занимающих одинаковую должность, IE2 (атрибуты Город и Улица) - всех сотрудников, живущих на одной улице, IE3 (атрибут Номер комнаты) - всех сотрудников, работающих в одной комнате, a IE4 (атрибут Дата рождения) - всех сотрудников, родившихся в один день. Если один атрибут входит в состав нескольких ключей, ключи перечисляются в скобках через запятую (атрибут Дата рождения входит в состав АК1 и IE4). По умолчанию номера альтернативных ключей и инверсионных входов рядом с именем атрибута на диаграмме не показываются. Для отображения номера следует в контекстном меню, которое появляется, если щелкнуть левой кнопкой мыши по любому месту диаграммы, не занятому объектами модели, выбрать пункт Display Options/Entities и затем включить опцию Alternate Key Designator (AK).
Рис. 30. Список ключей на диаграмме при включенной опции Alternate Key Destignator(AK)
Список литературы
- Маклаков С. В. BPwin и ERwin: CASE-средства для разработки информационных систем,
2. Вендров А.М. CASE-технологии. Современные методы и средства проектирования информационных систем