
Ю. А. Григорьев, Г. И. Ревунков - Банки данных
.pdf12. Логическое проектирование систем распределенной обработки данных
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 |
|
|
5з |
|
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