Обработка запросов к объектному представлению реляционной базы данных (окончание)

Пример трансляции запроса. Для иллюстрации процедуры трансляции запроса рассматривается фрагмент структуры РБД отдела кадров некоторой организации и соответствующий ему фрагмент объектного представления (рис. 4).

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

SELECT Личность.фамилия, Личность.имя, Личность.Паспорт.серияномер WHERE Личность.Работа.датавступления BETWEEN 2001-01-01 AND 2002-01-01 AND Личность.Работа.оклад > (SELECT avg(Личность.Работа.оклад)) ORDER BY Личность. фамилия, Личность.имя.

Преобразование данного запроса в SQL-запрос выполняется в следующей последовательности.

1. Исходный запрос является запросом типа SELECT и включает подзапросы, поэтому выполняется выделение наиболее глубоко вложенного подзапроса: SELECT avg(Личность.Работа.оклад).

2. Т.к. выделенный подзапрос не содержит вложенных подзапросов, то выполняется его трансляция как самостоятельного запроса:

2.1. Выделяется атрибут Личность.Работа.оклад и для него из ОСД извлекается информация о соответствующей ему таблице и поле в таблице, выполняется замена этого атрибута на полную ссылку на поле в таблице: Работа.оклад.

2.2. Выделенный атрибут разбивается по парам объектов: объект Личность, объект Работа.

2.3. Из ОСД извлекается информация о связи между соответствующими объектам таблицами Личность и Работа: Личность.идент=Работа.идент. Данная связь вносится в список условий WHERE результирующего SQL-запроса.

2.4. Для каждого найденного объекта из ОСД извлекается название соответствующей ему таблицы, которое заносятся в список таблиц раздела FROM результирующего SQL-запроса: Личность, Работа.

2.5. Конструируется результирующий SQL-запрос: SELECT avg(Работа.оклад) FROM Личность, Работа WHERE Личность.идент=Работа.идент.

2.6. Выполняется замена выделенного подзапроса на результирующий SQL-запрос и при дальнейшем анализе запроса данный подзапрос не рассматривается.

3. Т.к. модифицированный запрос не содержит подзапросов типа SELECT (с учетом выполнения п. 2.6), то выполняется его трансляция как самостоятельного запроса:

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

3.2. Из атрибутов выделяются пары объектов: Личность и Паспорт, Личность и Работа.

3.3. Из ОСД извлекается информация о связи между соответствующими объектам таблицами Личность и Паспорт, Личность и Работа: Личность. идент=Паспорт.идент, Личность.идент=Работа.идент. Полученные связи добавляются к списку условий WHERE результирующего SQL-запроса с логической связкой “И”.

3.4. Таблицы, соответствующая каждому из выделенных объектов, заносятся в список таблиц раздела FROM результирующего SQL-запроса: Личность, Паспорт, Работа.

4. Конструируется результирующий SQL-запрос.

Результатом трансляции объектного запроса является следующий SQL-запрос: SELECT Личность.фамилия, Личность.имя, Паспорт.серияномер FROM Личность, Паспорт, Работа WHERE ((Работа.датавступления BETWEEN 2001-01-01 AND 2002-01-01 AND Работа.оклад > (SELECT avg(Работа.оклад) FROM Личность, Работа WHERE Личность.идент=Работа.идент)) AND Лич-ность.идент=Паспорт.идент) AND Личность.идент=-Работа.идент ORDER BY Личность.фамилия, Личность.имя

Фрагмент структуры реляционной базы данных

Рисунок 4. Фрагмент структуры реляционной базы данных (а) и соответствующего ему объектного представления (б).

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

1. Все таблицы в запросе принадлежат одному из объединенных ОСД. В данном случае запрос просто передается соответствующему ОСД и принимается от него ответ.

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

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

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

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

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

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

* * *

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

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.