
- •Работа №6 Автоматизированное проектирование баз данных на основе метода er-диаграмм.
- •1. Общие сведения об AllFusion Erwin Data Modeler 4.1.
- •1.1. Структура процесса моделирования в Erwin.
- •1.2. Создание логической модели бд.
- •1.2.1. Сущности и атрибуты
- •1.2.2. Связи
- •1.3. Создание физической модели и генерация схемы бд.
- •1.4. Уровни отображения er-диаграммы.
- •1.5. Прямое и реверсное проектирование.
- •2. Примеры разработки модели бд с помощью eRwin
- •2.1. Прямое проектирование
- •2.1.1. Постановка задачи
- •2.1.2. Создание логической модели бд
- •2.1.3. Создание физической модели бд и генерация схемы бд
- •2.2. Реверсное проектирование.
- •Упражнение №1
- •Контрольное задание.
- •Требования к отчету:
- •Контрольные вопросы:
1.3. Создание физической модели и генерация схемы бд.
Для создания физической модели данных, разработчику необходимо выбрать конкретную СУБД и переключиться на физический уровень отображения модели.
На уровне физической модели, которую ERwin генерирует автоматически, если при создании модели был выбран тип Logical|Physical, а не Logical, сущности соответствует таблица в реальной СУБД, атрибуту сущности − столбец таблицы, связи − внешний ключ (если для связи задавалось имя роли, то оно соответствует имени колонки внешнего ключа в дочерней таблице), первичным и вторичным ключам − уникальные индексы, а инверсным входам − неуникальные. ERwin автоматически присваивает имена элементов логической модели элементам физической модели, исходя из приведенных выше соотношений. Таким образом, разработчику нет необходимости проделывать это вручную, однако только в том случае, если идентификаторы объектов модели были введены изначально с использованием латинского алфавита. Если же модель разрабатывалась с использованием национального алфавита, то по крайней мере идентификаторы имен таблиц, столбцов и индексов придется ввести на латинице.
Д
ля
каждого столбца разработчик должен
указать тип данных, возможность пустых
значений, значения по умолчанию и т.п.
в зависимости от используемой
СУБД. Например,
логической модели, представленной на
рис.
1,
будет соответствовать
физическая модель, ппредставленная на
рис. 8.
Рис. 8. Пример физической модели.
При переходе на уровень физической модели необходимо выполнить развязку связей "многие-ко-многим" путем создания ассоциативной сущности (association entity), как показано, например, на рис. 4. Эта процедура выполняется автоматически, если в свойствах разрабатываемой модели (вкладка General меню Model/Model Properties) установить флажок напротив опции Many-to-Many Relationship with Association Table, или воспользоваться мастером Many-to-Many Relationship Transform Wizard, который запускается нажатием кнопки на панели инструментов Transforms. Трансформацию связи "многие-ко-многим" на уровне логической модели можно выполнить с помощью команды <Show Association Entity> из всплывающего меню, которое появляется если щелкнуть правой кнопкой мыши по линии соответсвующей связи.
Последним шагом на этапе создания физической модели данных является написание триггеров и хранимых процедур. Этот шаг является необязательным, т.к. в ERwin существуют библиотеки готовых шаблонов триггеров и хранимых процедур, но при желании разработчик может вносить в них свои изменения, используя имеющийся в Erwin собственный макроязык для подготовки прототипов триггеров и хранимых процедур.
Схема базы даных генерируется на основе физической модели. Подготовленный вариант схемы можно предварительно просмотреть и сохранить в виде SQL-скрипта (Script File − файла с расширением sql, ers или ddl). Например, для физической модели, изображенной на рис.8, под SQL Server 2000 будет сгенерирована следующая схема:
CREATE TABLE Department (
DepartmentID char(18) NOT NULL,
DepartmentName char(18) NULL
)
go
ALTER TABLE Department
ADD PRIMARY KEY (DepartmentID ASC)
go
CREATE TABLE Employee (
EmployeeID int NOT NULL,
DepartmentID char(18) NULL,
EmployeePosition char(18) NULL,
EmployeeMidleName char(18) NOT NULL,
EmployeeBirthDate char(18) NULL,
EmployeeLastName char(18) NULL,
EmployeFirstName char(18) NOT NULL
)
go
CREATE UNIQUE INDEX XAK1Employee ON Employee
(
EmployeFirstName ASC,
EmployeeLastName ASC,
EmployeeMidleName ASC,
EmployeeBirthDate ASC
)
go
CREATE INDEX XIE1Employee ON Employee
(
EmployeeLastName ASC,
EmployeePosition ASC
)
go
ALTER TABLE Employee
ADD PRIMARY KEY (EmployeeID ASC)
go
ALTER TABLE Employee
ADD FOREIGN KEY (DepartmentID)
REFERENCES Department (DepartmentID)
go
create trigger tD_Department on Department for DELETE as
/* ERwin Builtin Tue May 06 21:25:02 2008 */
/* DELETE trigger on Department */
begin
declare @errno int,
@errmsg varchar(255)
/* ERwin Builtin Tue May 06 21:25:02 2008 */
/* Department Consist of Employee ON PARENT DELETE RESTRICT */
/* ERWIN_RELATION:PARENT_OWNER="", PARENT_TABLE="Department"
CHILD_OWNER="", CHILD_TABLE="Employee"
P2C_VERB_PHRASE="Consist of", C2P_VERB_PHRASE="Work in",
FK_CONSTRAINT="Consist_of", FK_COLUMNS="DepartmentID" */
if exists (
select * from deleted,Employee
where
/* %JoinFKPK(Employee,deleted," = "," and") */
Employee.DepartmentID = deleted.DepartmentID
)
begin
select @errno = 30001,
@errmsg = 'Cannot DELETE Department because Employee exists.'
goto error
end
/* ERwin Builtin Tue May 06 21:25:02 2008 */
return
error:
raiserror @errno @errmsg
rollback transaction
end
go
create trigger tI_Employee on Employee for INSERT as
/* ERwin Builtin Tue May 06 21:25:02 2008 */
/* INSERT trigger on Employee */
begin
declare @numrows int,
@nullcnt int,
@validcnt int,
@errno int,
@errmsg varchar(255)
select @numrows = @@rowcount
/* ERwin Builtin Tue May 06 21:25:02 2008 */
/* Department Consist of Employee ON CHILD INSERT SET NULL */
/* ERWIN_RELATION:PARENT_OWNER="", PARENT_TABLE="Department"
CHILD_OWNER="", CHILD_TABLE="Employee"
P2C_VERB_PHRASE="Consist of", C2P_VERB_PHRASE="Work in",
FK_CONSTRAINT="Consist_of", FK_COLUMNS="DepartmentID" */
if
/* %ChildFK(" or",update) */
update(DepartmentID)
begin
update Employee
set
/* %SetFK(Employee,NULL) */
Employee.DepartmentID = NULL
from Employee,inserted
where
/* %JoinPKPK(Employee,inserted," = "," and") */
Employee.EmployeeID = inserted.EmployeeID and
not exists (
select * from Department
where
/* %JoinFKPK(inserted,Department," = "," and") */
inserted.DepartmentID = Department.DepartmentID
)
end
/* ERwin Builtin Tue May 06 21:25:02 2008 */
return
error:
raiserror @errno @errmsg
rollback transaction
end
go
В соответствии с данным SQL-скриптом в схему базы данных будут включены: две таблицы, уникальный индекс для вторичного ключа, обычный индекс для инверсного входа и два триггера ссылочной целостности (RI-триггеры) для удаления из родительской таблицы и вставки в дочернюю таблицу.