Робота з XML-документами в Sybase Adaptive Server Enterprise, Інші СУБД, Бази даних, статті

Обговорення XML в комп’ютерних виданнях в паперовому та в електронному вигляді зробило цю мову і його застосування широко відомим публіці, так що доводити його гідності не має сенсу. У той же час хотілося б відзначити, що XML не є панацеєю для вирішення всіх проблем електронного обміну документами між додатками, але вкупі з багатьма вже існуючими технологіями дозволяє зробити такий обмін більш простим і надійним.


Саме тому найбільші постачальники СУБД додали в свої SQL-сервери набори компонентів, утиліт і інтерфейсів для роботи з XML-документами, тобто створили свого роду програмну інфраструктуру, яка дозволяє об’єднати реляційну модель баз даних з ієрархічною моделлю XML, спростити спосіб передачі інформації в Інтернет і зберігання готових XML-документів.


А тепер розглянемо, як реалізована підтримка XML у флагманської СУБД Sybase – Adaptive Server Enterprise (ASE).


Підтримка XML в ASE


Підтримка XML введена в ASE починаючи з версії 12.0. Вона включає в себе зберігання і обробку XML-документів не тільки з боку клієнта, але і на сервері. Вбудована в сервер віртуальна Java-машина з допомогою методів спеціального Java-класу Jxml дозволяє виконувати аналіз XML-документа і здійснювати над ним базові операції.


У нову версію ASE 12.5, початок комерційної реалізації якої намічається в середині червня, додана можливість зберігати синтаксично розібрані документи в полях таблиці типу image. Введено процесор мови XQL (XML query language) для обробки XML.


Нижче ми розповімо про всі можливості обох версій для роботи з XML.


Стратегія зберігання XML-документів


АSE зберігає XML-документи в полях типу char або varchar (якщо розмір документа невеликий), в полях типу Java-клас, в полях Image або Text. Існують три підходи для розміщення XML-документів:



  1. Розміщення документів поелементно.

  2. Розміщення документів цілком.

  3. Гібридний підхід.

Розміщення документів поелементно


У цьому випадку дані зберігаються в традиційному реляційному поданні в таблицях ASE. При запиті до бази відбувається вибірка даних з усіх таблиць і формування XML-документа. При запису в базу відбувається зворотна операція – розбір XML і розподіл даних по таблицях. Цей підхід рекомендується застосовувати у випадках, коли відбувається інтенсивна зміна інформації (наприклад, в системах «банк-клієнт»).


Перевагою використання зазначеного підходу є підтримка посилальної цілісності на рівні бази даних і використання мови Transact-SQL для формування та розбору XML-документа (застосування функцій SUBSTR, CONVERT і т.д.), а недоліком – необхідність проведення синтаксичного аналізу XML-документа кожен раз при його складанні / розбиранні.



Розміщення документів цілком


Документ повністю зберігається в таблиці, яка містить одну колонку типу image або text. Такий спосіб зберігання документів підходить для тих випадків, коли їх зміст статично, а будь-яке оновлення зводиться до перезапису в базі даних. Типові приклади зазначених документів – статті, каталоги, прайс-листи тощо, тобто документи в самому звичайному значенні цього слова, які й зберігаються в базі даних, і витягуються за запитом цілком.


Для зберігання синтаксично розібраних (проаналізованих) документів необхідно використовувати поля типу Image, оскільки в разі, якщо документ зберігається в поле типу text, то ASE 12.5 буде автоматично проводити аналіз документа при зверненні до нього.


Гідність цього підходу – швидке повернення на запит закінченого XML-документа. Недолік полягає в тому, що на пошук необхідного документа затрачається тривалий час.



Гібридний підхід


Гібридний підхід передбачає створення унікального ключового поля в таблиці для кожного XML-документа. Це забезпечує швидкий доступ до необхідного документу.


Поняття XQL


Для роботи з 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 можна отримати за адресою www.w3.org/TandS/QL/QL98/pp/xql.html/.


Реалізація XQL в ASE 12.5


Як уже зазначалося вище, XQL реалізований в ASE у вигляді Java-класу xml.xql, в якому містяться методи для аналізу і виконання запитів до XML. Цей клас може виконуватися на будь віртуальній машині Java, яку підтримує ASE, і тому може використовуватися для написання клієнтських додатків для роботи з XML на робочих місцях поза сервера.


Клас містить два основні методи:



Метод parse ()


В залежності від переданих параметрів цей метод має два варіанти (рис. 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-документом, розмір якого становить кілька мегабайт.



Метод query ()


Цей метод служить для виконання запитів до XML-документами і має два аргументи: рядок XQL-запиту і XML-документ. Результатом виконання є XML-документ з кореневим елементом . В залежності від типу переданих параметрів має чотири варіанти (рис. 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);


Інтеграція SQL з XQL в ASE 12.5


Над документами, що зберігаються в базі даних 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-документ у вигляді .


Аналогічно можна виконати зміна документів:



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 стати надійною основою для побудови систем електронної комерції та створення єдиного інформаційного портала підприємства.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*