СТАТЬЯ |
14.01.03
|
© Александр Барышев (Alexandr.Baryshev@sybase.ru),
Sybase CIS (www.sybase.ru)
© Статья была опубликована в "КомпьютерПресс" (http://www.compress.ru)
6'2001
Обсуждение XML в компьютерных изданиях в бумажном и в электронном виде сделало этот язык и его применение широко известным публике, так что доказывать его достоинства не имеет смысла. В то же время хотелось бы отметить, что XML не является панацеей для решения всех проблем электронного обмена документами между приложениями, но вкупе со многими уже существующими технологиями позволяет сделать такой обмен более простым и надежным.
Именно поэтому крупнейшие поставщики СУБД добавили в свои SQL-серверы наборы компонентов, утилит и интерфейсов для работы с XML-документами, то есть создали своего рода программную инфраструктуру, которая позволяет объединить реляционную модель баз данных с иерархической моделью XML, упростить способ передачи информации в Интернет и хранение готовых XML-документов.
А теперь рассмотрим, как реализована поддержка XML во флагманской СУБД Sybase — Adaptive Server Enterprise (ASE).
Поддержка XML введена в ASE начиная с версии 12.0. Она включает в себя хранение и обработку XML-документов не только со стороны клиента, но и на сервере. Встроенная в сервер виртуальная Java-машина с помощью методов специального Java-класса Jxml позволяет выполнять анализ XML-документа и совершать над ним базовые операции.
В новую версию ASE 12.5, начало коммерческой реализации которой намечается в середине июня, добавлена возможность хранить синтаксически разобранные документы в полях таблицы типа image. Введен процессор языка XQL (XML query language) для обработки XML.
Ниже мы расскажем обо всех возможностях обеих версий для работы с XML.
АSE хранит XML-документы в полях типа char или varchar (если размер документа небольшой), в полях типа Java-класс, в полях Image или Text. Существуют три подхода для размещения XML-документов:
В этом случае данные хранятся в традиционном реляционном представлении в таблицах ASE. При запросе к базе происходит выборка данных из всех таблиц и формирование XML-документа. При записи в базу происходит обратная операция — разбор XML и распределение данных по таблицам. Этот подход рекомендуется применять в случаях, когда происходит интенсивное изменение информации (например, в системах «банк—клиент»).
Достоинством использования указанного подхода является поддержка ссылочной целостности на уровне базы данных и использования языка Transact-SQL для формирования и разбора XML-документа (применение функций SUBSTR, CONVERT и т.д.), а недостатком — необходимость проведения синтаксического анализа XML-документа каждый раз при его сборке/разборке.
Документ целиком хранится в таблице, содержащей одну колонку типа image или text. Такой способ хранения документов подходит для тех случаев, когда их содержание статично, а любое обновление сводится к перезаписи в базе данных. Типичные примеры указанных документов — статьи, каталоги, прайс-листы и т.п., то есть документы в самом обычном значении этого слова, которые и хранятся в базе данных, и извлекаются по запросу целиком.
Для хранения синтаксически разобранных (проанализированных) документов необходимо использовать поля типа Image, поскольку в случае, если документ хранится в поле типа text, то ASE 12.5 будет автоматически производить анализ документа при обращении к нему.
Достоинство этого подхода — быстрый возврат по запросу законченного XML-документа. Недостаток состоит в том, что на поиск необходимого документа затрачивается длительное время.
Гибридный подход предусматривает создание уникального ключевого поля в таблице для каждого XML-документа. Это обеспечивает быстрый доступ к необходимому документу.
Для работы с XML-документами в ASE реализован интерфейс языка XQL (XML Query Language).
XQL был специально разработан в качестве основного языка запросов для фильтрации и выбора данных из XML-документов. Несмотря на то что этот язык еще сравнительно молод и пока не имеет стандарта, он уже получил поддержку со стороны Web-консорциума, и многие промышленные приложения используют его при работе с XML.
Это достаточно краткий и понятный язык, наиболее привлекательный для современных СУБД. Рассмотрим некоторые из его операторов, которые будут использоваться в примерах, приводимых в данной статье.
Конструкция /bookstore/book/title позволяет получить новый XML-документ, содержащий в себе список названий всех книг, которые хранятся на складе. Аналогичный документ вернет конструкция /bookstore//titlе.
Этот оператор позволяет создать новый документ, содержащий в себе только необходимое подмножество данных:
/bookstore/book[author/first-name = ‘Mary’]/title
В данном примере будет создан новый документ, содержащий в себе список названий книг, автором которых является Mary.
Полное описание XQL можно получить по адресу http://www.w3.org/TandS/QL/QL98/pp/xql.html/.
Как уже отмечалось выше, XQL реализован в ASE в виде Java-класса xml.xql, в котором содержатся методы для анализа и выполнения запросов к XML. Этот класс может выполняться на любой виртуальной машине Java, которую поддерживает ASE, и поэтому может использоваться для написания клиентских приложений для работы с XML на рабочих местах вне сервера.
Класс содержит два основных метода:
В зависимости от передаваемых параметров этот метод имеет два варианта (рис. 1).
Parse() с параметром String — это статический метод для анализа XML и преобразования его во внутренний формат Sybase. В качестве параметра используется строковый параметр Java String:
SybXmlStream xmlStream = xml.Xql.parse(“<xml><A><B>c</B></A></xml>”);
Parse() с параметром InputStream — в качестве аргумента берется InputStream, то есть для работы с документами, поступающими извне:
URL fileURL;
fileURL = new URL(“http://xml.mysite.com/order.xml”);
InputStream inputXML;
SybXmlStream xmlStream;
inputXML = fileURL.openStream();
xmlStream = xml.Xql.parse(inputXML);
Результатом выполнения метода parse() является объект класса SybXmlStream, содержащий оптимизированную индексную структуру XML-документа внутри ASE. Такое внутреннее представление решает проблему снижения производительности сервера при одновременной работе нескольких пользователей с одним XML-документом, размер которого составляет несколько мегабайт.
Этот метод служит для выполнения запросов к XML-документам и имеет два аргумента: строка XQL-запроса и XML-документ. Результатом выполнения является XML-документ с корневым элементом <xql_result>… </xql_result>. В зависимости от типа передаваемых параметров имеет четыре варианта (рис. 2).
Query() c параметром String — этот статический метод выполняет запрос к XML-документу, содержащемуся в строке:
String result = xml.Xql.query(“/bookstore/book/author”, “<xml> ... </xml>”);
Query() с параметром InputStream — этот метод выполняет запрос к XML-документу, который хранится в файле на диске:
FileInputStream xmlStream = new FileInputStream(“bookstore.xml”);
String result = Xql.query(“/bookstore/book/author”, xmlStream);
или находится в Интернете (в этом случае используется объект URL):
URL xmlURL = new URL(“http://mybookstore.amazon.com/bookstore.xml”);
String result = Xql.query(“/bookstore/book/author”, xmlURL.openStream());
Query() с параметром SybXmlStream — принимает в качестве параметра объект класса SybXmlStream. Типичный сценарий использования этого варианта:
SybXmlStream xmlStream = xml.Xql.parse(“<xml>..</xml>”);
String result = xml.Xql.query(“/bookstore/book/author”, xmlStream);
Query() с параметром JXml — класс JXml применяется в текущей версии ASE 12.0 как Java-объект для хранения и работы с XML-документами. Если в базе уже имеются документы, разработанные с помощью данного класса, то работу с ними можно производить с помощью XQL:
JXml xDoc = new JXml(“<xml>...</xml>”);
String result = Xql.query( “/bookstore/book/author”, xDoc);
Над документами, хранящимися в базе данных XML, можно выполнять четыре основные операции: INSERT, DELETE, UPDATE и SELECT.
Создадим таблицу:
create table XMLDAT(.., xmldoc image,..)
Добавим в нее документ:
insert into XMLDAT values ( .., xml.Xql.parse( “<xml><bookstore>..</bookstore></xml>”), .. )
Удалим из таблицы все записи, содержащие XML-документы, в которых упоминается имя автора Karl:
Delete from XMLDAT
Where
xml.Xql.query(“/bookstore/book[autor/first-name=‘Karl’], xmlcol ) != xml.xql.EmptyResult
Переменная EmptyResult содержит пустой XML-документ в виде <xql_result></xql_result>.
Аналогично можно выполнить изменение документов:
update XMLDAT
set xmldoc = xml.Xql.parse(“<xml> … … </xml>”)
Where ..
Как SQL выполняет запрос к реляционным данным, так и XQL выполняет запросы к данным, которые хранятся в XML-документе:
Select
xml.Xql.query(“/bookstore/book[autor/first-name=‘Mary’], xmlcol )
from XMLDAT
Where
xml.Xql.query(“/bookstore/book[autor/first-name=‘Mary’], xmlcol ) != xml.xql.EmptyResult
Приведенная конструкция оператора SELECT выбирает из таблицы все строки, где содержатся XML-документы с автором Mary, а затем формирует список книг, автором которых является Mary.
Поддержка XML в ASE позволяет разработчикам создавать эффективные решения в области обмена деловой информацией между различными приложениями. Хранение XML-документов в базе облегчает работу Web-дизайнерам, которым приходится рисовать сотни HTML-страниц с одинаковым содержанием, но с разными способами представления данных. Используя поддержу Java в ASE, можно создавать собственные классы для обработки специфических XML-документов. Все вышеописанные, а также другие решения, предлагаемые компанией Sybase, позволяют ASE стать надежной основой для построения систем электронной коммерции и создания единого информационного портала предприятия.
Дополнительная информация
За дополнительной информацией обращайтесь в компанию Interface Ltd.
Обсудить на форуме Sybase, Inc.
INTERFACE Ltd. |
|