sonyps4.ru

Построение моделей в ERwin. Общие принципы работы в erwin

Лабораторная работа № 5

Цель работы:

Задание:

Последовательность выполнения работы

Знакомство с пользовательским интерфейсом

· Загрузите программу Erwin.

· В появившемся диалоговом окне установите переключатель Crеаte а New Model. На экране появится диалог Create Model – Select Template, гденеобходимо выбрать уровень моделирования.

Erwin имеет два уровня моделирования: логический и физический. На логическом уровне данные представляются так, как они выглядят в реальном мире. Объектами логического уровня являются сущности и атрибуты.

На физическом уровне модель зависит от конкретной реализации базы данных, выбираемой пользователем. При переходе модели на физический уровень производится трансформация сущностей в таблицы, а атрибутов в поля, поэтому все имена и описания физической модели должны соответствовать принятым для выбранной СУБД соглашениям.

· Установите переключательLogical/Physical для создания модели с логическим и физическим уровнями.

· В полях DataBase и Version указывается тип и версия сервера, для которого создается модель. Выберите в списке Access, 2000. Нажмите кнопку ОК .

· На экране появится основное окно программы.

В верхней части окна находится титульная строка, в которой указано название программы, наименование модели, наименование подмножества (Subject Area) и хранимого отображения (Stored Display). Основную часть пространства программы занимает рабочая область, в которой создается ER-диаграмма.

Для переключения между логическим и физическим уровнями на панели инструментов имеется список (рис 1.1).

Помимо этого списка, на панели инструментов имеются кнопки (см. табл. 1.1).

Таблица 1.1.

Кнопки, расположенные на панели инструментов программы Erwin

Кнопка Назначение
Создание, открытие, сохранение и печать модели
Вызов диалога Report Browser для генерации отчетов
Изменение уровня просмотра модели: уровень сущностей, уровень атрибутов, уровень определений
Изменение масштаба просмотра модели
Генерация схемы БД, выравнивание схемы с моделью и выбор сервера (доступны только на уровне физической модели)
Переключение между областями модели Subject Area


Для непосредственной работы с элементами модели в программе имеется палитра инструментов (Erwin Toolbox), представляющая собой «плавающее окошко» (рис. 1.2). При необходимости палитру инструментов можно убирать с экрана и вызывать нажатием комбинации клавиш «CTRL-T».

Рис. 1.2. Палитра инструментов на логическом уровне

Внесение в модель сущностей

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

· Выберите на панели инструментов (ERwin Toolbox) кнопку Сущность ,щелкнув по ней указателем мыши. Затем щелкните мышкой по тому месту на диаграмме, где необходимо расположить новую сущность. На поле диаграммы появится прямоугольник, изображающий новую сущность, с автоматически сгенерированным именем «Е/1».

· Введите с клавиатуры имя сущности «Покупатель » и нажмите Enter .

· Точно таким же образом вставьте в диаграмму еще четыре сущности: договор, накладная, товар, склад.

· Щелкнув правой кнопкой мыши по сущности и выбрав из контекстного меню пункт Entity Properties , можно вызвать редактор сущностей Entities (рис. 1.6), который позволяет изменять свойства выбранной сущности. Редактор сущностей также можно вызвать через главное меню: Model | Entities.



Рис. 1.6. Редактор сущности

В верхней части окна редактора находится список всех сущностей, имеющихся на диаграмме. С его помощью можно выбрать сущность, свойства которой необходимо посмотреть или изменить. По умолчанию, выбранной является выделенная на диаграмме сущность, по которой щелкнули мышью. Далее имеется поле Name, в котором высвечивается имя сущности. Имя можно редактировать.

Ниже в окне редактора находится ряд закладок:

Definition (определение) – на этой странице вводится определение сущности.

Note, Note2, Note3 (примечание) – используются для ввода произвольного текста, связанного с сущностью, например, образцы данных и запросы.

UDP – определяемые пользователем свойства.

Icon (иконка) – для наглядности каждой сущности может быть присвоена иконка, которая выводится рядом с ее названием.

· Для каждой сущности введите определение Definition.

Ключевые группы

· Вызовите редактор ключевых групп Key Groups, щелкнув правой кнопкой мыши по сущности Покупатель и выбрав из контекстного меню пункт Key Groups . Редактор ключевых групп также можно вызвать через главное меню: Model | Key Groups.

Редактор ключевых групп содержит элементы управления:

Entity – поле с выпадающим списком, в котором следует выбрать сущность для редактирования.

Окно с перечнем ключевых групп. Каждая группа представлена отдельной строкой, включающей в себя имя (Key Group), тип (Type) и определение (Definition).

Кроме того, диалоговое окно редактора ключевых групп содержит следующие закладки:

ü Members (члены). Задаются члены ключевых групп и их порядок следования в группе.

ü General (общие установки). Переключатели, позволяющие задавать тип ключевой группы. Для первичного и внешнего ключа эти группы недоступны.

ü Definition (определение). Произвольная текстовая информация, относящаяся к выбранной ключевой группе.

ü Note (примечание). Примечание к выбранной группе.

ü UDP (пользовательские свойства).

· Нажмите кнопку New .

· В окне New Key Group в поле Key Group введите имя ключевой группы – ИНН . В поле Index выводится генерируемое программой Erwin имя индекса. Оставьте его без изменений.

· Переключатель Key Group Type задает тип создаваемого ключа. Это может быть альтернативный ключ (Alternate Key) или инверсный вход (Inversion Entry). Выберите Alternate Key и нажмите ОК . Вновь введенный альтернативный ключ появится в перечне ключей.



Перейдите на закладку Members . Новый ключ пока не содержит никаких атрибутов, поэтому правый список Key Group Members (члены ключевой группы) пуст. Выберите в левом списке атрибут ИНН и переместите его в правый список при помощи кнопки со стрелкой (см. рис. 1.8).

Рис. 1.8. Редактор ключевых групп

· Таким же образом создайте ключевые группы для инверсных входов, приведенных в табл. 1.3.

Лабораторная работа № 6

Задание правил декларативной ссылочной целостности

· Находясь на логическом уровне модели данных, выделите связь «заключает» между сущностями Покупатель и Договор, щелкнув по ней указателем мыши. Затем нажмите правую кнопку мыши и в контекстном меню выберите пункт Relationship Properties (редактор связей).

· В окне редактора связей Relationship перейдите на вкладку RI Actions . Ознакомьтесь с правилами ссылочной целостности для связи «Покупатель – Договор», присвоенными по умолчанию. Данные установки запрещают вставку и изменение экземпляра дочерней сущности, а также удаление и изменение родительской сущности. Это означает, что не допускается удаление или изменение покупателя, если в базе данных имеются заключенные с ним договоры, а также ввод договора без указания покупателя или со ссылкой на несуществующего покупателя. Тем самым мы выполнили условие, по которому договор может существовать только для конкретного покупателя.

· Проанализируйте установленные правила ссылочной целостности для всех остальных связей.

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

Нормализация данных

Из модели видно, что в сущности Покупатель присутствует множественный атрибут ТЕЛ. Покупатель может иметь несколько телефонных номеров, что является нарушением первой нормальной формы, согласно которой все значения атрибутов должны быть атомарными. Поэтому необходимо выделить атрибут ТЕЛ в отдельную сущность.

· Создайте сущность Телефон, содержащую следующие атрибуты: КОД_ТЕЛ (первичный ключ, тип – number) и ТЕЛ (тип – string).

· Свяжите сущности Покупатель и Телефон идентифицирующей связью. Установите мощность связи – One or More (P) и введите имя связи – имеет.

Выбор сервера

· Выполните команду Database | Choose Database .

· В диалоговом окне Erwin/ERX – Target Server необходимо задать тип сервера – Access и его версию – 2000 . Кроме того, здесь указывается используемый по умолчанию тип данных и условие NULL для вновь созданных колонок. Некоторые опции данного диалогового окна зависят от выбранного типа сервера.

· После выбора сервера нажмите кнопку ОК .

Денормализация данных

На модели имеются две связи типа «многие-ко-многим»: Товар – Договор и Товар – Накладная, которые должны быть разрешены на физическом уровне. Результат разрешения данных связей представлен в табл. 2.1.

Таблица 2.1.

Результат разрешения связей «многие-ко-многим»

Разрешение связей «многие-ко-многим» осуществляется автоматически при переходе на физический уровень, либо с помощью специального мастера Many Relationship Transform Wizard .

· Для вызова данного мастера выделите связь «Товар – Договор», щелкнув по ней указателем мыши. Затем нажмите правую кнопку мыши и в контекстном меню выберите пункт Create Association Table (создать ассоциативную таблицу). На экране появится первый диалог мастера, содержащий текст о его назначении.

· Введите в поле Table Name (имя таблицы) – Поставка_План . В поле Table Comment (комментарии к таблице) введите текст: Сведения о поставках товара по договору.

· На модели появилась новая таблица Поставка_План, связанная идентифицирующей связью с таблицами Товар и Договор.

· Новую таблицу необходимо дополнить тремя колонками (см. табл. 2.1). Для этого выделите таблицу Поставка_План , щелкнув по ней указателем мыши. Затем нажмите правую кнопку мыши и в контекстном меню выберите пункт Columns (редактор колонок). Работа с данным редактором аналогична работе с редактором атрибутов.

· Самостоятельно введите три новых колонки в соответствии с табл. 2.1.

· Рассмотренным выше способом (с использованием мастера) преобразуйте связь «Товар – Накладная» и дополните полученную ассоциативную таблицу Отгрузка двумя колонками согласно табл. 2.1.

Задание правил валидации

Задание списка допустимых значений

В соответствии с рассматриваемой предметной областью для поля СТАВКА_НДС таблицы Товар зададим список допустимых значений: 0, 10 и 18 %.

Columns.

· В окне редактора в поле Column – СТАВКА_НДС .

· Перейдите на закладку выбранной СУБД – Access .

· Valid .

· В диалоге Validation Rules щелкните по кнопке New .

· В диалоге New Validation Rule вполе Logical введите имя правила – Проверка ставки НДС . Нажмите кнопку ОК .

· Перейдите на закладку General . В группе Type установите опцию Valid Value List .

· В поле Valid Value в первой строке введите 0. Во вторую и третью строки введите значения: 10 и 18.

· Проверьте, чтобы в верхней части окна редактора Validation Rules появилась строчка: Проверка ставки НДС (Validation Name) IN (0, 10, 18) (Validation Rule).

· Нажмите ОК. В окне редактора Columns на закладке Access в поле Valid появилось наименование созданного правила – «Проверка ставки НДС».

Задание значений, присваиваемых по умолчанию

Создадим правило, согласно которому в поле ДАТА_ДОГ таблицы Договор будет по умолчанию подставляться значение текущей даты.

· Вызовите контекстное меню таблицы Договор и выберите пункт Columns.

· В окне редактора в поле Column выберите колонку, для которой будет задаваться правило– ДАТА_ДОГ .

· На закладке Access щелкните по кнопке, расположенной справа от раскрывающегося списка Default .

· В диалоговом окне Default/Initial Values щелкните по кнопке New .

· В диалоге New Default Value вполе Logical введите имя правила – Текущая дата . Нажмите кнопку ОК .

· На закладке Access в поле Server Value – Access Default введите Date() (функцию, получающую значение текущей даты).

· Нажмите ОК. В окне редактора Columns на закладке Access в поле Default появилось наименование созданного правила – «Текущая дата».

· Установите это же правило для поля ДАТА_ОТГР таблицы Накладная. Для этого в окне редактора колонок Column выделите поле ДАТА_ОТГР и на закладке Access в поле Default из раскрывающегося списка выберитеправилоТекущая дата.

Задание правил проверки вводимых значений

Создадим правило проверки вводимых значений для поля ЦЕНА таблицы Товар, согласно которому данное поле не может иметь значения, меньшие 0.

· Вызовите контекстное меню таблицы Товар и выберите пункт Columns.

· В окне редактора в поле Column выберите колонку, для которой будет задаваться правило– ЦЕНА .

· На закладке Access щелкните по кнопке, расположенной справа от раскрывающегося списка Valid .

· В диалоге Validation Rules щелкните по кнопке New .

· В диалоге New Validation Rule вполе Logical введите имя правила – Проверка цены . Нажмите кнопку ОК .

· Перейдите на закладку General . В группе Type установите опцию Min/Max .

· В поле Min введите 1. Кроме нижней границы диапазона значений здесь также можно задать и верхнюю границу (Max ).

· В верхней части окна редактора Validation Rules в списке правил валидации добавилось вновь созданное: Проверка цены >=1.

· Нажмите кнопку ОК .

Лабораторная работа № 7

Расчет размера базы данных

Цель работы:

Освоить методику расчета размера базы данных, реализованную в Erwin.

Лабораторная работа № 8

Создание отчетов в Erwin

Цель работы:

· изучение видов отчетов;

· освоение процедуры создания отчетов

Лабораторная работа № 5

Основы работы в Erwin. Построение логической модели данных

Цель работы:

· овладение навыками работы в Erwin;

· построение логической модели заданной предметной области.

Задание:

Построить логическую информационную модель поставки товаров в соответствии с договорами средствами Erwin.

CASE-средства ERWin при нормализации и денормализации БД,

  • построить физическую модель,
  • изучить алгоритмы перевода БД в первую, вторую и третью нормальную форму

Нормализация

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

Для рассмотрения видов нормальных форм введем понятия функциональной и полной функциональной зависимости.

Функциональная зависимость . Атрибут В сущности Е функционально зависит от атрибута А сущности Е, если и только если каждое значение А в Е связало с ним точно одно значение В в Е. Другими словами, А однозначно определяет В.

Полная функциональная зависимость. Атрибут Е сущности В полностью функционально зависит от ряда атрибутов А сущности Е, если и только если В функционально зависит от Л и не зависит ни от какого подряда А.

Существуют следующие виды нормальных форм:

  • Первая нормальная форма

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

  • Вторая нормальная форма. Сущность Е находится во второй нормальной форме, если она находится в первой нормальной форме и каждый неключевой атрибут полностью зависит от первичного ключа, т. е. не существует зависимостей от части ключа.
  • Третья нормальная форма (3 NF). Сущность Е находится в третьей нормальной форме, если она находится во второй нормальной форме и неключевые атрибуты сущности Е зависят от других атрибутов Е.

После третьей нормальной формы существуют нормальная форма Бойсса - Кодда, четвертая и пятая нормальные формы. На практике ограничиваются приведением к третьей нормальной форме. Часто после проведения нормализации все взаимосвязи данных становятся правильно определены, модель данных становится легче поддерживать. Однако нормализация не ведет к повышению производительности системы в целом, поэтому при создании физической модели в целях повышения производительности приходится сознательно отходить от нормальных форм, чтобы использовать возможности конкретного сервера. Такой процесс называется денормализацией.

1.1. Поддержка нормализации в ERWin

ERWin обеспечивает только поддержку нормализации, но не содержит в себе алгоритмов, автоматически преобразующих модель данных из одной формы в другую.

Поддержка первой нормальной формы В модели каждая сущность или атрибут идентифицируется с помощью имени. В ERWin поддерживает корректность имен следующим образом:

  • отмечает повторное использование имени сущности и атрибута;
  • не позволяет внести в сущность более одного внешнего ключа;
  • запрещает присвоение неуникальных имен атрибутов внутри одной модели, соблюдая правило «в одном месте - один факт».

Создание физической модели

Целью создания физической модели является обеспечение администратора соответствующей информацией для переноса логической модели данных в СУБД.

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

Таблица 7.1. Сопоставление компонентов логической и физической модели

Логическая модель Физическая модель
Сущность Таблица
Атрибут Столбец
Логический тип (текст, число, дата, blob) Физический тип (корректный тип, зависящий от выбранной СУБД)
Первичный ключ Первичный ключ, индекс РК
Внешний ключ Внешний ключ, индекс FK
Альтернативный ключ АК-индекс - уникальный, непервичный индекс
Правило бизнес- логики Триггер или сохраненная процедура
Взаимосвязи Взаимосвязи, определяемые использованием FK-атрибутов

Денормализация

После нормализации все взаимосвязи данных становятся определены, исключая ошибки-при оперировании данными. Но нормализация данных снижает быстродействие БД. Для более эффективной работы с данными, используя возможности конкретного сервера БД, приходится производить процесс, обратный нормализации, - денормализацию.

Для процесса денормализации не существует стандартного алгоритма, поэтому в каждом конкретном случае приходится искать свое решение. Денормализация обычно проводится на физическом уровне модели. ERWin имеет следующие возможности по поддержке процесса денормализации:

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

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

  • Таблицы, столбцы, индексы и домены можно создавать только на физическом уровне. В

ERWin существует возможность выделения элементов модели таким образом, чтобы они не появлялись на логическом уровне. Эта возможность напрямую поддерживает денормализацию физической модели, так как позволяет проектировщику включать таблицы, столбцы и индексы в физическую модель, ориентированную на конкретную СУБД.

    Разрешение связей «многие-ко-многим». При разрешении этих связей в логической модели ERWin добавляет ассоциированные сущности и позволяет добавить в них атрибуты. При разрешении связей в логической модели автоматически разрешаются связи и в физической модели.

Пример

Нормализуем полученную в предыдущей лабораторной работе БД до третьей нормальной формы. Для приведения БД в первую нормальную форму необходимо выполнить условие, при котором все атрибуты содержат атомарные значения. Рассмотрим атрибуты сущности «Студент». Студент может иметь несколько адресов электронной почты и несколько телефонных номеров, что является нарушением первой нормальной формы. Необходимо создать отдельные сущности «E-mail» и «Телефон» и связать их с сущностью «Студент» (рис. 7.1).

Рис. 7.1. ERD-диаграмма БД студентов в первой нормальной форме

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

Для приведения БД к третьей нормальной форме необходимо обеспечить отсутствие транзитивных зависимостей неключевых атрибутов. Такая зависимость наблюдается у атрибутов «Специальность» и «Специализация» у сущности «Студент»: специализация зависит от специальности и от группы, в которой обучается студент. Создадим новую независимую сущность «Специальность», перенеся в нее атрибут «Специализация» и создав новый атрибут «Группа», являющийся ключевым и определяющий атрибуты «Специальность» и «Специализация». Проведем неидентифици-рующую связь от сущности «Специальность» к сущности «Студент», при этом ключевой атрибут «Группа» мигрирует в сущность «Студент». Получим БД в третьей нормальной форме, так как других транзитивных зависимостей неключевых атрибутов нет (рис. 7.2).

Рис. 7.2 . ERD- диаграмма БД студентов в третьей нормальной форме

Перейдем к построению физической модели. Перед построением физической модели необходимо выбрать тип базы данных в меню при создании физической модели. Выберем в качестве DataBase Microsoft Access 97 или 2000, получив физическую модель, сгенерированную ERWin по умолчанию (рис. 4.4).

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

Таблица 7.2. Свойства колонок таблиц физической модели БД студентов

Колонка Тип Размер Правило валидации

>10 и <100

Характеристика

Специальность

Специализация

Место работы

Уровень владения

Название

Описание

Дисциплина

Ф.И.О. преподавателя

После установки правил валидации (для этого сначала надо дать имя Validation Name, а затем отредактировать Validation Rule) в диалоговом окне Validation Rule Editor должны получиться следующие правила


Рис. 7.3. Правила валидации

После установки правил валидации в диалоговом окне Column Editor необходимо присвоить соответствующим колонкам таблиц установленные для них правила (рис. 4.4).

Рис. 7.4. Физическая модель БД студентов

Таким образом, проделав все вышеописанные действия, мы получили модель БД, готовую для помещения в СУБД. Для генерации кода создания БД необходимо выбрать иконку Forward Engineer после чего откроется окно установки свойств генерируемой схемы данных. Для предварительного просмотра SQL-скрипта служит кнопка Preview, для генерации схемы - Generate. В процессе генерации ERWin связывается с БД, выполняя SQL-скрипт. Если в процессе генерации возникают какие-либо ошибки, то она прекращается, открывается окно с сообщениями об ошибках.

Контрольные вопросы

  1. Что называется процессом нормализации?
  2. Что называется функциональной зависимостью?
  3. Что называется полной функциональной зависимостью,?
  4. Первая нормальная форма.
  5. Вторая нормальная форма.
  6. Третья нормальная форма.
  7. Нормальная форма Бойсса - Кодда.
  8. Что называется процессом денормализации?
  9. В чем смысл денормализации?
  10. Какова цель создания физической модели?
  11. Назовите функции
  12. ERWin по поддержке денормализации.
  13. Как осуществляется разрешение связей «многие-ко-многим»?

ERwin имеет два уровня представления модели - логический и физический. Логический уровень - это абстрактный взгляд на данные, на нем данные представляются так, как выглядят в реальном мире, и могут называться так, как они называются в реальном мире, например "Постоянный клиент", "Отдел" или "Фамилия сотрудника". Объекты модели, представляемые на логическом уровне, называются сущностями и атрибутами (подробнее о сущностях и атрибутах будет рассказано ниже). Логическая модель данных может быть построена на основе другой логической модели, например на основе модели процессов (см. гл. 1). Логическая модель данных является универсальной и никак не связана с конкретной реализацией СУБД.

Физическая модель данных, напротив, зависит от конкретной СУБД, фактически являясь отображением системного каталога. В физической модели содержится информация о всех объектах БД. Поскольку стандартов на объекты БД не существует (например, нет стандарта на типы данных), физическая модель зависит от конкретной реализации СУБД. Следовательно, одной и той же логической модели могут соответствовать несколько разных физических моделей. Если в логической модели не имеет значения, какой конкретно тип данных имеет атрибут, то в физической модели важно описать всю информацию о конкретных физических объектах - таблицах, колонках, индексах, процедурах и т. д. Разделение модели данных на логические и физические позволяет решить несколько важных задач.

Документирование модели. Многие СУБД имеют ограничение на именование объектов (например, ограничение на длину имени таблицы или запрет использования специальных символов - пробела и т. п.). Зачастую разработчики ИС имеют дело с нелокализованными версиями СУБД. Это означает, что объекты БД могут называться короткими словами, только латинскими символами и без использования специальных символов (т. е. нельзя назвать таблицу предложением - только одним словом). Кроме того, проектировщики БД нередко злоупотребляют "техническими" наименованиями, в результате таблица и колонки получают наименования типа RTD_324 или CUST_A12 и т. д. Полученную в результате структуру могут понять только специалисты (а чаще всего только авторы модели), ее невозможно обсуждать с экспертами предметной области. Разделение модели на логическую и физическую позволяет решить эту проблему. На физическом уровне объекты БД могут называться так, как того требуют ограничения СУБД. На логическом уровне можно этим объектам дать синонимы - имена более понятные неспециалистам, в том числе на кириллице и с использованием специальных символов. Например, таблице CUST_A12 может соответствовать сущность Постоянный клиент. Такое соответствие позволяет лучше задокументировать модель и дает возможность обсуждать структуру данных с экспертами предметной области.

Масштабирование. Создание модели данных, как правило, начинается с создания логической модели. После описания логической модели, проектировщик может выбрать необходимую СУБД и ERwin автоматически создаст соответствующую физическую модель. На основе физической модели ERwin может сгенерировать системный каталог СУБД или соответствующий SQL-скрипт. Этот процесс называется прямым проектированием (Forward Engineering). Тем самым достигается масштабируемость - создав одну логическую модель данных, можно сгенерировать физические модели под любую поддерживаемую ERwin СУБД. С другой стороны, ERwin способен по содержимому системного каталога или SQL-скрипту воссоздать физическую и логическую модель данных (Reverse Engineering). На основе полученной логической модели данных можно сгенерировать физическую модель для другой СУБД и затем сгенерировать ее системный каталог. Следовательно, ERwin позволяет решить задачу по переносу структуры данных с одного сервера на другой. Например, можно перенести структуру данных с Oracle на Informix (или наоборот) или перенести структуру dbf-файлов в реляционную СУБД, тем самым облегчив решение по переходу от файл-серверной к клиент-серверной ИС. Заметим, однако, что формальный перенос структуры "плоских" таблиц на реляционную СУБД обычно неэффективен. Для того чтобы извлечь выгоды от перехода на клиент-серверную технологию, структуру данных следует модифицировать. Процессы прямого и обратного проектирования будут рассмотрены ниже.

Для переключения между логической и физической моделью данных служит список выбора в левой части панели инструментов Erwin (рис. 2.1).

Рис. 2.1. Переключение между логической и физической моделью

При переключении, если физической модели еще не существует, она будет создана автоматически.

Интерфейс выполнен в стиле Windows-приложений, достаточно прост и интуитивно понятен. В дальнейшем будет описан интерфейс версии Erwin 3.5.2. Рассмотрим кратко основные функции ERwin по отображению модели, а также панель и палитру инструментов. Более подробно элементы интерфейса будут рассмотрены в последующих главах. Элементы панели инструментов описаны в табл. 2.1.

Таблица 2.1. Основная панель инструментов

Назначение кнопок

Создание, открытие, сохранение и печать модели

Вызов диалога Report Browser для генерации отчетов

Изменение уровня просмотра модели: уровень сущностей, уровень атрибутов и уровень определений

Изменение масштаба просмотра модели

Генерация схемы БД, выравнивание схемы с моделью и выбор сервера (доступны только на уровне физической модели)

Вызов дополнительной панели инструментов для работы с репозиторием Model Mart. (Работа с Model Mart рассмотрена в гл. 4)

Переключение между областями модели - Subject Area

Палитра инструментов выглядит различно на разных уровнях отображения модели. На логическом уровне (рис. 2.2) палитра инструментов имеет:

1. Слева направо, верхний ряд:

    кнопку указателя (режим мыши)

    В этом режиме можно установить фокус на каком-либо объекте модели;

    кнопку внесения сущности

    Для внесения сущности нужно щелкнуть левой кнопкой мыши по кнопке внесения сущности и один раз по свободному пространству на модели. Повторный щелчок приведет к внесению в модель еще одной новой сущности. Для редактирования сущностей или других объектов модели необходимо перейти в режим указателя;

    Специальный тип связи между сущностями, которая будет рассмотрена ниже. Для установления категориальной связи нужно щелкнуть левой кнопкой мыши по кнопке категории, затем один раз щелкнуть по сущности - родовому предку, затем - по сущности-потомку;

    кнопку внесения текстового блока. С ее помощью можно внести текстовый комментарий в любую часть графической модели.

2. Слева направо, нижний ряд:

    кнопку перенесения атрибутов внутри сущностей и между ними. Атрибуты могут быть перемещены способом

    кнопки создания связей: идентифицирующую, "многие-ко-многим" и неидентифицирующую.

Рис. 2.2. Палитра инструментов на логическом уровне

На физическом уровне (рис. 2.3) палитра инструментов имеет:

    вместо кнопки связи "многие-ко-многим" (третья справа кнопка в нижнем ряду) кнопку связей представлений.

Для создания моделей данных в ERwin можно использовать две нотации: IDEF1X и IE (Information Engineering). Методология IDEF1X была разработана для армии США и широко используется в государственных учреждениях США,

финансовых и промышленных корпорациях. Методология IE, разработанная Мартином (Martin), Финкельштейном (Finkelstein) и другими авторами, используется преимущественно в промышленности. Переключение между нотациями

можно сделать в закладке Methodology диалога Preferences (меню Option/Preferences) (рис. 2.4). В дальнейшем будет использоваться нотация IDEF1X.

Рис. 2.3. Палитра инструментов на физическом уровне

Рис. 2.4. Переключение между нотациями

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

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

ERwin позволяет связать с сущностью большую и малую иконки. При переключении на уровень иконок показывается большая иконка. Для отображения малой иконки следует выбрать в контекстном меню пункт Display Options/Entities и в каскадном меню включить опцию Entity Icon.

Малая иконка будет показана слева от имени сущности на всех.уровнях отображения модели. В табл. 2 2 показаны уровни отображения модели.

Таблица 2.2. Уровни отображения модели

Установка цвета и шрифта. Установить шрифт и цвет объектов в ERwin можно несколькими способами. Во-первых, для установки цвета и шрифта объекта служит панель инструментов Font and Color Toolbar, которая располагается под основной панелью. Значение каждого элемента приведено в табл. 2.3.

Таблица 2.3. Панель инструментов Font and Color Toolbar

Выбор наименования шрифта

Выбор размера шрифта

Выбор стиля шрифта

Выбор цвета заливки

Выбор цвета линий

Для редактирования шрифта и цвета конкретного объекта следует, щелкнув правой кнопкой мыши по сущности или связи и выбрав из всплывающего меню пункт Object Font/Color, вызвать диалог Font/Color Editor,

в котором определяются имя, описание и комментарии сущности. Диалог Font/Color Editor имеет три закладки, в которых можно выбрать шрифт и установить его размер, стиль и цвет (закладка Text), установить цвет заливки (закладка Fill, только для сущностей) и цвет линий (закладка Entity Outline, только для сущностей).

Имеется возможность изменить шрифт и цвет для всех объектов модели или для какой-либо отдельной категории объектов. Для этого служит диалог All Default Font/Color Editor (пункт меню Option/Default Font/Color). Каждая закладка на диалоге (рис. 2.5) позволяет редактировать шрифт и цвет для определенной категории объектов:

    All Fonts - все объекты модели;

    Entity Name - имена сущностей и таблиц;

    Entity Definition - определение сущностей и таблиц (показываются на уровне определений, см. табл. 2.2);

    Relationship - связи, включая имя и обозначение мощности;

    Text Block Text - текстовые блоки;

    Page Number - номер страницы при печати диаграммы;

    Owned Entity Attributes - атрибуты и колонки, за исключением атрибутов и колонок внешних ключей;

    Foreign Key - атрибуты и колонки внешних ключей;

    Background Color - цвет фона диаграммы;

    Entity Line - линии, которыми прорисовываются сущности и таблицы;

    Entity Fill - заливка сущностей и таблиц;

    Subtype Fill - заливка символов, обозначающих категории.

Рис. 2.5. Диалог АН Default Font/Color Editor

Иногда при работе Erwin3.X под операционной системой Windows NT в модели "расплываются" надписи - названия сущностей, атрибутов и комментариев. Эта ошибка связана с некорректной настройкой регистров Windows.

Имеется два способа борьбы с расплывающимися надписями при работе с Erwin3.X под NT:

1. При работе использовать заранее подготовленный шаблон. Для этого следует создать новый проект (НЕ ВКЛЮЧАЯ В НЕГО НОВЫЕ СУЩНОСТИ), установить шрифты, работающие корректно при прямом внесении сущностей (подбираются экспериментально),

Option/default font/color/All Fonts/All Objects и сохранить модель как шаблон - File/SaveAs/Files of Type/ERwin Template. При Reverse Engineering в качестве шаблона необходимо выбрать не стандартный шаблон, а вновь созданный.

2. Редактирование регистров NT. В разделе

HKEY_LOCAL_MACHINE

следует установить 204-ю таблицу - DEFAULT 0X000000cc (204).

В разделе

HKEY_LOCAL_MACHINE

следует для всех стандартных шрифтов установить ссылку на 204-ю таблицу, например:

При создании реальных моделей данных количество сущностей и атрибутов может исчисляться сотнями. Для более удобной работы с большими моделями в ERwin предусмотрены подмножества модели (Subject Area),

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

модели нужно вызвать диалог Subject Area Editor (меню Edit/Subject Area), в котором указывается имя подмножества и входящие в нее сущности (рис. 2 6) Все изменения, сделанные в любой Subject Area, автоматически отображаются на общей модели. Одна и та же сущность может входить в несколько Subject Area.

Рис. 2.6. Диалог Subject Area Editor

По умолчанию исходная модель получает имя Main Subject Area. При создании нового подмножества следует в диалоге Subject Area Editor указать ее имя и список входящих в него объектов. Для включения сущности в

Subject Area нужно выбрать ее в левом списке диалога и щелкнуть по кнопке . Сущность можно переместить в Subject Area вместе со всеми связанными с ней сущностями. Для этого следует воспользоваться кнопкой ,

причем можно задать уровень взаимосвязи (рис. 2.7) как для сущностей-потомков (Descedants), так и для сущностей-предков (Ancestors).

Рис. 2.7. Диалог задания уровня перемещения сущностей

Например, если в модели сущность Клиент связана с сущностью Заказ, а та в свою очередь с сущностью Предмет заказа, то при перемещении сущности Клиент со связанными сущностями уровня 2 (потомки) будут перемещены все три сущности.

ERwin позволяет разбить модель на несколько Subject Area, каждая из которых может соответствовать определенной задаче, например финансовой, производственной, маркетинговой и т. д. Для перехода от одного подмножества к другому служит

список выбора на панели инструментов (см. табл. 2.1). Subject Area можно создавать как в логической, так и в физической модели данных.

Хранимое отображение (Stored Display) - представление подмножества модели, отображающее специфический аспект структуры данных. Одна Subject Area может включать в себя несколько хранимых отображений.

В хранимое отображение входят те же самые сущности и связи, что и в Subject Area, но они могут по-разному располагаться на экране, иметь разные уровни (см: табл. 2.2), различный масштаб и цвет объектов или фона.

Для создания хранимого отображения служит диалог Stored Display Editor (меню Edit/Stored Display).

При определении нового хранимого отображения следует задать его имя, автора, описание и свойства как для логической, так и для физической модели.

При создании Subject Area в нее могут не входить либо родительская, либо дочерняя сущность. По умолчанию связи с сущностями, которые не вошли в Subject Area ("висящие связи"), не показываются. Для отображения таких связей следует включить опцию Show Dangling Relationship в закладке General диалога Stored Display Editor (рис. 2.8).

Хранимое отображение позволяет отобразить линии связей не только ортогональными, но и диагональными. Для представления связей диагональными линиями следует в закладке General выбрать опцию Diagonal (по умолчанию установлена опция Orthogonal).

Рис. 2.8. Диалог Stored Display Editor

Для переключения между хранимыми отображениями служат закладки в нижней части диаграммы (рис. 2.9).

Рис. 2.9. Переключение между хранимыми отображениями

Различают три уровня логической модели, отличающихся по глубине представления информации о данных:

    диаграмма

    сущность-связь (Entity Relationship Diagram, ERD);

    модель данных, основанная на ключах (

    Key Based model, KB);

    атрибутивная модель (Fully Attributed model, FA).

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

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

Модель данных, основанная на ключах, - более подробное представление данных. Она включает описание всех сущностей и первичных ключей и предназначена для представления структуры данных и ключей, которые соответствуют предметной области.

Полная атрибутивная модель - наиболее детальное представление структуры данных: представляет данные в третьей нормальной форме и включает все сущности, атрибуты и связи.

Основные компоненты диаграммы Erwin - это сущности, атрибуты и связи. Каждая сущность является множеством подобных индивидуальных объектов, называемых экземплярами. Каждый экземпляр индивидуален

и должен отличаться от всех остальных экземпляров. Атрибут выражает определенное свойство объекта. С точки зрения БД (физическая модель) сущности соответствует таблица, экземпляру сущности - строка в таблице, а атрибуту -колонка таблицы.

Построение модели данных предполагает определение сущностей и атрибутов, т. е. необходимо определить, какая информация будет храниться в конкретной сущности или атрибуте. Сущность можно определить как объект, событие или концепцию,

информация о которых должна сохраняться. Сущности должны иметь наименование с четким смысловым значением, именоваться существительным в единственном числе, не носить "технических" наименований и быть достаточно важными для того, чтобы их моделировать.

Именование сущности в единственном числе облегчает в дальнейшем чтение модели. Фактически имя сущности дается по имени ее экземпляра. Примером может быть сущность Заказчик (но не Заказчики !)с атрибутами Номер заказчика, Фамилия заказчика и Адрес заказчика.

На уровне физической модели ей может соответствовать таблица Customer с колонками Customer_number, Customer_name и Customer_address.

Для внесения сущности в модель необходимо (убедившись предварительно, что вы находитесь на уровне логической модели - переключателем между логической и физической моделью служит раскрывающийся список в правой части панели инструментов)

"кликнуть" по кнопке сущности на панели инструментов (ERwin Toolbox) , затем "кликнуть" по тому месту на диаграмме, где необходимо расположить новую сущность. Щелкнув правой кнопкой мыши по сущности и выбрав из всплывающего меню пункт Entity Editor, можно вызвать диалог Entity Editor, в котором определяются имя, описание и комментарии сущности (рис. 2.10).

Каждая сущность должна быть полностью определена с помощью текстового описания в закладке Definition. Закладки Note, Note 2, Note 3, UDP (User Defined Properties - Свойства, определенные пользователем) служат для внесения дополнительных комментариев и определений к сущности. В прежних версиях ERwin закладкам Note2 и Note3 соответствовали окна Query и Sample.

Закладка Definition используется для ввода определения сущности. Эти определения полезны как на логическом уровне, поскольку позволяют понять, что это за объект, так и на физическом уровне, поскольку их можно экспортировать как часть схемы и использовать в реальной БД (CREATE COMMENT on entity_name).

Закладка Note позволяет добавлять дополнительные замечания о сущности, которые не были отражены в определении, введенном в закладке Definition. Здесь можно ввести полезное замечание, описывающее какое-либо бизнес-правило или соглашение по организации диаграммы.

В закладке Note 2 можно задокументировать некоторые возможные запросы, которые, как ожидается, будут использоваться по отношению к сущности в БД. При переходе к физическому проектированию, записанные запросы помогут принимать такие решения в отношении проектирования, которые сделают БД более эффективной.

Рис. 2.10. Диалог Entity Editor

Закладка Note 3 позволяет вводить примеры данных для сущности (в произвольной форме).

В закладке Icon каждой сущности можно поставить в соответствие изображение, которое будет отображаться в режиме просмотра модели на уровне иконок (см. табл. 2.2). В этой закладке можно задать как большую иконку,

которая будет отображаться на уровне Icon, так и малую иконку, которая будет отображаться на всех уровнях просмотра модели. Для связывания изображения с сущностью необходимо щелкнуть по кнопке

В появившемся диалоге ERwin Icon Editor щелкнуть по кнопке Import и выбрать соответствующий файл формата bmp. После выбора иконки она отображается в закладке Icon диалога Entity Editor (рис. 2.11).

Рис. 2.11. Закладка Icon диалога Entity Editor

Использование свойств, определяемых пользователем (UDP), аналогично их использованию в BPwin (см. гл. 1.4). Для определения UDP служит диалог User-Defined Property Editor (вызывается из меню Edit/UDPs).

В нем необходимо указать вид объекта, для которого заводится UDP (диаграмма в целом, сущность, атрибут и т. д.) и тип данных. Для внесения нового свойства следует щелкнуть в таблице по кнопке “+”, и внести имя, тип данных, значение по умолчанию и определение.

ERwin поддерживает для UDP шести типов данных:

    Date. Дата. Используется формат MM/DD/YY. Для выбора значения даты можно использовать контекстный календарь;

    Int. Целое число;

    Real. Действительное число;

    Text. Строка (ASCII);

    List. Список. При задании списка в диалоге User-Defined Property Editor значения следует разделять запятой, значение по умолчанию выделяется символом "~" (рис. 2.12);

    Command. Команда - выполняемая строка. На рис. 2.11 свойство Document имеет тип Command.

Рис. 2.12. Диалог User-Defined Property Editor

Значение свойств, определяемых пользователем, задается в закладке UDP диалога Entity Editor. Если присвоить сущности значение свойства Document "D:\MSOffice97\Office\WINWORD.EXE part3.doc" (рис. 2.13), то из закладки можно редактировать документ part3 (кнопка “…” в строке таблицы UDP).

Рис. 2.13. Закладка UDP диалога Entity Editor

Как было указано выше, каждый атрибут хранит информацию об определенном свойстве сущности, а каждый экземпляр сущности должен быть уникальным. Атрибут или группа атрибутов, которые идентифицируют сущность,

называется первичным ключом. Для описания атрибутов следует, "кликнув" правой кнопкой по сущности, выбрать в появившемся меню пункт Attribute Editor. Появляется диалог Attribute Editor (рис. 2.14).

Рис. 2.14. Диалог Attribute Editor

Если щелкнуть по кнопке New, то в появившемся диалоге New Attribute (рис. 2.15) можно указать имя атрибута, имя соответствующей ему в физической модели колонки и домен. Домен атрибута будет использоваться при определении типа колонки на уровне физической модели.

Рис. 2.15. Диалог New Attribute

Для атрибутов первичного ключа в закладке General диалога Attribute Editor необходимо сделать пометку в окне выбора Primary Key.

Закладка Definition позволяет записывать определения отдельных атрибутов. Определения атрибутов можно также сгенерировать как часть схемы (CREATE COMMENT on entity_name.attribute_name). Закладка

Note позволяет добавлять замечания об одном или нескольких атрибутах сущности, которые не вошли в определения. Закладка UDP служит для задания значений свойств, определяемых пользователем. Предварительно эти свойства должны быть внесены в диалог User-Defined Property Editor как свойства атрибутов.

При установлении связей между сущностями атрибуты первичного ключа родительской сущности мигрируют в качестве внешних ключей в дочернюю сущность. Кнопка Migrate диалога Attribute Editor вызывает диалог Migrate Attribute Property, в котором можно задать свойства, сохраняемые при миграции.

Для большей наглядности диаграммы каждый атрибут можно связать с иконкой. При помощи списка выбора Icon в закладке General можно связать иконку с атрибутом.

Рис. 2.16. Диалог Erwin Icon Editor

Каждому домену соответствует стандартная иконка, однако можно импортировать и дополнительные изображения. Кнопка “…” справа от списка выбора Icon вызывает диалог ERwin Icon Editor (рис. 2.16), щелкнув по кнопке Import можно добавить в список необходимую иконку.

Рис. 2.17. Отображение сущности на уровне атрибутов с включенной опцией Attribute Icon

Для отображения иконки атрибута следует выбрать в контекстном меню пункт Display Options/Entities и в каскадном меню включить опцию Attribute Icon. Малая иконка будет показана слева от имени атрибута

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

Очень важно дать атрибуту правильное имя. Атрибуты должны именоваться в единственном числе и иметь четкое смысловое значение. Соблюдение этого правила позволяет частично решить проблему нормализации

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

множественных значений. Согласно синтаксису IDEF1X имя атрибута должно быть уникально в рамках модели (а не только в рамках сущности!). По умолчанию при попытке внесения уже существующего имени атрибута Erwin переименовывает его. Например, если атрибут Комментарий уже существует в модели, другой атрибут (в другой сущности) будет назван Комментарий/ 2, затем Комментарш/3 и т. д.

Рис. 2.18. Диалог Unique Name Option

На практике такое переименование не всегда удобно, поэтому существует возможность отменить эту опцию. В диалоге Unique Name Option (меню Option/Unique Name) (рис. 2.18) можно задать следующие режимы именования атрибутов:

    Allow - позволить внесение одинаковых имен;

    Rename - переименовывать атрибуты (по умолчанию);

    Ask - запрашивать возможные действия каждый раз при внесении одноименных атрибутов. ERwin будет показывать на экране окно-диалог Edit Unique Name каждый раз, когда вводится неуникальное имя сущности или атрибута. В диалоге Edit Unique Name можно ввести другое имя или разрешить дублирование. При этом новое имя не проверяется на уникальность;

    Disallow - запретить внесение одинаковых имен. Если двойное имя обнаружено, то ERwin выдает на экран окно с сообщением, что ввод неуникальных имен запрещается.

Каждый атрибут должен быть определен (закладка Definition), при этом следует избегать циклических определений, например когда термин 1 определяется через термин 2, термин 2 - через термин 3, а термин 3 в свою очередь - через термин 1 (рис. 2.19).

Рис. 2.19. Циклическое определение атрибутов

Иногда определение атрибута легче дать через описание области значений. Например, оценка школьника - это число, принимающее значения 2, 3, 4 и 5.

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

быть вычислен из атрибута Дата рождения сотрудника. Такой атрибут может привести к конфликтам; действительно, если вовремя не обновить значение атрибута Возраст сотрудника, он может противоречить значению атрибута

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

При переносе атрибутов внутри и между сущностями можно воспользоваться техникой drag&drop, выбрав кнопку в палитре инструментов.

Связь является логическим соотношением между сущностями. Каждая связь должна именоваться глаголом или глагольной фразой (Relationship Verb Phrases) (рис. 2.20). Имя связи выражает некоторое ограничение или бизнес-правило и облегчает чтение диаграммы, например:

    Каждый КЛИЕНТ <размещает> ЗАКАЗы;

    Каждый ЗАКАЗ <выполняется> СОТРУДНИКом.

Рис. 2.20. Имя связи - Relationship Verb Phrases

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

которое появляется, если щелкнуть левой кнопкой мыши по любому месту диаграммы, не занятому объектами модели, выбрать пункт Display Options/Relationship и затем включить опцию Verb Phrase.

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

В IDEF1X различают зависимые и независимые сущности. Тип сущности определяется ее связью с другими сущностями. Идентифицирующая связь устанавливается между независимой (родительский конец связи)

и зависимой (дочерний конец связи) сущностями. Когда рисуется идентифицирующая связь, ERwin автоматически преобразует дочернюю сущность в зависимую. Зависимая сущность изображается прямоугольником

со скругленными углами (сущность Заказ на рис. 2.21). Экземпляр зависимой сущности определяется только через отношение к родительской сущности, т. е. в структуре на рис. 2.21 информация о заказе не может быть внесена

и не имеет смысла без информации о клиенте, который его размещает. При установлении идентифицирующей связи атрибуты первичного ключа родительской сущности автоматически переносятся в состав первичного

ключа дочерней сущности. Эта операция дополнения атрибутов дочерней сущности при создании связи называется миграцией атрибутов. В дочерней сущности новые атрибуты помечаются как внешний ключ - (FK).

Рис. 2.21. Идентифицирующая связь между независимой и зависимой таблицей

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

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

Рис. 2.22. Неидентифицирующая связь

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

Идентифицирующая связь показывается на диаграмме сплошной линией с жирной точкой на дочернем конце связи (см. рис. 2.21), неидентифицирующая - пунктирной (рис. 2.22).

Для создания новой связи следует:

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

    щелкнуть сначала по родительской, а затем по дочерней сущности.

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

В палитре инструментов кнопка соответствует идентифицирующей связи, кнопка связи многие-ко-многим и кнопка соответствуют неидентифицирующей связи.

Для редактирования свойств связи следует "кликнуть" правой кнопкой мыши по связи и выбрать на контекстном меню пункт Relationship Editor.

В закладке General появившегося диалога можно задать мощность, имя и тип связи (рис. 2.23).

Мощность связи (Cardinality) - служит для обозначения отношения числа экземпляров родительской сущности к числу экземпляров дочерней.

Различают четыре типа мощности (рис. 2.24):

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

    0, 1 или много экземпляров дочерней сущности не помечается каким-либо символом;

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

    1 или много экземпляров дочерней сущности (исключено нулевое значение);

    символом

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

    цифрой помечается случай точного соответствия, когда одному экземпляру родительской сущности соответствует заранее заданное число экземпляров дочерней сущности.

Рис. 2.23. Диалог Relationship Editor

По умолчанию символ, обозначающий мощность связи, не показывается на диаграмме. Для отображения имени следует в контекстном меню, которое появляется, если щелкнуть левой кнопкой мыши по любому месту диаграммы, не занятому объектами модели, выбрать пункт Display Options/Relationship и затем включить опцию Cardinality.

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

Рис. 2.24. Обозначения мощности

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

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

Рис. 2.25. Закладка Rolename/RI Actions диалога Relationship Editor

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

В закладке Rolename/RI Actions можно задать имя роли и правила ссылочной целостности.

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

Рис. 2.26. Имена ролей внешних ключей

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

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

Рис. 2.27. Случай обязательности имен ролей

Другим примером обязательности присвоения имен ролей являются рекурсивные связи (иногда их называют "рыболовный крючок" - fish hook), когда одна и та же сущность является и родительской и дочерней одновременно. При задании рекурсивной связи атрибут должен мигрировать в качестве внешнего ключа в состав неключевых атрибутов той же сущности. Атрибут не может появиться дважды в одной сущности под одним именем, поэтому обязательно должен получить имя роли. На рис. 2.26 сущность Сотрудник содержит атрибут первичного ключа Табельный номер. Информация о руководителе сотрудника содержится в той же сущности, поскольку руководитель работает в той же организации. Чтобы сослаться на руководителя сотрудника следует создать рекурсивную связь (на рис. 2.26 связь руководит/подчиняется) и присвоить имя роли ("Руководитель"). Заметим, что рекурсивная связь может быть только неидентифицирующей. В противном случае внешний ключ должен был бы войти в состав первичного ключа и получить при генерации схемы признак NOT NULL. Это сделало бы невозможным построение иерархии - у дерева подчиненности должен быть корень - сотрудник, который никому не подчиняется в рамках данной организации.

Связь руководит/подчиняется на рис. 2.26 позволяет хранить древовидную иерархию подчиненности сотрудников. Такой вид рекурсивной связи называется иерархической рекурсией (hierarchical recursion) и задает связь, когда руководитель (экземпляр родительской сущности) может иметь множество подчиненных (экземпляров дочерней сущности), но подчиненный имеет только одного руководителя (рис. 2.28).

Иерархическая рекурсия Сетевая рекурсия



Рис. 2.28. Подчиненность экземпляров сущности в иерархической и сетевой рекурсии

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

Рис. 2.29. Пример реализации сетевой рекурсии

На рис. 2.29 рассмотрен пример реализации сетевой рекурсии. Структура моделирует родственные отношения между членами семьи любой сложности. Атрибут Тип отношения может принимать значения "отец-сын", "мать-дочь", "дед-внук", "свекровь-невестка", "тесть-зять" и т. д. Поскольку родственное отношение связывает всегда двух людей, от сущности Родственник к. сущности Родственное отношение установлены две идентифицирующие связи с именами ролей "Старший" и "Младший". Каждый член семьи может быть в родственных отношениях с любым другим членом семьи, более того, одну и ту же пару родственников могут связывать разные типы родственных отношений.

Если атрибут мигрирует в качестве внешнего ключа более чем на один уровень, то на первом уровне отображается полное имя внешнего ключа (имя роли + базовое имя атрибута), на втором и более - только имя роли. На рис. 2.30 изображена структура данных, которая содержит сущность Команда, сущность Игрок, в которой хранится информация об игроках каждой команды, и сущность Гол, содержащая информацию и голах, которые забивает каждый игрок. Атрибут внешнего ключа Номер команды сущности Игрок имеет имя роли "В какой команде играет".

Рис. 2.30. Миграция имен ролей

На следующем уровне, в сущности Гол, отображается только имя роли соответствующего атрибута внешнего ключа (В какой команде играет).

Правила ссылочной целостности (referential integrity, RI) - логические конструкции, которые выражают бизнес-правила использования данных и представляют собой правила вставки, замены и удаления. При генерации схемы БД на основе опций логической модели, задаваемых в закладке Rolename/RI Actions, будут сгенерированы правила декларативной ссылочной целостности, которые должны быть предписаны для каждой связи, и триггеры, обеспечивающие ссылочную целостность. Триггеры представляют собой программы, выполняемые всякий раз при выполнении команд вставки, замены или удаления (INSERT, UPDATE или DELETE). На рис. 2.30 существует идентифицирующая связь между сущностями Команда и Игрок. Что будет, если удалить команду? Экземпляр сущности Игрок не может существовать без команды (атрибут первичного ключа В какой команде играет. Номер команды не может принимать значение NULL), следовательно, нужно либо запретить удаление команды, пока в ней числится хотя бы один игрок (для удаления команды сначала нужно удалить всех игроков), либо сразу удалять вместе с командой всех ее игроков. Такие правила удаления называются "ограничение" и "каскад" (Parent RESTRICT и Parent CASCADE, см. рис. 2.25). Заметим, что сущности Игрок и Гол, в свою очередь, тоже связаны идентифицирующей связью и в случае удаления каскадом команды будут удалены все игроки команды и все голы, которые они забивали. Выполнение команды на удаление одной строки реально может привести к удалению тысячи строк в БД, поэтому использовать правило удаления каскадом следует с осторожностью. В том случае, если установлено правило ограничения удаления, при попытке выполнить удаление команды, в которой есть хотя бы один игрок, сервер реляционной СУБД возвратит ошибку.

На рис. 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,

Child Delete Режимы по умолчанию

Child Insert Возможные режимы

RESTRICT, CASCADE,

RESTRICT, CASCADE, NONE, SET DEFAULT

RESTRICT, CASCADE,

Child Insert Режимы по умолчанию

Child Update Возможные режимы

RESTRICT, CASCADE, NONE

RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT

RESTRICT, CASCADE, NONE, SET DEFAULT

RESTRICT, CASCADE, NONE

Child Update Режимы по умолчанию

Parent Delete Возможные режимы

RESTRICT, CASCADE, NONE

RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT

RESTRICT, CASCADE, NONE, SET DEFAULT

RESTRICT, CASCADE,

Parent Delete Режимы по умолчанию

Parent Insert Возможные режимы

RESTRICT, CASCADE, NONE

RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT

RESTRICT, CASCADE, NONE, SET DEFAULT

RESTRICT, CASCADE, NONE

Parent Insert Режимы по умолчанию

Parent Update Возможные режимы

RESTRICT, CASCADE, NONE

RESTRICT, CASCADE, NONE, SET NULL,SET DEFAULT

RESTRICT, CASCADE, NONE, SET DEFAULT

RESTRICT, CASCADE, NONE

Parent Update Режимы по умолчанию

Связь многие-ко-многим возможна только на уровне логической модели данных. На рис. 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.34. Пример характеристической сущности "Хобби "

Ассоциативная - сущность, связанная с несколькими родительскими сущностями. Такая сущность содержит информацию о связях сущностей. Примером ассоциативной сущности является Visit на рис. 2.33.

Именующая - частный случай ассоциативной сущности, не имеющей собственных атрибутов (только атрибуты родительских сущностей, мигрировавших в качестве внешнего ключа). Примером именующей сущности является Doctor_Patient на рис. 2.32.

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

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

Для каждой категории можно указать дискриминатор - атрибут родового предка, который показывает, как отличить одну категориальную сущность от другой (атрибут Тип на рис. 2 35).

Рис. 2.35. Иерархия наследования. Неполная категория

Иерархии категорий делятся на два типа - полные и неполные. В полной категории одному экземпляру родового предка (сущность Служащий, рис. 2.36) обязательно соответствует экземпляр в каком-либо потомке, т. е. в примере служащий обязательно является либо совместителем, либо консультантом, либо постоянным сотрудником.

Если категория еще не выстроена полностью и в родовом предке могут существовать экземпляры, которые не имеют соответствующих экземпляров в потомках, то такая категория будет неполной. На рис. 2.35 показана неполная категория - сотрудник может быть не только постоянным или совместителем, но и консультантом, однако сущность Консультант еще не внесена в иерархию наследования.

Рис. 2.36. Иерархия наследования. Полная категория

Полная категория помечается символом , неполная - . Возможна комбинация полной и неполной категорий. На рис. 2.37 помимо постоянных сотрудников и совместителей могут быть и консультанты, что не отражено в иерархии (неполная категория), но каждый постоянный сотрудник либо мужчина, либо женщина (полная категория).

Рис. 2.37. Иерархия наследования. Комбинация полной и неполной категорий

Для редактирования категорий нужно щелкнуть правой кнопкой мыши по символу категории и выбрать в контекстном меню пункт Subtype Relationship Editor. В диалоге Subtype Relationship (рис. 2.38) можно указать атрибут - дискриминатор категории (список Discriminator Attribute Choice) и тип категории - полная/неполная (радиокнопки Complete/Incomplete).

Рис. 2.38. Диалог Subtype Relationship

Рассмотрим возможные стадии построения иерархии наследования. Определение сущностей с общими (по определению) атрибутами. Предположим, в процессе проектирования созданы сущности Постоянный сотрудник и Совместитель (рис. 2.39). Можно заметить, что часть атрибутов у этих сущностей (Фамилия, Имя, Отчество, Дата рождения, Должность) имеет одинаковый смысл.

Рис. 2.39. Сущности с общими по смыслу атрибутами

Перенос общих атрибутов в сущность - родовой предок. В случае обнаружения совпадающих по смыслу атрибутов следует создать новую сущность (Сотрудник) - родовой предок и перенести в нее общие атрибуты (Фамилия, Имя, Отчество, Дата рождения. Должность).

Создание неполной структуры категорий. Создается категориальная связь от новой сущности - родового предка к старым сущностям - потомкам. Новая сущность дополняется атрибутом-дискриминатором категории (Тип) (см. рис. 2.35).

Создание полной структуры категорий. Проводится дополнительный поиск сущностей, имеющих общие по смыслу атрибуты с родовым предком. В примере это сущность Консультант (рис. 2.40).

Рис. 2.40. Дополнительная сущность с общими по смыслу атрибутами

Общие атрибуты переносятся в родового предка и категория преобразуется в полную (признак полной категории устанавливается в диалоге Subtype Relationship). Сущность Консультант не имеет атрибута Должность, поэтому в родовом предке значение этого атрибута в случае консультанта будет NULL. В зависимости от бизнес-правил атрибут Должность может быть перенесен обратно из родового предка в сущности - потомки Постоянный сотрудник и Совместитель.

Комбинации полной и неполной структур категорий. При необходимости создание иерархии категорий можно продолжить. Для каждого потомка может найтись сущность с общими атрибутами, тогда сущность - потомок становится родовым предком для новых потомков, и т. д. (см. рис. 2.37).

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

Первичный ключ (primary key) - это атрибут или группа атрибутов, однозначно идентифицирующая экземпляр сущности. Атрибуты первичного ключа на диаграмме не требуют специального обозначения - это те атрибуты, которые находятся в списке атрибутов выше горизонтальной линии (см., например, рис. 2.33). При внесении нового атрибута в диалоге Attribute Editor для того, чтобы сделать его атрибутом первичного ключа, нужно включить флажок Primary Key в нижней части закладки General. На диаграмме неключевой атрибут можно внести в состав первичного ключа, воспользовавшись режимом переноса атрибутов (кнопка в палитре инструментов).

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

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

Рассмотрим кандидатов на первичный ключ сущности Сотрудник (рис. 2.41).

Здесь можно выделить следующие потенциальные ключи:

1. Табельный номер,

2. Номер паспорта;

3. Фамилия + Имя + Отчество.

Рис. 2.41. Определение первичного ключа для сущности "Сотрудник"

Для того чтобы стать первичным, потенциальный ключ должен удовлетворять ряду требований:

Уникальность. Два экземпляра не должны иметь одинаковых значений возможного ключа. Потенциальный ключ № 3 (Фамилия + Имя + Отчество) является плохим кандидатом, поскольку в организации могут работать полные тезки.

Компактность. Сложный возможный ключ не должен содержать ни одного атрибута, удаление которого не приводило бы к утрате уникальности. Для обеспечения уникальности ключа № 3 дополним его атрибутами Дата рождения и Цвет волос. Если бизнес-правила говорят, что сочетания атрибутов Фамилия + Имя + Отчество + Дата рождения достаточно для однозначной идентификации сотрудника, то Цвет волос оказывается лишним, т. е. ключ Фамилия + Имя + Отчество + Дата рождения + Цвет волос не является компактным.

При выборе первичного ключа предпочтение должно отдаваться более простым ключам, т. е. ключам, содержащим меньшее количество атрибутов. В примере ключи № 1 и 2 предпочтительней ключа № 3.

Атрибуты ключа не должны содержать нулевых значений. Если допускается, что сотрудник может не иметь паспорта или вместо паспорта иметь какое-либо другое удостоверение личности, то ключ № 2 не подойдет на роль первичного ключа. Если для обеспечения уникальности необходимо дополнить потенциальный ключ дополнительными атрибутами, то они не должны содержать нулевых значений. Дополняя ключ № 3 атрибутом Дата рождения, нужно убедиться в том, что даты рождения известны для всех сотрудников.

Значение атрибутов ключа не должно меняться в течение всего времени существования экземпляра сущности. Сотрудница организации может выйти замуж и сменить как фамилию, так и паспорт. Поэтому ключи № 2 и 3 не подходят на роль первичного ключа.

Каждая сущность должна иметь по крайней мере один потенциальный ключ. Многие сущности имеют только один потенциальный ключ. Такой ключ становится первичным. Некоторые сущности могут иметь более одного возможного ключа. Тогда один из них становится первичным, а остальные - альтернативными ключами. Альтернативный ключ (Alternate Key) - это потенциальный ключ, не ставший первичным. ERwin позволяет выделить атрибуты альтернативных ключей, и по умолчанию в дальнейшем при генерации схемы БД по этим атрибутам будет генерироваться уникальный индекс.

При работе ИС часто бывает необходимо обеспечить доступ к нескольким экземплярам сущности, объединенным каким-либо одним признаком. Для повышения производительности в этом случае используются неуникальные индексы. ERwin позволяет на уровне логической модели назначить атрибуты, которые будут участвовать в неуникальных индексах. Атрибуты, участвующие в неуникальных индексах, называются Inversion Entries (инверсионные входы). Inversion Entry - это атрибут или группа атрибутов, которые не определяют экземпляр сущности уникальным образом, но часто используются для обращения к экземплярам сущности. ERwin генерирует неуникальный индекс для каждого Inversion Entry.

Создать альтернативные ключи и инверсионные входы можно в закладке Key Group диалога Attribute Editor (рис. 2.42). Если щелкнуть по кнопке!!!, расположенной в правой верхней части закладки, вызывается диалог Key Group Editor (рис. 2.43). В верхней части диалога находится список ключей, в нижней - список атрибутов, доступных для включения в состав ключа (слева), и список ключевых атрибутов. Каждый вновь созданный ключ должен иметь хотя бы один атрибут. Для включения атрибута в состав ключа следует выделить его в левом списке и щелкнуть по кнопке!!!

Рис. 2.43. Диалог Key Group Editor

Для создания нового ключа следует щелкнуть по кнопке New. Появляется диалог New Key Group (рис. 2.44). Имя нового ключа присваивается автоматически ("Alternate Key N" для альтернативного ключа и "Inversion Entry N" для инверсионного входа, где N - порядковый номер ключа).

Рис. 2.44. Диалог New Key Group

Каждому ключу соответствует индекс, имя которого также присваивается автоматически ("XAKNENTITY" для альтернативного ключа и " XIENENTITY" для инверсионного входа, где N - порядковый номер ключа, ENTITY - имя сущности). Имена ключа и индекса при желании можно изменить вручную.

Рис. 2.45. Сущность "Сотрудник" с отображением ключей

На диаграмме атрибуты альтернативных ключей обозначаются как (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).

Внешние ключи (Foreign Key) создаются автоматически, когда связь соединяет сущности: связь образует ссылку на атрибуты первичного ключа в дочерней сущности и эти атрибуты образуют внешний ключ в дочерней сущности (миграция ключа). Атрибуты внешнего ключа обозначаются символом (FK) после своего имени (см. рис. 2.45). Атрибут внешнего ключа Где работает. Номер отдела ("Где работает" - имя роли) является атрибутом первичного ключа (РК) в сущности Отдел.

Зависимая сущность может иметь один и тот же внешний ключ из нескольких родительских сущностей. Сущность может также получить один и тот же внешний ключ несколько раз от одного и того же родителя через несколько разных связей. Когда ERwin обнаруживает одно из этих событий, он распознает, что два атрибута одинаковы, и помещает атрибут внешнего ключа в зависимой сущности только один раз. Хотя в закладке Key Group диалога Attribute Editor этот атрибут будет входить в два внешних ключа, на диаграмме он показывается только один раз. Это комбинирование или объединение идентичных атрибутов называется унификацией.

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

Рис. 2.46. Унификация атрибута

По смыслу это одно и то же значение номера отдела, поскольку в отделе реализуется проекты, которые ведут сотрудники того же отдела. ERwin унифицирует атрибуты и отображает на диаграмме только один атрибут Номер отдела.

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

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

    первая нормальная форма (1

    вторая нормальная форма (2

    третья нормальная форма (3

    нормальная форма Бойса

    Кодда (усиленная 3NF);

    четвертая нормальная форма (4

    пятая нормальная форма (5

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

Для углубленного изучения нормализации следует рекомендовать книгу К. Дж. Дейта "Введение в системы баз данных" (Киев;М.:Диалектика, 1998).

Нормальные формы основаны на понятии функциональной зависимости (в дальнейшем будет использоваться термин "зависимость"). Приведем формальное определение для функциональной зависимости.

Функциональная зависимость (FD). Атрибут В сущности Е функционально зависит от атрибута А сущности Е тогда и только тогда, когда каждое значение А в Е связало с ним точно одно значение В в Е, т. е. А однозначно определяет В.

Полная функциональная зависимость. Атрибут В сущности Е полностью функционально зависит от ряда атрибутов А сущности Е тогда и только тогда, когда В функционально зависит от А и не зависит ни от какого подряда А.

Рис. 2.47. Ненормализованная сущность "Сотрудник"

На рис. 2.47 в сущности Сотрудник значение атрибутов Фамилия, Имя и Отчество однозначно определяются значением атрибута Табельный номер, т. е. атрибуты Фамилия, Имя и Отчество зависят от атрибута Табельный номер. Функциональные зависимости определяются бизнес-правилами предметной области. Так, если оклад сотрудника определяется только должностью, то атрибут Оклад зависит от атрибута Должность; если оклад зависит еще, например, от стажа, то такой зависимости нет. В нижеследующих примерах будем считать для определенности, что такая зависимость есть.

Рассмотрим нормальные формы.

Первая нормальная форма (1 NF). Сущность находится в первой нормальной форме тогда и только тогда, когда все атрибуты содержат атомарные значения. Среди атрибутов не должно встречаться повторяющихся групп, т. е. несколько значений для каждого экземпляра. На рис, 2 47 атрибуты Телефон и Хобби являются нарушением первой нормальной формы. Что будет, если у сотрудника несколько рабочих телефонов? Запись значения колонки через разделитель, например "124-56-78, 124-56-79, 124-56-90" или "Аквалангист, мотоциклист, шахматист", приводит к ряду проблем. Размера поля может не хватить для хранения данных (нельзя увеличивать список телефонов до бесконечности), по такой колонке невозможно построить индекс и т. д. и т. п. Сущность, приведенная на рис. 2.48, не является решением проблемы. Что будет, если у сотрудника появится четвертый телефон или третье хобби? Эту информацию будет негде хранить.

Рис. 2.48. Еще один пример ненормализованной сущности

Другой ошибкой нормализации является хранение в одном атрибуте разных по смыслу значений. На рис. 2.47 атрибут Дата зачисления или увольнения хранит информацию как о зачислении, так и об увольнении сотрудника. Если хранится только одно значение, то невозможно понять, какая именно дата внесена. Если внести атрибут-признак типа даты, тип можно будет определить, но останется возможность хранения только одной даты для каждого сотрудника.

Для приведения сущности к первой нормальной форме следует:

    разделить сложные атрибуты на атомарные,

    создать новую сущность,

    перенести в нее все "повторяющиеся" атрибуты,

    выбрать возможный ключ для нового РК (или создать новый РК).

    установить идентифицирующую связь от прежней сущности к новой, РК прежней сущности станет внешним ключом (

    FK) для новой сущности.

На рис. 2.49 показана сущность Сотрудник, приведенная к первой нормальной форме.

Рис. 2.49. Сущность "Сотрудник", приведенная к первой нормальной форме

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

Рис. 2.50. Сущность "Проект"

Предположим, сущность Проект содержит информацию о проекте, которым руководит сотрудник, причем информация содержится как непосредственно о проекте, так и о руководителе проекта (рис. 2.50). Атрибуты Фамилия, Имя, Отчество и Должность зависят только от атрибута Табельный номер руководителя, но вовсе не от Наименования проекта. Другими словами, имеется зависимость только от части ключа.

    выделить атрибуты, которые зависят только от части первичного ключа, создать новую сущность;

    поместить атрибуты, зависящие от части ключа, в их собственную (новую) сущность;

    установить идентифицирующую связь от прежней сущности к новой (рис.

Рис. 2.51. Сущность "Проект", приведенная ко второй нормальной форме

Вторая нормальная форма позволяет избежать следующих аномалий при выполнении операций:

Обновление (UPDATE). Имеет место дублирование данных о сотруднике, если он руководит несколькими проектами. Если данные о сотруднике изменяются, необходимо менять несколько записей (по числу ведомых проектов).

Вставка (INSERT). Невозможно ввести данные о сотруднике, если он в данный момент не руководит проектами.

Удаление (DELETE). Если сотрудник временно прекращает руководство проектами, данные о нем теряются.

На рис. 2.51 показана сущность Проект, приведенная ко второй нормальной форме.

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

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

Для приведения сущности ко второй нормальной форме следует:

    создать новую сущность и перенести в нее атрибуты с одной и той же зависимостью от неключевого атрибута;

    использовать атрибут(ы), определяющий эту зависимость, в качестве первичного ключа новой сущности;

    установить неидентифицирующую связь от новой сущности к старой (рис.

Рис. 2.52. Сущность "Сотрудник", приведенная к третьей нормальной форме

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

Обновление (UPDATE). Имеет место дублирование данных об окладе, если должность занимают несколько сотрудников. Если оклад соответствующих должности меняется, необходимо менять несколько записей (по числу сотрудников на одной должности).

Вставка (INSERT). Невозможно ввести данные об окладе, соответствующем должности, если в данный момент нет сотрудника, занимающего эту должность.

Удаление (DELETE). В случае удаления из таблицы сотрудника, занимающего уникальную должность, данные об окладе теряются.

Четвертая нормальная форма (4 NF) требует отсутствия многозначных зависимостей между атрибутами.

В примере на рис. 2.53 (слева) преподаватель читает лекции по нескольким предметам и курирует несколько групп студентов. Одна группа студентов может изучать несколько предметов, одному предмету могут обучаться несколько групп студентов. Имеется многозначная зависимость между атрибутами Предмет и Группа. При этом возможна аномалия: если у преподавателя появляется новая группа, приходится добавлять несколько записей, по числу читаемых предметов.

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

Рис. 2.53. Иллюстрация четвертой нормальной формы

Поддержка нормализации в ERwin. ERwin не содержит полного алгоритма нормализации и не может проводить нормализацию автоматически, однако его возможности облегчают создание нормализованной модели данных. Запрет на присвоение неуникальных имен атрибутов в рамках модели (при соответствующей установке опции Unique Name) облегчает соблюдение правила "один факт - в одном месте". Имена ролей атрибутов внешних ключей и унификация атрибутов также облегчают построение нормализованной модели.

Денормализация. В результате нормализации все взаимосвязи данных становятся правильно определены, исключаются аномалии при оперировании с данными, модель данных становится легче поддерживать. Однако часто нормализация данных не ведет к повышению производительности ИС в целом. Рассмотрим примеры на рис. 2.47 и 2.52. Для получения полной информации о сотруднике из ненормализованной структуры данных достаточно обратиться к одной таблице (см. рис. 2.47). После приведения структуры данных к третьей нормальной форме (рис. 2.52) информация о сотруднике содержится уже в четырех таблицах. Хотя общее количество строк в этих таблицах может быть меньше, чем в исходной (до нормализации), теперь для получения полной информации о сотруднике серверу БД необходимо обращаться одновременно к четырем таблицам (объединение таблиц, join). Время выполнения запроса с объединением может во много. раз превосходить время выполнения запроса к одной таблице, другими словами, в приведенном примере общая производительность ИС в результате нормализации скорее всего упадет. В целях повышения производительности при переходе на физический уровень приходится сознательно отходить от нормальных форм для того, чтобы использовать возможности конкретного сервера или ИС в целом.

В отличие от процесса нормализации денормализация не может быть представлена в виде четко сформулированных правил. К сожалению, в каждом конкретном случае приходится искать конкретные решения, которые используют специфику ИС и предметной области и не могут быть тиражированы.

Примером денормализации могут служить производные атрибуты, которые являются нарушением первой нормальной формы (см. 2.2.2). Другой пример денормализации приведен на рис. 2.54.

Рис. 2.54. Пример денормализации

Слева данные находятся в третьей нормальной форме, но для получения из БД информации о сотруднике, включая его оклад, приходится обращаться к таблицам Должность и Сотрудник. Если в таблицу Сотрудник добавить колонку Оклад (рис. 2.54, справа), то тогда при выборке информации о сотруднике достаточно обратиться только к таблице Сотрудник (исключается объединение). При этом нарушается третья нормальная форма и возникают аномалии, в том числе аномалии при обновлении (если оклад соответствующих должности меняется, необходимо менять несколько записей по числу сотрудников на одной должности). Для решения проблемы можно делать выборку только из таблицы Сотрудник, а обновлять значение оклада только в таблице Должность. Но при этом возникает противоречие между старым значением оклада, хранящимся в таблице Сотрудник, и новыми данными, хранящимися в таблице Должность. Чтобы избежать противоречия, можно создать утилиту (процедуру сервера), которая будет запускаться во время минимальной загрузки сервера, например ночью, и выравнивать значения колонок. Если при выборке должности всегда необходимо самое свежее значение, то такое решение неприемлемо. Если задача позволяет подождать до начала следующего дня после редактирования справочника Должность, то такое решение вполне допустимо.

Заметим, что приведенный пример следует воспринимать исключительно как иллюстрацию, а не как руководство к действию.

Еще один пример денормализации данных будет рассмотрен в подразделе 2.2.8, посвященном проектированию хранилищ данных.

Поддержка денормализации в ERwin. Денормализация, как правило, проводится на уровне физической модели. ERwin позволяет сохранить на уровне логической модели нормализованную структуру, при этом построить на уровне, физической модели структуру (возможно, денормализован-ную), которая обеспечивает лучшую производительность, используя особенности конкретной СУБД и бизнес-правил предметной области.

ERwin имеет следующую функциональность для поддержки денормализации:

Сущности, атрибуты, ключи и домены можно создавать только на уровне логической модели, включив в соответствующих редакторах опцию Logical Only (см., например, рис. 2.10 и 2.15). Такие объекты не будут отображаться на уровне физической модели и не будут создаваться при генерации БД.

Таблицы, колонки, домены и индексы можно создавать только на уровне физической модели (опция Physical Only, см. 2.3). Например, на уровне только физической модели может быть создана колонка Оклад таблицы Сотрудник, см. рис. 2.54.

При автоматическом разрешении связи многие-ко-многим (см. 2.2.3) в физической модели создается новая таблица и структура данных может быть дополнена только на уровне физической модели.

Домен можно определить как совокупность значений, из которых берутся значения атрибутов. Каждый атрибут может быть определен только на одном домене, но на каждом домене может быть определено множество атрибутов. В понятие домена входит не только тип данных, но и область значений данных. Например, можно определить домен "Возраст" как положительное целое число и определить атрибут Возраст сотрудника как принадлежащий этому домену.

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

Домены позволяют облегчить работу с данными как разработчикам на этапе проектирования, так и администраторам БД на этапе эксплуатации системы. На логическом уровне домены можно описать без конкретных физических свойств. На физическом уровне они автоматически получают специфические свойства, которые можно изменить вручную. Так, домен "Возраст" может иметь на логическом уровне тип Number, на физическом уровне колонкам домена будет присвоен тип INTEGER.

Для создания домена в логической модели служит диалог Domain Dictionary Editor, (рис. 2.55). Его можно вызвать из меню Edit/Domain Dictionary по кнопке, расположенной в верхней левой части закладки General диалога Attribute Editor (см. рис. 2.14). Для создания нового домена в диалоге Domain Dictionary Editor следует:

Рис. 2.55. Диалог Domain Dictionary Editor

    щелкнуть по кнопке

    New. Появляется диалог New Domain (рис. 2.56);

    выбрать родительский домен из списка

    Domain Parent. Новый домен можно создать на основе уже созданного пользователем домена либо на основе изначально существующего. По умолчанию ERwin имеет четыре предопределенных домена (String, Number, Blob, Datetime). Новый домен наследует все свойства родительского домена. Эти свойства в дальнейшем можно переопределить;

    набрать имя домена в поле

    Logical Name. Можно также указать имя домена на физическом уровне в поле Physical Name. Если физическое имя не указано, по умолчанию оно принимает значение логического имени;

    щелкнуть по кнопке ОК.

В диалоге Domain Dictionary Editor можно связать домен и иконкой, с которой он будет отображаться в списке доменов (Domain Icon), и иконкой, с которой атрибут, определенный на домене, будет отображаться в модели (Icon Inherited by Attribite).

Рис. 2.56. Диалог New Domain

Каждый домен может быть описан в закладке Definition, снабжен комментарием в закладке Note или свойством, определенным пользователем в закладке UDP.

Рис. 2.57. Создание нового атрибута с помощью диалога Independent Attribute Browser

ERwin имеет специальный инструмент, который значительно облегчает создание новых атрибутов в модели, используя описание доменов, -Independent Attribute Browser. Этот диалог вызывается (и скрывается) по горячему ключу CTRL+B. С его помощью можно выбрать в списке домен и по методу drag&drop перенести его в какую-либо сущность. В ней будет создан новый атрибут с именем, которое следует задать в окне Name Inherited by Attribite диалога Domain Dictionary Editor. Если значение поля не задано, по умолчанию принимается имя домена. На рис. 2.57 для домена "Возраст" значение этого поля было "Атрибут Возраст". В дальнейшем в случае необходимости имя атрибута.можно изменить.

Рис. 2.58. Диалог Domain Dictionary Editor на физическом уровне

На физическом уровне диалог Domain Dictionary Editor позволяет редактировать физические свойства домена. На рис. 2.58 показана закладка ORACLE. Имя этой закладки зависит от выбранного сервера БД. На ней можно задать конкретный тип данных, соответствующих домену, правила присвоения NULL-значений, правила валидации (правила проверки допустимых значений) и задания значения по умолчанию. Правила валидации и значения по умолчанию должны быть предварительно описаны и именованы так, как это описано в 2.3.4 (на рис. 2.58 для домена "Возраст" заданы соответственно правило валидации "Проверка_возраста" и значение по умолчанию "Возраст по умолчанию"). Для вызова диалогов редактирования правил валидации и значений по умолчанию служат кнопки “…” справа от соответствующего списка выбора (Valid и Default).

Рассмотрим функции других закладок диалога Domain Dictionary Editor:

General (рис. 2.59). Задание родительского домена (Domain Parent) и имени, присваиваемого колонке при ее создании с помощью Independent Column Browser. С помощью опции Physical Only домен можно определить только на уровне физической модели.

Comment. Внесение комментария к атрибуту.

UDP. Свойства, определяемые пользователем.

Visual Basic - PowerBuilder. Задание специальных свойств домена для кодогенерации клиентского приложения.

Рис. 2.59. Закладка General диалога Domain Dictionary Editor

Домены могут быть использованы при генерации схемы БД для создания типов, определяемых пользователем для тех СУБД, которые поддерживают такие конструкции (DB2, Rdb, Inteibase, SQL Anywhere, SQL Server и SYBASE). Типы, определяемые пользователем, представляют собой синонимы существующих в БД типов, создаваемых для удобства работы с данными.

При выборе соответствующего сервера на закладке General появляется флажок:

    Distinct Types - для DB2/CS и DB2/UDB;

    Domains - для Rdb и Inteibase;

    User Datatypes - для SQL Anywhere, SQL Server и SYBASE.

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

Связь является логическим соотношением между сущностями. Каждая связь должна именоваться глаголом или глагольной фразой. Имя связи выражает некоторое ограничение или бизнес-правило и облегчает чтение диаграммы. По умолчанию имя связи на диаграмме не показывается. На логическом уровне можно установить идентифицирующую связь "один-ко-многим", связь "многие-ко-многим" и неидентифицирующую связь "один-ко-многим". Связь - это понятие логического уровня, которому соответствует внешний ключ на физическом уровне. В ERwin связи представлены пятью основными элементами информации:

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

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

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

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

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

В IDEFIX различают зависимые и независимые сущности. Тип сущности определяется ее связью с другими сущностями. Идентифицирующая связь устанавливается между независимой (родительской) и зависимой (дочерней) сущностями. Зависимая сущность изображается прямоугольником со скругленными углами. При установлении идентифицирующей связи атрибуты первичного ключа родительской сущности автоматически переносятся в состав первичного ключа дочерней сущности. Эта операция дополнения атрибутов дочерней сущности при создании связи называется миграцией атрибутов. В дочерней сущности новые атрибуты помечаются как внешний ключ - FK.

При установлении неидентифицирующей связи дочерняя сущность остается независимой, а атрибуты первичного ключа родительской сущности входят в состав неключевых атрибутов дочерней сущности. Неидентифицирующая связь служит для связывания независимых сущностей. Для определения связей ERwin выбирается тип связи, затем мышью указывается родительская и дочерняя сущность. Идентифицирующая связь изображается сплошной линией; не идентифицирующая - пунктирной линией. Линии заканчиваются точкой со стороны дочерней сущности.

Мощность связей (Cardinality) - служит для обозначения отношения числа экземпляров родительской сущности к числу экземпляров дочерней.

Различают четыре типа сущности:

· общий случай, когда одному экземпляру родительской сущности соответствуют 0, 1 или много экземпляров дочерней сущности; не помечается каким-либо символом;

· символом Р помечается случай, когда одному экземпляру родительской сущности соответствуют 1 или много экземпляров дочерней сущности (исключено нулевое значение);

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

· цифрой помечается случай точного соответствия, когда одному экземпляру родительской сущности соответствует заранее заданное число экземпляров дочерней сущности.

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

Имя связи на логическом уровне представляет собой глагол, связывающий сущности. Физическое имя связи (которое может отличаться от логического) для ERWin означает имя ограничения или индекса. Для отображения имени связи выберите опцию в меню: Format/Relationship Display/Verb phrase.

Некоторые сущности определяют целую категорию объектов одного типа. В ERwin в таком случае создается сущность для определения категории и для каждого элемента категории, а затем вводится для них связь категоризации. Родительская сущность категории называется супертипом, а дочерние - подтипом.

Например, сущность «входящий документ» может быть как запросом, так и распоряжением. Первые и вторые имеют различные, частично пересекающиеся наборы атрибутов (минимальное пересечение подтипов составляет первичный ключ). Общая часть этих атрибутов, включая первичный ключ, помещается в сущность-супертип «входящий документ». Различная часть (например, данные о содержании, отправителе) помещается в сущности-подтипы.

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

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

Рисунок 1.4 - Пример неполного множества категорий

Рисунок 1.5 - Пример полного множества категорий

3. Сущность может быть общей сущностью в любом количестве отношений категоризации.

4. Атрибуты первичного ключа сущности-категории должны совпадать с атрибутами первичного ключа общей сущности.

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

Роли.

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

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

Представления.

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

В предыдущих главах рассматривался наиболее часто встречающийся тип связей - идентифицирующие связи - и было показано, как ER

win производит миграцию ключей через эти связи.

В этой главе Вы узнаете, как:

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

Управление внешними ключами

При создании диаграммы, хотя Вам, может быть, и хочется добавить ключевые атрибуты в сущность, когда Вы ее создаете, ER

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

Чтобы облегчить проектирование базы данных, ER

win позволяет задать режим Unique Key, который можно использовать для того, чтобы предупредить Вас о создании атрибута, который может автоматически мигрировать через связь, или запретить Вам создание таких атрибутов. Кроме того, если Вы удаляете связь, ER win автоматически удаляет соответствующие внешние ключи из дочерних сущностей. См. Гл.11, Документирование правил, разд. "Обеспечение уникальности имен сущностей и атрибутов".

Как создать внешние ключи

1. Нарисуйте связь между двумя сущностями или между сущностью и ею же самой (рекурсивная связь). Внешний ключ автоматически мигрирует. Вам не нужно ничего делать!

Чтобы видеть автоматическую миграцию внешних ключей,

нужно установить режим просмотра диаграммы Attribute Display. У Вас должны быть уже созданы атрибуты первичного ключа в родительской сущности.

Как посмотреть атрибуты внешнего ключа

1. Щелкните правой кнопкой мыши по соединительной линии связи - Вы войдете в меню Relationship.

2. Дайте команду "Relationship" для входа в редактор Relationship.

Задание режимов наследования атрибутов

win производит миграцию атрибута первичного ключа, то по умолчанию внешний ключ, который появляется в дочерней сущности, наследует имя, но не наследует определение атрибута первичного ключа. Если Вы хотите, чтобы определение атрибута первичного ключа тоже мигрировало в дочернюю сущность, Вам нужно изменить режимы наследования - Attribute Inheritance Option - которые ER win устанавливает по умолчанию. Для того, чтобы изменить режим наследования по отношению к мигрирующим ключам, дайте команду "Attribute Inheritance..." в меню Option. Вы войдете в окно-диалог Attribute Inheritance Option.

В этом диалоге можно установить три режима. По умолчанию установлен режим "No Inheritance", а Вы можете изменить его на "Full Inheritance" или "Restricted Inheritance", нажимая соответствующую кнопку, а затем - "ОК" для сохранения нового режима.

Как задать режим наследования атрибута

1. Дайте команду "Attribute Inheritance..." из меню Option.

2. Нажмите на одну из кнопок в окне "Inheritance of Primary Key Definitions" для того, чтобы задать нужный Вам режим наследования атрибута:

"Full Inheritance" - определения атрибутов первичного ключа мигрируют во внешний ключ для всех новых и уже созданных связей текущей диаграммы.

"Restricted Inheritance" - определения атрибутов первичного ключа мигрируют во внешний ключ для всех новых cвязей, но это не распространяется на уже созданные связи текущей диаграммы.

"No Inheritance" - миграция определений атрибутов запрещается для всех связей текущей диаграммы. Это тот режим, который установлен по умолчанию.

Задание неидентифицирующих связей

Идентифицирующей связью

называется связь, которая добавляет признаки идентичности в дочернюю сущность путем миграции ключей родительской сущности в область ключевых атрибутов дочерней и таким образом делая дочернюю сущность зависимой от родительской в смысле своей идентичности. Например, когда атрибут movie-numb ER мигрирует из сущности MOVIE в MOVIE-COPY на диаграмме MOVIES.ER1, токаждый экземпляр MOVIE-COPY зависит и от movie-numb ER, и от movie-copy-numb ER, которые уникальным образом его определяют (ни один из этих двух атрибутов не может сам по себе уникальным образом определить конкретную копию фильма).

Можно задать также и такую связь, которая не ставит дочернюю сущность в зависимость от родительской. Этот тип связи называется неидентифицирующей связью . В ER

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

На рисунке ниже показано, как изображаются в ER

win идентифицирующие, неидентифицирующие и необязательные неидентифицирующие связи, и обобщаются различия между этими связями.

Если связь уже создана на диаграмме, то Вы можете изменить ее тип в редакторе Relationship.

Как изменить тип связи

1. Выберите ту связь, которую Вы хотите изменить. Установите курсор на линию связи и щелкните правой кнопкой мыши для входа в pop-up меню Editor.

2. Дайте команду "Relationship" в меню Editor для входа в редактор Relationship.

3. Нажмите нужную кнопку в окне Relationship Type (Identifying - идентифицирующая, Non-Identifying - неидентифицирующая).

4. Нажмите "ОК" для того, чтобы зафиксировать изменения. ER

win изменяет линию связи на диаграмме в соответствии с новым типом.

Рекурсивной связи в

ER win автоматически присваивается тип Non-Identifiyng. Изменить его нельзя.

Разрешить или не разрешить нулевые значения?

Когда Вы рисуете неидентифицирующую связь, Вам нужно решить, могут ли атрибуты внешнего ключа, наследуемые от родителя, принимать значение NULL или нет. По умолчанию для неидентифицирующей связи задается режим "Nulls Allowed", что означает, что дочерняя сущность может существовать без родительской, и связь называется необязательной. "No Nulls" означает, что существование дочерней сущности зависит от родительской, и связь называется обязательной. В случае необязательной связи (Nulls Allowed) на родительском конце неидентифицирующей связи ER

win ставит знак - ромбик.

Одно из основных различий между идентифицирующей и неидентифицирующей связью - в том, что только те внешние ключи, которые мигрируют через неидентифицирующую связь, могут принимать значения NULL.

См. руководство по методам ER

win Methods Guide , Гл.3, "Обзор языка", разд. "Идентифицирующие и неидентифицирующие связи".

По умолчанию для неидентифицирующей связи установлен

режим "Nulls Allowed", т.е. значения NULL для внешних ключе


Загрузка...