Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tasks / ПИ-Метод-рекомен-ЛР-Кузнецов-01-сентября-2013.doc
Скачиваний:
177
Добавлен:
13.03.2015
Размер:
4.19 Mб
Скачать

4.5. Создание логических связей Связи в eRwin

Связь (relationship) – это функциональная зависимость между двумя сущностями (в частности, возможна связь сущности с самой собой). Например, важно знать фамилию сотрудника, и не менее важно знать, в каком отделе он работает. Таким образом, между сущностями отдел и сотрудник существует связь состоит из (отдел состоит из сотрудников). Связь – это понятие логического уровня, которому соответствует внешний ключ на физическом уровне.

Связь является логическим соотношением между сущностями. Каждая связь должна именоваться глаголом (или глагольной фразой), показывающим, как одна сущность соотносится к другой (рис. 31).

Рис. 31. Связи между сущностями

Имя связи выражает некоторое ограничение или бизнес-правило и облегчает чтение модели, например:

Каждый Клиент <Вносит/Снимает> средства со счета.

Связь показывает, какие именно действия делает клиент. По умолчанию имя связи на диаграмме не показывается. Для отображения имени связи на модели необходимо в меню Format/Relationship Display включить режим Verb Phrase.

В ERwin связи представлены пятью основными элементами информации:

  • тип связи (идентифицирующая, неидентифицирующая, полная/неполная категория, неспецифическая связь);

  • родительская сущность;

  • дочерняя (зависимая) сущность;

  • мощность связи (cardinality);

  • допустимость пустых (null) значений.

В IDEF1X различают зависимые и независимые сущности. Тип сущности определяется ее связью с другими сущностями.

Связь называется идентифицирующей, если экземпляр дочерней (зависимой) сущности идентифицируется через ее отношение с родительской (независимой) сущностью. Когда рисуется идентифицирующая связь ERwin автоматически преобразует дочернюю сущность в зависимую, а атрибуты, составляющие первичный ключ родительской сущности, автоматически переносятся в первичный ключ дочерней сущности. Эта операция дополнения атрибутов дочерней сущности при создании связи называется миграцией атрибутов. В дочерней сущности новые атрибуты помечаются как внешний ключ – (FK). Зависимая сущность изображается прямоугольником со скругленными углами (рис. 32). В дальнейшем, при генерации схемы БД, атрибуты первичного ключа получат признак NOT NULL, что означает невозможность внесения записи в таблицу заказов без информации о номере клиента. Идентифицирующая связь показывается на модели сплошной линией с жирной точкой на дочернем конце связи.

Рис. 32. Пример идентифицирующей связи один-ко-мнoгим

Связь называется не идентифицирующей, если экземпляр дочерней сущности остается независимым, а атрибуты первичного ключа родительской сущности мигрируют в состав неключевых компонентов родительской сущности. Неидентифицирующая связь (рис. 33) служит для связывания независимых сущностей. Неидентифицирующая связь показывается на модели пунктирной линией с жирной точкой на дочернем конце связи.

На логическом уровне в ERwin можно установить идентифицирующую связь один-ко-многим, связь многие-ко-многим и неидентифицирующую связь один-ко-многим.

Рис. 33. Пример неидентифицирующей связи один-ко-мнoгим

Связь один-ко-мнoгим означает, что экземпляр первой сущности взаимодействует с несколькими экземплярами другой сущности. Взаимосвязи отображаются линиями, соединяющими две сущности с точкой на одном конце и глаголом, располагаемым над линией. Примеры таких взаимосвязей:

  • команда включает много игроков;

  • самолет перевозит много пассажиров;

  • продавец продает много продуктов.

На уровне логической модели наряду со связью один-ко-многим допустима связь многие-ко-многим. Этот тип связи описывает ситуацию, при которой экземпляры сущностей могут взаимодействовать с несколькими экземплярами других сущностей. Связь многие-ко-многим используют на перво­начальных стадиях проектирования. Этот тип взаимосвязи отображается сплошной линией с точками на обоих концах (рис. 34). Связь многие-ко-многим должна именоваться двумя фразами (рис. 34) – в обе стороны. Это облегчает чтение модели.

Рис. 34. Пример связи многие-ко-мнoгим

Связь многие-ко-многим может не учитывать определенные ограни­чения системы, поэтому при переходе к физическому уровню ERwin автоматически преобразует связь многие-ко-многим, добавляя новую сущность и устанавливая две новые связи один-ко-многим от старых сущностей к новой сущности. При этом имя новой сущности автоматически присваивается как Имя1_Имя2, например, Товар_Заказ.

13. Создайте связи.

13.1. При помощи панели инструментов Стандартная перейдите в режим (уровень) отображения сущностей (рис. 35).

Рис. 35. Вид модели в режиме отображения сущностей

13.2. Включите режим отображения связей на дугах связей между сущностями, включив для этого режим Verb Phrases (Показ глагольной фразы) в меню Format/Relationship Display.

13.3. Для установления связей используются кнопки связей на панели Инструменты (рис. 5).

13.4. Установите связь М:М между сущностями Товар и Заказ (рис. 35). Порядок задания связи следующий: щелкните мышью по кнопке Many-to-many relationship на панели Инструменты, а затем сделайте щелчок мышью сначала по родительской сущности Товар, а затем по дочерней сущности Заказ. Для отключения режима задания связей щелкните мышью по кнопке Выбор (Select).

13.5. Установите связь 1:М между сущностями Клиент и Заказ (рис. 35). Порядок задания связи следующий: щелкните мышью по кнопке Non-identifying reletionship на панели Инструменты, а затем сделайте щелчок мышью сначала по родительской сущности Клиент, а затем по дочерней сущности Заказ. Для отключения режима задания связей щелкните мышью по кнопке Выбор (Select).

После выполнения пунктов 13.3 и 13.4 на модели появятся линии связи между сущностями с дежурными именами связей R/1 и R/2 (рис. 36).

Рис. 36. Вид модели с установленными связями сущностей

14. Задайте имена связям.

14.1. Проверьте выполнение пункта 13.2.

14.2. Для задания имен связям между сущностями Товар и Заказ сделайте двойной щелчок мышью по связи R/1 (рис. 36).

14.3. В появившемся окне Reletionship (рис. 37) выберите вкладку General.

Рассмотрим назначение вкладок в окне задания связей Reletionship (рис. 37).

Рис. 37. Окно Reletionship

На вкладке General диалога можно задать мощность, имя и тип связи.

Мощность связи (Cardinality) –обозначает отношение числа экземпляров родительской сущности к числу экземпляров дочерней. ERwin, в соответствии с методологией IDEF1X, позволяет задать четыре типа мощности:

  • Zero, One or More. Общий случай, когда одному экземпляру родительской сущности соответствуют 0, 1 или много экземпляров дочерней сущности, не помечается каким-либо символом;

  • One or More. Символом P помечается случай, когда одному экземпляру родительской сущности соответствуют 1 или много экземпляров дочерней сущности (исключено нулевое значение);

  • Zero or One. Символом Z помечается случай, когда одному экземпляру родительской сущности соответствуют 0 или 1 экземпляр дочерней сущности (исключены множественные значения);

  • Exactly. Конкретным числом, например, 5 помечается случай точного соответствия, когда одному экземпляру родительской сущности соответствует заранее заданное число экземпляров дочерней сущности.

По умолчанию символ, обозначающий мощность связи, не показывается на модели. Для отображения имени следует меню Format/Relationship Display включить режим Cardinality. Мощность отображается дополнительным символом у дочерней сущности (рис. 38).

0, 1 или много

1 или много

P

0 или 1

Z

точно N (5)

5

Рис. 38. Обозначение мощности связи на моделях

Имя связи (Verb Phrase) – фраза, характеризующая отношение между родительской и дочерней сущностями. Для связи один-ко-многим идентифицирующей или неидентифицирующей достаточно указать имя связи, характеризующее отношение родительской к дочерней сущности (Parent-to-Child). Для связи многие-ко-многим следует указывать имена связей между сущностями в обоих направленииях: как Parent-to-Child так и Child-to-Parent (отношение дочерней к родительской).

Допустимость пустых (Nulls) значений в не идентифицирующих связях задается выбором режима Nulls Allowed в разделе Nulls. В модели этот режим изображается пустым ромбиком на дуге со стороны родительской сущности.

Тип связи (идентифицирующая/неидентифицирующая). Для неидентифицирующей связи можно указать обязательность (Nulls). В случае обязательной связи (No Nulls) при генерации схемы БД атрибут внешнего ключа получит признак NOT NULL, несмотря на то, что внешний ключ не войдет в состав первичного ключа дочерней сущности. В случае необязательной связи (Nulls Allowed) внешний ключ может принимать значение NULL. Необязательная неидентифицирующая связь помечается прозрачным ромбом со стороны родительской сущности.

В закладке Definition можно дать более полное определение связи для того, чтобы в дальнейшем иметь возможность на него ссылаться.

В закладке Rolename можно задать имя роли.

В закладке RI Actions правила ссылочной целостности.

Имя роли (Rolename) – это функциональное имя синоним атрибута внешнего ключа, который показывает, какую роль играет атрибут в дочерней сущности. По умолчанию в списке атрибутов показывается только имя роли. Для отображения полного имени атрибута (как функционального имени, так и имени роли) следует в контекстном меню, которое появляется, если щелкнуть левой кнопкой мыши по любому месту модели, не занятому объектами модели, выбрать пункт Entities Display и затем включить режим Rolename/Attribute. Полное имя показывается как функциональное имя и базовое имя, разделенные точкой.

Обязательным является применение имен ролей в том случае, когда два или более атрибутов одной сущности определены по одной и той же области, т. е. они имеют одинаковую область значений, но разный смысл. Например, сущность посредническая сделка имеет атрибут код предприятия-продавца и код предприятия-покупателя. В данном случае первичный ключ сущности предприятие (код предприятия) имеет две роли в дочерней сущности. На физическом уровне имя роли – это имя колонки внешнего ключа в дочерней таблице.

Другим примером обязательности присвоения имен ролей являются рекурсивные связи (иногда их называют рыболовный крючокfish hook), когда одна и та же сущность является и родительской и дочерней одновременно. При задании рекурсивной связи атрибут должен мигрировать в качестве внешнего ключа в состав неключевых атрибутов той же сущности. Атрибут не может появиться дважды в одной сущности под одним именем, поэтому обязательно должен получить имя роли. Рекурсивная связь может быть только неидентифицирующей.

Вид рекурсивной связи, называющийся иерархической рекурсией, задает связь, когда экземпляр родительской сущности может иметь множество экземпляров дочерней сущности, но экземпляр дочерней сущности может иметь только один экземпляр родительской сущности.

Другим видом рекурсии является сетевая рекурсия, когда экземпляр родительской сущности может иметь множество экземпляров дочерней сущности и, наоборот, экземпляр дочерней сущности может иметь множество экземпляров родительской сущности. Сетевая рекурсия задает паутину отношений между экземплярами родительской и дочерней сущностей. Это случай, когда сущность находится сама с собой в связи многие-ко-многим. Для разрешения связи многие-ко-многим необходимо создать новую сущность.

Рис. 39. Окно Triggers

Если атрибут мигрирует в качестве внешнего ключа более, чем на один уровень, то на первом уровне отображается полное имя внешнего ключа (имя роли + базовое имя атрибута), на втором и более – только имя роли.

Правила ссылочной целостности (Referential Integrity (RI)) – логические конструкции, которые выражают бизнес-правила использования данных и представляют собой правила вставки, замены и удаления. При генерации схемы БД на основе опций логической модели, задаваемых в закладке RI Actions, будут сгенерированы правила декларативной ссылочной целостности, которые должны быть предписаны для каждой связи, и триггеры, обеспечивающие ссылочную целостность. Триггеры представляют собой программы, выполняемые всякий раз при выполнении команд вставки, замены или удаления (INSERT, UPDATE или DELETE).

Рис. 40. Задание имен связей между сущностями Товар иЗаказ

Правила удаления управляют тем, что будет происходить в БД при удалении строки. Аналогично правила вставки и обновления управляют тем, что будет происходить с БД, если строки изменяются или добавляются.

Erwin автоматически присваивает каждой связи значение ссылочной целостности, устанавливаемой по умолчанию, прежде чем добавить ее в модель. Режимы RI, присваиваемые Erwin по умолчанию, могут быть изменены в окне Triggers, которое вызывается с помощью меню Database/RI Triggers/Table Triggers… (рис. 39).

14.4. В окне Reletionship (рис. 37) в разделе Parent-to-Child введите Входит, а в разделе Child-to-Parent Включает (рис. 40).

14.5. Аналогично для задания имени связи между сущностями Клиент и Заказ сделайте двойной щелчок мышью по связи R/2 (рис. 36) и в появившемся окне Reletionship (рис. 37) в разделе Parent-to-Child введите Делает (рис. 41).

Рис. 41. Задание имен связей между сущностями Клиент иЗаказ

14.5. В результате выполнения пунктов 14.1-14.5 модель примет вид, показанный на рис. 42.

Замечание: В нашей модели, представленной на рис 41, символы мощности связи у дочерних сущностей отсутствуют, так как выбран тип мощности Zero, One or More .

Рис. 42. Вид модели с указанием связей между сущностями