Санкт-Петербургский государственный политехнический университет

Факультетпереподготовкиспециалистов

Математическое обеспечение и администрирование информационных систем

(812) 703-02-02

Санкт-Петербург, ул. Обручевых, д. 1

Общая информация
О специальности Паспорт специальности Новости и успехи Преподавательский состав Контакты
Поступающим
Концепция специальности Программа обучения Правила приема Учебные материалы Форма и место проведения занятий Документы об образовании Стоимость обучения Дни открытых дверей Работы слушателей
Обучающимся
Поиск слушателя Расписание занятий Списки групп и оценки Учебный план Порядок сдачи зачетов и экзаменов Дипломникам Техническая информация Академия Oracle Форум

Разработка методики XML представлений реляционных данных

Аннотация

Настоящий обзор выполнен на основе магистерской диссертации “Разработка методики XML представлений реляционных данных”.

Магистерская программа

№ 552808 "Информационное и программное обеспечение автоматизированных систем".

Направление

№ 552800 “Информатика и вычислительная техника”

В работе рассмотрена методика построения XML представлений реляционных данных на основе реляционной  схемы данных по умолчанию. Предложен XPath-подобный язык запросов поверх указанной схемы данных, сочетающий элементы XPath и SQL. Показана возможность его практического применения для автоматического генерирования простых ХML документов на основе анализа путей в графе ссылочной целостности БД. Для более сложных сценариев, имеется возможность ручной настройки запроса на основе CROSS JOIN соединений и использования связанных шаблонов. Исследованы границы применимости методики и представлены возможные варианты  ее развития.

Создана библиотека классов, реализующая рассмотренную методику, и тестовая программа, демонстрирующая ее возможности.

Программа реализована на языке программирования С# в среде Microsoft Visual Studio 2003 и тестировалась на  СУБД Microsoft SQL Server 2000.

Проблема XML представления данных

Быстрый рост рынка Интернет-технологий, и в особенности систем B2B (Business-to-Business) и B2C (Business-to-Consumer), стимулировал интерес к проблеме представления данных и обмена данными между приложениями. Язык XML (Extensible Markup Language) с конца 1990-х годов стал де-факто стандартом представления и обмена данными, как на внутрисистемном уровне, так и на уровне презентации. На основе XML разработан ряд специализированных форматов данных (SOAP, WSDL и др.) и языков обработки (XSLT, XQuery, XPath и др.) При этом значительная часть существующих источников корпоративных данных находятся под управлением реляционных СУБД. Возникает естественная задача интеграции XML с существующими СУБД. В настоящее время предложен ряд подходов, которые различаются механизмами интеграции XML и СУБД, архитектурой системы и поддерживаемыми сценариями взаимодействия.

Предлагаемый подход предполагает следующие особенности:

  • Интеграция производится на основе модели данных XML, потому что она изначально рассчитана на представление данных. XML документ содержит не только сами данные, но и их структурную организацию, в то время как реляционная БД оперирует с нормализованными данными, т.е. они разделены на максимально независимые друг от друга сущности.
  • Рассматривается сценарий публикации данных (XML Publishing). Он предполагает доступ “только для чтения”: данные можно просматривать, но нельзя модифицировать.
  • Разработан специальный язык запросов, использующий элементы синтаксиса XPath и SQL. Текущая реализация языка поддерживает линейные и линейно-рекурсивные запросы, основные типы реляционных объединений и фильтрации данных.
  • Архитектура решения представляет собой надстройку над реляционной СУБД в виде промежуточного слоя (middleware), который и отвечает за трансляцию между XML и СУБД.

Обоснование предлагаемой методики

В .NET Framework имеется механизм XML представления реляционных данных на основе ADO.NET классов DataSet и XmlDataDocument. Схема взаимодействия между указанными классами показана на следующем рисунке:

Как известно, архитектура ADO.NET предполагает работу с данными БД в отсоединенном режиме, т.е. объекты классов DataSet и XmlDataDocument размещаются в оперативной памяти. Этот механизм эффективен при работе с небольшими объемами данных, но если объем данных в выборке становится сравнимым с размером оперативной памяти, быстродействие системы резко снижается. Еще серьезнее при этом влияние сетевого трафика: чем больше объем данных, перекачиваемых между клиентским приложением и сервером БД, тем ниже быстродействие системы.

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

Модель типичной middleware-системы XML Publishing

Описание методики

Методика реализована на платформе .NET Framework и предоставляет пользователю возможность получать выборку иерархически структурированных данных из реляционной СУБД, как если бы они были представлены в виде XML документа.

Возможности методики

  • Автоматически генерируется XML схема данных по умолчанию в виде графа зависимостей таблиц (внутренняя информационная схема). Эта схема содержит описания таблиц, их полей и ограничений, включая ссылочную целостность REFERENCES (FOREIGN KEY/PRIMARY KEY). Последние интерпретируются как отношение подчиненности между таблицами, что позволяет определить виртуальную иерархическую структуру на “плоской” реляционной БД.
  • Поддерживается XPath-подобный синтаксис обращения к низлежащей реляционной БД, основанный на сопоставлении с указанной схемой. При этом структура выражения запроса моделирует иерархическую структуру результирующего XML документа.
  • Реализуется виртуальный режим XML представления: на основе XPath-подобного запроса генерируется набор инструкций SQL, которые передаются на выполнение ядру СУБД. Результат возвращается в виде заполненного набора данных DataSet. Подобный механизм исключает генерацию большого объема материализованных промежуточных XML представлений, что существенно ускоряет работу.
  • Текущая версия методики использует в качестве низлежащей СУБД Microsoft SQL Server 2000, но изначально преследовалась цель переносимости, что учитывалось при реализации: в частности, генерация внутренней схемы производится через доступ к информационной схеме БД (INFORMATION_SCHEMA).  Поддержка последней гарантируется СУБД, удовлетворяющими стандарту SQL99 и выше.

Язык запросов

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

Общий вид выражения – последовательность шагов пути:

/nodetest[predicate] ,

где / – определяет дочернюю ось (в терминологии XPath) – единственный допустимый тип оси в нашем языке;

nodetest – имя узлов, выбираемых относительно контекстного узла, т.е. ближайшего слева; соответствует названию таблицы;

predicate – необязательное логическое условие отбора элементов на данном шаге.

Ниже приведен список отличий нашего языка запросов от стандартного XPath:

  • Путь задается на виртуальном, а не реальном документе, как в оригинальном XPath.
  • Элементам вcегда соответствуют таблицы БД, а атрибутным выражениям с префиксом @ соответствуют поля таблицы справа.
  • Допустима только одна ось – дочерняя. Она имеет смысл соединения таблиц справа и слева от нее.
  • Вместо выборки узлов определяется последовательность соединений таблиц данных. Следствием этого является важнейшее смысловое различие: выражение XPath возвращает набор узлов соответствующего уровня вложенности, а наше выражение возвращает узлы всех уровней, присутствующих в нем поименно.
  • Основные отличия касаются предикатных выражений. В стадартном XPath предикатом может быть любое выражение, принимающее логическое значение либо приводимо к нему. В нашем языке предикатное выражение является гибридом стандартного предикатного выражения и условного выражения SQL. При этом за основу взят синтаксис последнего, т.к. в результате разбора и синтеза результирующей инструкции SQL SELECT предикат включается путем конъюнкции с другими в предложение WHERE. Дополнительно поддерживаются два вида шаблонов:
    • @name замещается на contexttable.name, где contexttable – псевдоним таблицы узла контекста;
    • $NN замещается на tableNN.name, где tableNN псевдоним NN-той таблицы. В этом случае префикс @ не используется.
  • Вследствие различных ограничений на имена XML элементов с одной стороны, и реляционных таблиц другой стороны, возникает дополнительная проблема согласования имен. В текущей версии программы она решена путем автоматической генерации псевдонимов (aliases) реляционных таблиц, которые используются в качестве имен XML элементов.

Приведем несколько запросов на примере тестовой БД Northwind, поставляемой вместе с Microsoft SQL Server:

Запрос Результат

/Customers

Возвращает список заказчиков из таблицы Customer.

/Customers/Orders

Возвращает список заказчиков (элементы Customers) со вложенными узлами заказов  (подэлементы Orders). Группировка неявно производится по ключевому полю CustomerID.

/Customers[@CustomerID = ‘ALFKI’]/Orders/OrderDetails

Возвращает информацию о заданном заказчике и расширенными сведениями о его заказах.

/Customers[@CustomerID like ‘AN%’]/Orders

Возвращает список пользователей, чей код соответствует указанному строковому шаблону, со вложенными заказами

/Employees[$1.@EmployeeID=$2.@ReportsTo]/Employees

Рекурсивный запрос: возвращает 2-уровневую иерархию сотрудников с отношением подчиненности ReportsTo.

/Employees/Employees/Employees

Рекурсивный запрос: возвращает 3-уровневую иерархию сотрудников. Предикат связи не используется, т.к. для таблицы Employees задан  FOREIGN KEY на себя по полю ReportsTo.

Табл.1. Примеры запросов

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

Определение  базового представления

Базовое представление низлежащей БД формируется посредством доступа к ее INFORMATION SCHEMA. Формируется граф ссылочной целостности, узлы которого соответствуют таблицам, а ребра – ограничениям целостности FOREIGN KEY/PRIMARY KEY. При трансляции XPath запроса выполняется обход соответствующего подграфа и в зависимости от его связности и направления связей принимается решение о способе реляционного соединения.

В случае отсутствия связи между парой таблиц генерируется декартово произведение (CROSS JOIN), что позволяет задавать условие соединения вручную, с помощью предикатного выражения. Это существенно расширяет круг возможных запросов, практически приближая к возможностям низлежащей СУБД.

Трансляция запроса

В текущей версии нашего языка запросов, результирующий SQL запрос состоит из единственной инструкции SELECT. Она может включать потенциально неограниченное число соединений таблиц, но в реальности очень быстро достигается предел такого роста, поскольку время исполнения запроса, грубо говоря, экспоненциально зависит от количества таблиц.

Процедура трансляции включает два этапа. На первом производится синтаксический разбор выражения XPath по шагам и замена всех шаблонов в предикатах псевдонимами таблиц. В результате генерируется аннотированное дерево разбора. На втором этапе путем обхода дерева с использованием графа виртуального представления строится SQL запрос. Программно эта логика реализована в трех классах: XPathParser и QueryBuilder, соответственно, производят разбор XPath и синтез SQL запроса, а XPathTree представляет аннотированное дерево разбора.

Постобработка результатов

Инструкция SELECT направляется на выполнение ядру СУБД с помощью стандартного механизма ADO.NET. Обработка результатов производится в классе XmlTagger на основе информационной схемы InfoSchema и дерева разбора XPathTree путем построчного сканирования таблицы.

Программная реализация

Прграмма реализована в виде двух библиотек классов (MyXmlSql.dll и MyControls.dll) и основного приложения XmlView.exe) на языке программирования С# в среде разработки Microsoft Visual Studio 2003.

Схема взаимодействия

Схема взаимодействия между классами и направления потоков данных показаны на следующем рисунке:

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

Приложение XmlView.exe

Приложение XmlView.exe демонстрирует использование рассмотренной выше инфраструктуры классов MyXmlSql и графических компонентов MyControls. Оно расчитано на работу в следующем системном окружении:

  • ОС: Windows 2000/XP/2003 и выше
  • .NET Framework version 1.1
  • СУБД: Microsoft SQL Server версии от 6.5 и выше

  XmlView.exe обеспечивает следующую функциональность:

  • отображение списка БД;
  • выбор БД и отображение ее схемы (включая иерархию таблиц на основе ограничения ссылочной целостности);
  • ввод пользовательских  XPath-подобных запросов, проверку их корректности,  генерацию соответствующей инструкции SQL и ее предварительный просмотр;
  • выполнение сгенерированной инструкции SQL и представление результата в трех форматах: XML текст, XML дерево и табличном;
  • сохранение результатов в XML файле;
  • сохранение схемы БД в формате XML Schema;
  • задание параметров, управляющих процессом трансляции запроса XPath в SQL и выводом результатов.

Внешний вид главного окна приложения и несколько основных режимов представлены на серии скриншотов:

Сводка результатов

Основными результатами настоящей работы является следующее:

  • разработана методика XML представления реляционных данных на основе анализа информационной схемы БД;
  • разработан XPath-подобный язык запросов - простой, компактный и в то же время достаточно выразительный;
  • создана библиотека классов MyXmlSql, реализующая функциональность указанной методики на платформе .NET Framework с использованием технологий ADO.NET и XML;
  • создана библиотека пользовательских элементов управления (controls) MyControls, содержащая 3 класса: InfoSchemaTreeView (дерево зависимостей таблиц БД), XmlTreeView (XML документ как иерархическое дерево), XmlRichTextBox (XML документ в виде размеченного текста);
  • создано тестовое приложение XmlView, демонстрирующее возможности указанной методики и реализующих ее классов:
    • выбор БД из списка доступных к подключению;
    • построение  графа зависимостей и XSD схемы БД;
    • ввод пользовательского запроса, проверка его синтаксической корректности, трансляция в эквивалентный SQL запрос (с возможностью просмотра последнего);
    • выполнение SQL запроса и постобработка результатов (конвертация в формат XML);
    • отображение XML результатов в виде иерархического дерева, форматированного текста с цветовой разметкой и, для сравнения, отображение результата SQL запроса в виде “плоской” таблицы;
  • данная версия библиотеки MyXmlSql и программы XmlView расчитаны на совместную работу с СУБД Microsoft SQL Server 2000 и выше, но основных алгоритмы реализованы таким образом, чтобы обеспечить переносимость на другие СУБД.

Программа реализована на языке программирования С# в среде Microsoft Visual Studio 2003 и тестировалась на  СУБД Microsoft SQL Server 2000.

Заключение

Предложенная методика XML представления реляционных данных  является синтетической, промежуточной между существующими системами XML-to-SQL Translation и реляционными СУБД с поддержкой XML. Ее основным преимуществом является простота и удобство языка запросов, сочетающего выразительность таких разных языков, как XPath и SQL. На данный момент структура выходных XML результатов ограничена только простыми иерархиями элементов и линейно-рекурсивные схемами фиксированной глубины.

Развитие методики должно обеспечить возможность генерирования нелинейной иерархии, чтобы по своим выразительным способностям XmlView не уступал продуктам, базирующимся на “тяжелых” языках, таких как XSLT и XQuery. Конкретно возможны следующие направления развития:

  • позволит генерировать сложные запросы с использованием подзапросов.
  • Поддержка внешних входных схем данных, таких как аннотированные схемы, позволит генерировать выходные документы произвольной структуры, соответствующей указанной схеме.

Также возможно использование существующих XML процессоров с открытым кодом (Saxon, Xalan и др.) в качестве ядра модуля трансляции запросов, что приблизит XmlView по возможностям к существующим XML-to-SQL системам, но потребует существенного пересмотра архитектуры системы.

Об авторе

Швалев Евгений Сергеевич

Швалев Евгений Сергеевич

Контакты:

  • Рабочий тел.: (812) 303 92 94
  • Мобильный тел.: +7 921 594 83 56
  • E-mail: ess@mail.ru