Обработка запросов к объектному представлению реляционной базы данных (окончание)
Пример трансляции запроса. Для иллюстрации процедуры трансляции запроса рассматривается фрагмент структуры РБД отдела кадров некоторой организации и соответствующий ему фрагмент объектного представления (рис. 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. Т.к. при трансляции запроса выполняется его дополнительная обработка, то общее время, затрачиваемое на получение ответа от СУБД и его интерпретацию клиентским приложением, возрастает, однако, учитывая высокую производительность современного аппаратного обеспечения и отсутствие ресурсоемких операций в процессе трансляции запроса, получаемое преимущество в виде существенного сокращения времени на составление запроса является оправданным.
* * *
Стальные изделия нынче очень дорогие, но если они все-таки сильно нужны, то альтернативой будет труба стальная бу, которая будет более выгодной по цене в сравнении с новыми аналогами.