Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ю. А. Григорьев, Г. И. Ревунков - Банки данных

.pdf
Скачиваний:
335
Добавлен:
10.02.2015
Размер:
7.54 Mб
Скачать

12. Логическое проектирование систем распределенной обработки данных

File

Edit Option

 

 

 

 

 

CASE*Dictionary

Column Definition

 

Page 1 of 1

 

 

 

 

 

 

28-OCT-96

 

 

Appl. SECURITES Version 1 ns Table ? YES

 

STEVE

 

 

 

 

 

 

AQ

 

 

lable Name SEC_COU

 

TABLE

 

 

Seq

Column Name

Domain Datatype

Avg

Max Dp N% ^ %

и

С

 

 

Name

 

 

 

 

2

COU DATE

DATE

 

 

 

Y

4

COU CODE ISSUE

CHAR

5

10

 

Y

6

COU CODE ORG

CHAR

10

20

 

Y

^ COU QUOTATION

FLOAT

 

 

 

Y

 

 

 

 

 

 

The name of a column within the table. If preceded by * then it is indexed

 

 

Count: *10

 

 

<Replace>

 

 

Рис. 12.16. Описания столбцов таблицы

рис. 12.15 (на нем будут показаны таблицы БД «БДЗ. Ценные бумаги»). После этого можно вернуться в меню Data Design Utilities.

2.После описания таблиц можно определить для них столбцы. Для создания примерного набора столбцов (их можно позднее при необходимо­ сти модифицировать), CASE*Dictionary использует информацию об атрибу­ тах и сущностях, т.е. системную информацию в хранилище. Чтобы автома­ тически создать столбцы таблицы, выберите пункт меню Design/Data Design Utilities/Default Database Design. Ответьте на запрос о выбираемом действии (выберите R, что означает замену), введите имя системы (SECURITES), ее версию (1) и имена таблиц (4-я колонка на рис. 12.15). После этого CASE*Dictionary создает для заданных таблиц столбцы. Чтобы посмотреть новые столбцы таблиц, выберите пункт Design/Database Design/Table Columns/Column Definition. CASE*Dictionary выводит окно Column Defini­ tion. Это окно должно быть пустым. Введите имя таблицы, например SEC COU (курс продажи), и нажмите клавишу [Next Field]. После этого CASE*Dictionary заполняет столбцы информацией о вновь сгенерированных столбцах таблицы. Так как эти определения столбцов являются не реальными, а оп­ ределениями CASE*Dictionary, то можно отредактировать имена столбцов, типы данных, заданные по умолчанию значения и т.д. (рис. 12.16).

3.Средство CASE*Dictionary автоматически конфигурирует различ­ ные ключи таблиц вашей системы, но иногда оно не может идентифициро-

220

12.1. Разработка логической схемы базы данных

вать на основе заданной информации все необходимые ключи. В таких слу­ чаях используется окно, появляющееся после выбора пункта меню Design/Database Design/Table Columns/Table Key Constraints Definition. На­ пример, введите в поле Table Name имя таблицы SECCOU (курс продажи), клавишей [Next Block] переместите курсор в блок полей Unique Key и кла­ вишами [List] и [Next Block] добавьте составной первичный ключ, вклю­ чающий в себя столбцы COUDATE (дата торгов), COUCODEISSUE (код эмиссии ЦБ), COUCODEORG (код организации). Это же окно использу­ ется и для просмотра первичных ключей (PRIMARY KEY), внешних клю­ чей (FOREIGN KEY), альтернативных ключей и признаков их уникальности (UNIQUE).

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

Внешний ключ — это ключ родительской сущности. Например, столбцы COU_CODEJSSUE (код эмиссии ЦБ), COU_CODE_ORG (код ор­ ганизации) являются внешними ключами таблицы SECCOU (курс продажи).

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

4. CASE*Dictionary позволяет при включении записей в БД автомати­ чески генерировать значения первичных ключей (обычно для числовых значений ключей). Для этого сначала с помощью пункта меню Design/Database Design/Sequence Definition необходимо определить правило формирования последовательности ключей, а затем с помощью окна описа­ ния столбцов таблицы (см. рис. 12.16) в колонке Sequence назначить пер­ вичному ключу идентификатор этого правила (чтобы посмотреть на рис. 12.16 эту колонку необходимо выполнить горизонтальный скроллинг колонок окна).

Генерация описания логической схемы в нотации конкретной СУБД с помощью пакета Erwin. Продолжим рассмотрение примера, при­ веденного в гл. 11.

1. Прежде всего необходимо определить СУБД, для которой будет выполняться генерация ЛС. Выберите пункт меню Server/Target Server. В появившемся окне укажите, например, на Oracle, выберите версию 7 и щелкните мышкой на ОК.

2. Нажмите правую клавишу мыши и выберите пункт ORACLE Database Schema. На экране появляется окно ORACLE DATABASE SCHEMA.

Выберите в открываюш;емся списке Entity, например, сущность «Курс продажи» и в поле ввода Table введите имя соответствующей таблицы, на-

221

12. Логическое проектирование систем распределенной обработки данных

пример, SECCOU. Выберите в блоке Column Name какой-либо атрибут КС (например, «Дата торгов») и в поле ввода Column введите имя столбца таб­ лицы (например, COUDATE).

Затем в списке ORACLE Datatype выберите тип поля DATE. С помо­ щью кнопки Validation можно определить список допустимых интервалов значений поля столбца и из открывающегося списка Valid выбрать требуе­ мый интервал. Также с помощью кнопки Default и открывающегося списка Default можно установить значение поля по умолчанию.

Выполните указанные действия для всех сущностей и атрибутов КС и нажмите кнопку ОК. Чтобы посмотреть ЛС БД в графическом виде, нажми­ те 8-ю слева кнопку под строкой основного меню. При повторном нажатии этой кнопки на экране вновь появляется ER-диаграмма.

3. Чтобы сгенерировать ЛС, выберите пункт меню Server/ORACLE Schema Generation. На экране появляется окно ORACLE Schema Generation Report. Вы можете подключиться к Oracle и сгенерировать ЛС (кнопка Generate), вывести программу PL/SQL описания ЛС в файл (кнопка Report) или посмотреть ЛС (кнопка Preview).

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

12.2. Разработка приложений

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

1. Приложения, выполняемые под управлением сервера СУБД (хра­ нимые процедуры, триггеры). Как правило, они разрабатываются инстру­ ментальными средствами самих СУБД.

2.Приложения, выполняемые на рабочих станциях (станцияхклиентах) и связывающиеся с серверами СУБД по мере необходимости. Существует очень много продуктов, позволяющих разрабатывать приложе­ ния подобного типа. Такие средства предлагают как фирмы-разработчики СУБД, так и независимые компании. Как правило, это инструментальные средства, поддерживающие визуальные языки программирования (4GL).

3.Прикладные программы для серверов приложений (мониторов транзакций). Серверы приложений часто используются как маршрутизаторы запросов к ПП, а также для повышения производительности системы. По­ этому ПП здесь разрабатывают, как правило, на языках низкого уровня (С, C++, COBOL).

Первые две группы приложений рассматриваются ниже, а серверы приложений — в гл. 13.

222

12.2. Разработка прилоэюений

Когда следует использовать хранимые процедуры и триггеры.

Все приведенные здесь примеры даны на псевдокоде, близком к языку СУБД Oracle (синтаксис для других СУБД мало чем отличается).

Хранимые (присоединенные, разделяемые и т.д.) процедуры. Исполь­ зование хранимых процедур БД преследует четыре цели:

1) обеспечивается новый независимый уровень централизованного контроля доступа к данным, осуществляемый АБД;

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

3)использование хранимых процедур БД позволяет значительно сни­ зить трафик сети. Прикладная программа, вызывающая процедуру, передает серверу лишь ее имя и параметры;

4)хранимые процедуры в сочетании с триггерами (правилами), о ко­ торых речь пойдет ниже, предоставляет администратору мощные средства поддержки целостности данных.

Различают хранимые процедуры, функции и пакеты. Функция, в от­ личие от процедуры, возвращает в вызывающую программу одно значение,

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

Процедура

CREATE PROCEDURE имя (параметры) IS переменные процедуры;

BEGIN

тело процедуры, включающее операторы языка SQL, условий (IF), циклов (LOOP, FOR и т.д.) и присваивания;

END;

Функция

CREATE FUNCTION имя (параметры) RETURN тип возвращаемого значения IS

переменные функции; BEGIN

тело функции, включающее операторы языка SQL, условий (IF), циклов (LOOP, FOR и т.д.) и присваивания; RETURN возвращаемое значение;

END;

223

12. Логическое проектирование систем распределенной обработки данных

Пример. Предположим, что перед выполнением операции банкомат запра­ шивает хранимую функцию для проверки номера счета и наличия требуемой суммы на счете. Спецификации этой функции имеют вид

CREATE FUNCTION проверка(номер IN NUMBER, сумма IN NUMBER) RETURN NUMBER IS

numrows INTEGER;

i INTEGER;

 

BEGIN

 

SELECT

COUNT(*) INTO numrows

FROM

счет

WHERE

номер счета = номер AND

 

сумма счета >= сумма;

IF(numrows > 0) THEN

/* разрешить операцию */ i:=l;

ELSE

/* запретить операцию */ i:=0;

END IF; RENURN i;

END;

Здесь с помощью оператора SELECT определяется число таких записей в таблице «счет», у которых номер счета (столбец «номер счета») в записи совпадает с запрашиваемым номером (параметр «номер») и сумма на счете (столбец «сумма счета») была бы не меньше запрашиваемой суммы (параметр «сумма»). Если число таких строк (numrows) больше нуля, то операция выдачи денег разрешается, в про­ тивном случае запрещается.

Эта процедура запрашивается из ПП, обслуживающей банкомат. Ниже при­ ведены спецификации запроса:

1) для языка PL/SQL:

j:= проверка(номер, сумма);

2) для языка Рго*С (Tuxedo):

EXEC SQL EXECUTE BEGIN

j = проверка(:номер, :сумма); END;

END-EXEC;

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

224

12.2. Разработка приложений

Триггеры (правила). Триггер — это процедура, автоматически запус­ каемая ядром СУБД при выполнении определенных условий изменения таблицы, задаваемых при описании триггера. Задача триггера — это реали­ зация некоторых внешних правил.

Ниже приведена структура триггера.

CREATE TRIGGER имя

 

 

 

 

 

INSERT

 

 

 

 

 

UPDATE

 

 

 

 

(AFTER 1

INSERT OR UPDATE

> OF

список

ON

имя

INSERT OR DELETE

[BEFOREJ

столбцов

UPDATE OR DELETE

 

таблицы

 

таблицы

INSERT OR UPDATE

OR DELETE

[FOR EACH ROW]

[WHEN (дополнительное условие срабатывания триггера)] [DECLARE

переменные триггера;] BEGIN

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

END;

Здесь фигурными скобками обозначены альтернативные значения ключевых слов, а квадратными скобками — необязательные параметры. В табл. 12.1 подробно представлены параметры описания триггера.

Таблица

12.1. Параметры описания триггера

Параметр

Примечание

Имя

Имя триггера

AFTER, BEFORE

Триггер срабатывает после (AFTER) или перед

 

(BEFORE) выполнением операции, указанной в

INSERT, UPDATE,

качестве следующего параметра

Триггер обрабатывает до (BEFORE) или после

DELETE, INSERT OR

(AFTER) выполнения одной из перечисленных

UPDATE, INSERT OR

операций над таблицей: включения (INSERT),

DELETE, UPDATE OR

обновления (UPDATE), удаления (DELETE) или

DELETE, INSERT OR

их комбинаций

UPDATE OR DELETE

 

225

12. Логическое проектирование систем распределенной обработки данных

 

 

Окончание табл. 12.1

Параметр

Примечание

ГСписок столбцов таблицы

Определяет необязательный список столбцов, при

 

изменении которых будет вызываться триггер.

 

Отметим, что в триггере можно обращаться как к

 

новому значению столбца записи (:пе\у.имя

 

столбца), так и к его старому значению (:о1с1.имя

 

столбца)

 

Имя таблицы

Имя таблицы БД, с которой связан триггер

FOR EACH ROW

Определяет необязательный параметр, указываю­

 

щий на то, что триггер будет срабатывать для

 

каждой записи таблицы, над которой выполняется

 

соответствующая операция (см. выше). Если этот

 

параметр не указан, то триггер срабатывает при

 

выполнении собственно

оператора (INSERT,

 

UPDATE, DELETE), а не по каждой записи

WHEN

Задает дополнительное

булевское (логическое)

 

условие, при выполнении которого срабатывает

 

триггер

1

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

CREATE TRIGGER оповещение

AFTER UPDATE OF кол.купюр ON банкомат FOR EACH ROW

WHEN (:пе\¥.кол.купюр < 100) BEGIN

сообщение(...); END;

В данном случае хранимая процедура «сообщение» посылает оператору бан­ комата письмо (например, по электронной почте) о необходимости обслужить уст­ ройство.

Также как и хранимые процедуры, триггеры могут быть включены в СУБД при создании БД и ее таблиц. Следует помнить, что некоторые CASE-средства (например, Erwin) автоматически генерируют некоторые триггеры для поддержки ограничений целостности базы данных (см. ниже пример для Erwin).

Современные инструментальные средства разработки приложе­ ний. В настоящее время разработано много средств (более 50) для создания

226

12.2. Разработка прилоэюений

клиентских приложений в архитектуре клиент/сервер (К/С), являющейся основной для распределенных систем: Delphi, Uniface Six 6.1, SQL Win­ dows, Gupta, Informix-4GL, Informix NewEra, JAM 7 (JYACC), MS Access Up-sizing Tools, Designer/2000, Developer/2000, Power Builder Desktop, Sy­ base APT Workbench и др.

Основные операторы манипулирования данными языка SQL.

Язык SQL является основным языком описания и манипулирования данны­ ми в распределенных системах. Для обращения к данным используют четы­ ре оператора: SELECT (найти), INSERT (вставить), UPDATE (обновить), DELETE (удалить). Кратко рассмотрим эти операторы.

Оператор SELECT (найти записи в таблицах БД). Оператор SELECT используется в приложениях очень часто. Упрощенное описание этого опе­ ратора имеет вид

SELECT списокстолбцовтаблиц FROM список_таблиц

[WHERE условиепоиска] [ORDER BY список_столбцов]

[GROUP BY список_столбцов fLWING подусловие];

Пример. Пусть созданы две таблицы «Юхиент» и «Счет».

Клиент (Код клиента, Адрес клиента)

Счет (Код клиента, Номер счета, Тип счета, Остаток)

Предположим, что необходимо реализовать следующий абстрактный запрос: найти адреса клиентов при условии, что код клиента меньше 1000, тип счета равен 1 и остаток на счете меньше 100; упорядочить результаты по адресам. Спещтфикации соответствующего оператора SELECT выглядят следующим образом:

SELECT Адрес клиента

 

FROM

Клиент

 

WHERE

Код клиента < 1000

 

AND

 

 

Код клиента IN

 

 

(SELECT

Код клиента

 

FROM

Счет

 

WHERE

Тип счета = 1 AND Остаток < 100)

ORDER BY Адрес клиента;

Это пример сложного запроса, так как здесь имеется вложенный подзапрос SELECT. В данном примере операнд IN указывает на то, что будет выполняться операция соединения таблиц «Клиент» и «Счет» по столбцу «Код клиента».

Запрос будет выполняться ядром СУБД в такой последовательности.

1. В таблице «Клиент» выделяются строки с «Код клиента» < 1000, затем вы­ полняется вложенный подзапрос SELECT к таблице «Счет».

227

12.Логическое проектирование систем распределенной обработки данных

2.Строится декартово произведение полученных промежуточных таблиц.

3.В соответствии с оператором IN из декартова произведения извлекаются строки с одинаковыми значениями столбцов «Код клиента» (выполняется операция соединения таблиц)

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

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

Оператор INSERT (вставить запись(и) в таблицу БД). Рассмотрим два варианта кодирования оператора INSERT:

1)INSERT INTO имятаблицы (имястолбцаь ...,имя_столбцан) VALUES (значение!,..., значениен);

2)INSERT INTO имятаблицЫ] (список_столбцов_таблицы1) SELECT список_столбцов_таблицы2

FROM имятаблицы2 WHERE условиепоиска;

Второй вариант оператора INSERT обычно используют для заполне­ ния временных таблиц. Ясно, что таблица] должна быть заранее создана с помощью оператора CREATE TABLE.

Оператор UPDATE (изменение полей (столбцов) существующих за­ писей таблицы):

UPDATE имятаблицы SET имя_поля=значение,..., имя_поля=значение

[WHERE условие поиска];

Оператор UPDATE обновляет все записи таблицы, удовлетворяющие условию поиска.

Оператор DELETE (удаление записей таблицы):

DELETE FROM имятаблицы [WHERE условие поиска];

Оператор DELETE удаляет из таблицы все записи, удовлетворяющие условию поиска.

Оптимизация запросов к распределенной базе данных. Для слож­ ных запросов к БД, содержащих предложения SELECT (операторы SELECT и INSERT, вложенные запросы в операнде WHERE операторов UPDATE и DELETE), сервер СУБД выполняет оптимизацию, т.е. строит оптимальный план реализации этого запроса. При этом СУБД выполняет следующие дей­ ствия:

228

 

12.2. Разработка

прилоэюений

 

Sx

\1/

От рабочей станции

 

SELECT

 

 

 

адресклиента

 

 

 

FROM

клиент

 

 

 

WHERE

код клиента < 1000 AND

 

 

 

кодклиента IN

 

 

 

 

(SELECT кодклиента

 

 

 

FROM счет

 

 

 

 

WHERE остаток < 100 AND тип_счета=1)

 

ORDER BY

адресклиента

 

 

^2

 

 

 

SELECT

адресклиента,

SELECT

код клиента

 

код_клиента

 

FROM

счет

FROM

клиент

 

WHERE

остаток < 100 AND

WHERE

код клиента<1000

 

тип счета = 1

Таблица Rl(aдpec_клиeнтa,

Таблица R2(кoд_клиeнтa)

кодклиента)

 

 

 

S^ (соединение)

 

 

SELECT

адресклиента

 

FROM

Rb R2

 

WHERE

Ri .кодклиента = R2.кoд_клиeнтa

ORDER BY

адресклиента

 

Таблица R2 (адрес_клиента)

^ На рабочую станцию

Рис. 12.17. Оптимальный план выполнения запроса

декомпозирует предложение SELECT на несколько подзапросов, каждый из которых связан с одной таблицей БД;

реализует параллельное выполнение этих подзапросов;

выполняет соединение результатов обработки подзапросов. Рассмотрим пример запроса SELECT (см. выше). Когда этот запрос

поступает на обработку, то сервер СУБД строит для этого запроса опти­ мальный план выполнения (рис. 12.17).

229