BPwin и Erwin. CASE-средства для разработки информационных систем
Шрифт:
На рис. 2.26 установлена необязательная неидентифицирующая связь между сущностями Отдел и Сотрудник. Экземпляр сущности Сотрудник может существовать без ссылки на отдел (атрибут внешнего ключа Где работает. Номер отдела может принимать значение NULL). В этом случае возможно установление правила установки в нуль - SET NULL. При удалении отдела атрибут внешнего ключа сущности Сотрудник - Где работает. Номер отдела примет значение NULL. Это означает, что при удалении отдела сотрудник остается работать в организации не будучи приписан к какому-либо отделу и информация о нем сохраняется.
Возможна установка еще двух правил удаления (если таковые поддерживаются СУБД):
SET DEFAULT - при
NONE - при удалении значение атрибута внешнего ключа не меняется. Запись об игроке "повисает в воздухе", т. е. ссылается на несуществующую уже команду. Такая ситуация характерна для "плоских" таблиц. Например, если информация об игроках и командах хранится в dbf-файлах, можно удалить запись о команде, при этом файл игроков "ничего не будет знать" о том, что соответствующей команды не существует. Поэтому в настольных или файл-серверных системах функциональность, обеспечивающая правила ссылочной целостности, реализуется в клиентском приложении.
Правила удаления управляют тем, что будет происходить в БД при удалении строки. Аналогично правила вставки и обновления управляют тем, что будет происходить с БД, если строки изменяются или добавляются. Например, можно установить правило, которое разрешает вносить новую команду только в том случае, когда в нее зачислен хотя бы один игрок. Желаемое поведение может быть достигнуто следующими действиями:
Задать мощность связи между сущностями Команда и Игрок, равную "One or more" - 1 или более (тип Р). Предполагается, что установлена идентифицирующая связь.
Присвоить действие RI-триггера "Parent Insert-CASCADE" для того, чтобы при создании новой строки в таблице Команда автоматически создавалась хотя бы одна строка в дочерней таблице Игрок.
Присвоить связи действие RI-триггера "Parent Delete-CASCADE" для того, чтобы при удалении строки из таблицы Команда соответствующая строка или строки из таблицы Игрок тоже удалялись.
ERwin автоматически присваивает каждой связи значение ссылочной целостности, устанавливаемой по умолчанию, прежде чем добавить ее в диаграмму. Режимы RI, присваиваемые ERwin по умолчанию (приведены в табл. 2.4), могут быть изменены в редакторе Referential Integrity Default, который вызывается, если щелкнуть по кнопке RI Defaults диалога Target Server (меню Server/Target Server).
Таблица 2.4. Значения RI, присваиваемые в ERwin no умолчанию, а также возможные оежимы для каждого типа связи
Идентифицирующая связь | Неидентифицирующая связь (Nulls Allowed) | Неидентифицирующая связь (No Nulls) | Категориальная связь | |
Child Delete Возможные режимы | RESTRICT, CASCADE, NONE | RESTRICT, CASCADE, NONE, SET NULL, SET DEFAULT | RESTRICT, CASCADE, NONE, SET DEFAULT | RESTRICT, CASCADE, |
NONE | ||||
Child Delete Режимы по умолчанию | NONE | NONE | NONE | NONE |
Child Insert Возможные режимы | RESTRICT, CASCADE, | RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT | RESTRICT, CASCADE, NONE, SET DEFAULT | RESTRICT, CASCADE, |
NONE | NONE | |||
Child Insert Режимы по умолчанию | RESTRICT | SET NULL | RESTRICT | RESTRICT |
Child Update Возможные режимы | RESTRICT, CASCADE, NONE | RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT | RESTRICT, CASCADE, NONE, SET DEFAULT | RESTRICT, CASCADE, NONE |
Child Update Режимы по умолчанию | RESTRICT | SET NULL | RESTRICT | RESTRICT |
Parent Delete
| RESTRICT, CASCADE, NONE | RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT | RESTRICT, CASCADE, NONE, SET DEFAULT | RESTRICT, CASCADE, |
NONE | ||||
Parent Delete Режимы по умолчанию | RESTRICT | SET NULL | RESTRICT | CASCADE |
Parent Insert Возможные режимы | RESTRICT, CASCADE, NONE | RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT | RESTRICT, CASCADE, NONE, SET DEFAULT | RESTRICT, CASCADE, NONE |
Parent Insert Режимы по умолчанию | NONE | NONE | NONE | NONE |
Parent Update Возможные режимы | RESTRICT, CASCADE, NONE | RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT | RESTRICT, CASCADE, NONE, SET DEFAULT | RESTRICT, CASCADE, NONE |
Parent Update Режимы по умолчанию | RESTRICT | SET NULL | RESTRICT | CASCADE |
Связь многие-ко-многим возможна только на уровне логической модели данных. На рис. 2.31 вверху показан пример связи многие-ко-многим. Врач может принимать много пациентов, пациент может лечиться у нескольких врачей. Такая связь обозначается сплошной линией с двумя точками на концах.
Рис. 2.31. Связь многие-ко-многим
Для внесения связи следует установить курсор на кнопке
Связь многие-ко-многим должна именоваться двумя фразами - в обе стороны (в примере "принимает/лечится"). Это облегчает чтение диаграммы. Связь на рис. 2.31 следует читать Вран <принимает> Пациент"а, Пациент <лечится> у Врач"а.
При переходе к физическому уровню ERwin автоматически преобразует связь многие-ко-многим, добавляя новую таблицу и устанавливая две новые связи один-ко-многим от старых к новой таблице (рис. 2.32, сверху). При 'этом имя новой таблице присваивается автоматически как “Имя1 Имя2".
Рис. 2.32. Иллюстрация автоматического разрешения связи многие-ко-многим на уровне физической модели
Автоматического решения проблемы связи многие-ко-многим не всегда оказывается достаточно. В примере таблица Doctor_Patient имеет смысл визита к врачу, поэтому ее следует переименовать согласно бизнес-логике в Visit. Один и тот же пациент может много раз посещать врача, поэтому для того, чтобы идентифицировать визит, необходимо в состав первичного ключа таблицы Visit добавить дополнительную колонку, например дату-время посещения (VisitDatetime, рис. 2.33).
Рис. 2.33. Дополнение модели при разрешении связи многие-ко-многим на уровне физической модели
Следует заметить, что после внесения дополнительной колонки на физическом уровне на логическом уровне представление модели не изменится, диаграмма будет выглядеть так, как на рис. 2.31.
2.2.4. Типы сущностей и иерархия наследования