
- •Минобрнауки россии
- •1. Общая характеристика процесса проектирования ис
- •1.1. Понятие жизненного цикла информационной системы
- •1.2. Модели жизненного цикла программного обеспечения
- •1.3. Стандарт iso 12207: 1995. Процессы жизненного цикла программных средств
- •2. Структурные методы проектирования ис
- •2.1. Идеи, лежащие в основе структурных методов
- •2.2. Принципы структурного анализа
- •3. Исходные данные для проектирования
- •3.1. Консалтинг в области информационных технологий
- •3.2. Цели и основные этапы консалтинга
- •3.3. Проведение обследования
- •3.4. Построение и анализ моделей деятельности предприятия
- •3.5. Разработка системного проекта
- •3.6. Предложения по автоматизации
- •3.7. Техническое проектирование
- •4. Разработка функциональной модели
- •4.1. Функциональные модели (sadt)
- •4.2. Иерархия функциональных диаграмм
- •5. Разработка модели потоков данных
- •5.1. Диаграммы потоков данных (dfd)
- •5.2. Этапы построения модели
- •5.3. Модели реального времени (управляемые событиями)
- •6. Разработка модели данных
- •6.1. Моделирование данных
- •6.2. Физическая и логическая модель данных
- •6.3. Создание логической модели данных
- •6.3.1. Уровни логической модели
- •6.3.2. Сущности и атрибуты
- •6.3.3. Связи
- •6.3.4. Типы сущностей и иерархия наследования
- •6.3.5. Ключи
- •6.3.6. Нормализация данных
- •6.4. Уровни физической модели
- •7. Методология структурного анализа и проектирования
- •7.1. Методология структурного анализа и проектирования
- •7.2. Сравнительный анализ функциональных моделей и моделей потоков данных
- •8. Инструментальные средства представления проектных решений
- •8.1. Концептуальные основы case-технологий
- •8.2. Классификация case-средств
- •8.3. Функциональные характеристики case-средств
- •8.4. Дополнительные средства поддержки жизненного цикла по
- •Литература
6.3.3. Связи
Связь является логическим соотношением между сущностями. Каждая связь должна именоваться глаголом или глагольной фразой (рис. 6.3.). Имя связи выражает некоторое ограничение или бизнес-правило и облегчает чтение диаграммы, например:
Каждый КЛИЕНТ <размещает> ЗАКАЗЫ;
СОТРУДНИК <исполняет> ЗАКАЗЫ.
Рис. 6.3. Имя связи
Связь показывает, какие именно заказы разместил клиент, и какой именно сотрудник выполняет заказ.
На логическом уровне можно установить идентифицирующую связь один-ко-многим, связь многие-ко-многим или неидентифицирующую связь один-ко-многим.
В IDEF1X различают зависимые и независимые сущности. Тип сущности определяется ее связью с другими сущностями. Идентифицирующая связь устанавливается между независимой (родительский конец связи) и зависимой (дочерний конец связи) сущностями. Зависимая сущность изображается прямоугольником со скругленными углами (сущность Заказ на рис. 6.4.). Экземпляр зависимой сущности определяется только через отношение к родительской сущности, т. е. в структуре на рис. 6.4. информация о заказе не может быть внесена и не имеет смысла без информации о клиенте, который его размещает. При установлении идентифицирующей связи атрибуты первичного ключа родительской сущности автоматически переносятся в состав первичного ключа дочерней сущности. Эта операция дополнения атрибутами дочерней сущности при создании связи называется миграцией атрибутов. В дочерней сущности новые атрибуты помечаются как внешний ключ – (FK)
Рис. 6.4. Идентифицирующая связь между
независимой и зависимой таблицей
В дальнейшем, при генерации схемы БД, атрибуты первичного ключа получат признак NOT NULL, что означает невозможность внесения записи в таблицу заказов без информации о номере клиента.
При установлении неидентифицирующей связи (рис. 6.5.) дочерняя сущность остается независимой, а атрибуты первичного ключа родительской сущности мигрируют в состав неключевых компонентов родительской сущности. Неидентифицирующая связь служит для связывания независимых сущностей.
Рис. 6.5. Неидентифицирующая связь
Экземпляр сущности Сотрудник может существовать безотносительно к какому-либо экземпляру сущности Отдел, т. е. сотрудник может работать в организации, не числясь в каком-либо отделе.
Идентифицирующая связь показывается на диаграмме сплошной линией с жирной точкой на дочернем конце связи (см. рис. 6.4), неидентифицирующая - пунктирной (рис. 6.5).
Мощность связи (Cardinality) - служит для обозначения отношения числа экземпляров родительской сущности к числу экземпляров дочерней. Различают четыре типа мощности (рис. 6.6):
общий случай, когда одному экземпляру родительской сущности соответствуют 0,1 или много экземпляров дочерней сущности не помечается каким-либо символом;
символом Р помечается случай, когда одному экземпляру родительской сущности соответствуют 1 или много экземпляров дочерней сущности (исключено нулевое значение);
символом Z помечается случай, когда одному экземпляру родительской сущности соответствуют 0 или 1 экземпляр дочерней сущности (исключены множественные значения);
цифрой помечается случай точного соответствия, когда одному экземпляру родительской сущности соответствует заранее заданное число экземпляров дочерней сущности.
Имя связи (Verb Phrase) - фраза, характеризующая отношение между родительской и дочерней сущностями. Для связи один-ко-многим идентифицирующей или неидентифицирующей достаточно указать имя, характеризующее отношение от родительской к дочерней сущности (Parent-to-Child). Для связи многие-ко-многим следует указывать имена, характеризующие отношения как Parent-to-Child, так и Child-to-Parent.
Рис. 6.6. Обозначения мощности связи
Тип связи (идентифицирующая/неидентифицирующая). Для неидентифицирующей связи можно указать обязательность (Nulls). В случае обязательной связи (No Nulls) при генерации схемы БД атрибут внешнего ключа получит признак NOT NULL, несмотря на то что внешний ключ не войдет в состав первичного ключа дочерней сущности. В случае необязательной связи (Nulls Allowed) внешний ключ может принимать значение NULL. Необязательная неидентифицирующая связь помечается прозрачным ромбом со стороны родительской сущности (см. рис. 6.5).
Имя роли (функциональное имя) - это синоним атрибута внешнего ключа, который показывает, какую роль играет атрибут и дочерней сущности.
Рис. 6.7. Имена ролей внешних ключей
В примере, приведенном на рис. 6.7., в сущности Сотрудник внешний ключ Номер отдела имеет функциональное имя "Где работает", которое показывает, какую роль играет этот атрибут в сущности. По умолчанию в списке атрибутов показывается только имя роли. Для отображения полного имени атрибута (как функционального имени, так и имени роли) следует в ' контекстном меню, которое появляется, если щелкнуть левой кнопкой мыши по любому месту диаграммы, не занятому объектами модели, выбрать пункт Display Options/Entities и затем включить опцию Rolename/Attribute. Полное имя показывается как функциональное имя и базовое имя, разделенные точкой (см. рис. 6.7).
Обязательным является применение имен ролей в том случае, когда два или более атрибутов одной сущности определены по одной и той же области, т. е. они имеют одинаковую область значений, но разный смысл. На рис. 6.8 сущность Продажа валюты содержит информацию об акте обмена валюты, в котором участвуют две валюты - проданная и купленная. Информация о валютах содержится в сущности Валюта. Следовательно, сущности Продажа валюты и Валюта должны быть связаны дважды и первичный ключ - Номер валюты должен дважды мигрировать в сущность Валюта в качестве внешнего ключа. Необходимо различать эти атрибуты, которые содержат информацию о номере проданной и купленной валюты (имеют разный смысл), но ссылаются на одну и ту же сущность Валюта (имеют общую область значений). В примере на рис. 6.8 атрибуты получили имена ролей Проданная и Купленная.
Рис. 6.8. Случай обязательности имен ролей
Другим примером обязательности присвоения имен ролей являются рекурсивные (иногда их называют "рыболовный крючок" - fish hook), когда одна и та же сущность является и родительской и дочерней одновременно. При задании рекурсивной связи атрибут должен мигрировать в качестве внешнего ключа в состав неключевых атрибутов той же сущности. Атрибут не может появиться дважды в одной сущности под одним именем, поэтому обязательно должен получить имя роли. На рис. 6.7. сущность Сотрудник содержит атрибут первичного ключа Табельный номер. Информация о руководителе сотрудника содержится в той же сущности, поскольку руководитель работает в той же организации. Чтобы сослаться на руководителя сотрудника следует создать рекурсивную связь (на рис. 6.7. связь руководит/подчиняется) и присвоить имя роли ("Руководитель"). Заметим, что рекурсивная связь может быть только неидентифицирующей. В противном случае внешний ключ должен был бы войти в состав первичного ключа и получить при генерации схемы признак NOT NULL. Это сделало бы невозможным построение иерархии - у дерева подчиненности должен быть корень - сотрудник, который никому не подчиняется в рамках данной организации.
Связь руководит/подчиняется на рис. 6.7. позволяет хранить древовидную иерархию подчиненности сотрудников. Такой вид рекурсивной связи называется иерархической рекурсией (hierarchical recursion) и задает связь, когда руководитель (экземпляр родительской сущности) может иметь множество подчиненных (экземпляров дочерней сущности), но подчиненный имеет только одного руководителя (рис. 6.9).
Другим видом рекурсии является сетевая рекурсия (network recursion), когда руководитель может иметь множество подчиненных и, наоборот, подчиненный может иметь множество руководителей. Сетевая рекурсия задает паутину отношений между экземплярами родительской и дочерней сущностей. Это случай, когда сущность находится сама с собой в связи многие-ко-многим. Для разрешения связи многие-ко-многим необходимо создать новую сущность (подробно связь многие-ко-многим будет рассмотрена ниже).
Иерархическая
рекурсия
Сетевая рекурсия
Рис. 6.9. Подчиненность экземпляров сущности
в иерархической и сетевой рекурсии
Рис. 6.10. Пример реализации сетевой рекурсии
На рис. 6.10 рассмотрен пример реализации сетевой рекурсии. Структура моделирует родственные отношения между членами семьи любой сложности. Атрибут Тип отношения может принимать значения "отец-сын", "мать-дочь", "дед-внук", "свекровь-невестка", "тесть-зять" и т. д. Поскольку родственное отношение связывает всегда двух людей, от сущности Родственник к сущности Родственное отношение установлены две идентифицирующие связи с именами ролей "Старший" и "Младший". Каждый член семьи может быть в родственных отношениях с любым другим членом семьи, более того, одну и ту же пару родственников могут связывать разные типы родственных отношений.
Если атрибут мигрирует в качестве внешнего ключа более чем на один уровень, то на первом уровне отображается полное имя внешнего ключа (имя роли + базовое имя атрибута), на втором и более - только имя роли. На рис. 6.11 изображена структура данных, которая содержит сущность Команда, сущность Игрок, в которой хранится информация об игроках каждой команды, и сущность Гол, содержащая информацию и голах, которые забивает каждый игрок. Атрибут внешнего ключа Номер команды сущности Игрок имеет имя роли "В какой команде играет".
Рис. 6.11. Миграция имен ролей
На следующем уровне, в сущности Гол, отображается только имя роли соответствующего атрибута внешнего ключа (В какой команде играет).
Связь многие-ко-многим возможна только на уровне логической модели данных. На рисунке 6.12 вверху показан пример связи многие-ко-многим. Врач может принимать много пациентов, пациент может лечиться у нескольких врачей. Такая связь обозначается сплошной линией с двумя точками на концах.
Рис. 6.12. Связь многие – ко – многим
Связь многие-ко-многим должна именоваться двумя фразами - в обе стороны (в примере "принимает/лечится"). Это облегчает чтение диаграммы. Связь на рис. 6.12 следует читать Врач <принимает> Пациента, Пациент <лечится> у Врача.
При переходе к физическому уровню, связь многие-ко-многим преобразуется, добавляя новую таблицу и устанавливая две новые связи один-ко-многим от старых к новой таблице (рис. 6.13).
Рис. 6.13. Иллюстрация автоматического разрешения
связи многие-ко-многим на уровне физической модели
В примере таблица Doctor_Patient имеет смысл визита к врачу, поэтому ее следует переименовать согласно бизнес-логике в Visit. Один и тот же пациент может много раз посещать врача, поэтому для того, чтобы идентифицировать визит, необходимо в состав первичного ключа таблицы Visit добавить дополнительную колонку, например, дату-время посещения (VisitDatetime, рис. 6.14).
Следует заметить, что после внесения дополнительной колонки на физическом уровне на логическом уровне представление модели не изменится, диаграмма будет выглядеть так, как на рис. 6.12.
Рис. 6.14. Дополнение модели при разрешении
связи многие – ко – многим на уровне физической модели