В статье рассмотрены особенности перевода с реляционного языка на язык XML и наоборот. Реляционный язык – это язык кортежей и отношений. Внешним представлением сообщений на реляционном языке является набор двухмерных таблиц. Конкретное приложение, работающее с РБД, делает разметку отношений, кортежей и значений в таблицы, строки (записи) и клетки (поля) и придает им некоторый внешний вид, обычно по опциональному выбору пользователя.
XML - это самостоятельная технология, хотя и возникшая исторически как Internet- технология. Представляется важным рассмотреть технологию XML в отрыве от Internet и в связи с технологиями баз данных: реляционной, объектной и концепцией корпоративных хранилищ. Как связан язык XML с реляционным, почему на его основе может и должна быть построена модель данных, что собой представляет XML- ориентированная база данных, существуют ли таковые на сегодняшний день - этим вопросам посвящена настоящая статья.
Рассмотрим исторические причины возникновении XML как языка. На исторические причины возникновения XML можно посмотреть с двух различных, но связанных между собой точек зрения (рисунок1):
Рисунок 1. Две точки зрения возникновения XML
Первая точка зрения состоит в том, что семантическая ограниченность языка разметки гипертекста HTML не позволяла разработчику Web-приложений описывать специфичную информацию, например, химические или математические формулы [1]. Возникла практическая потребность в других языках разметки, структурно аналогичных HTML, но с другой семантикой. В результате стараний Интернет-консорциума W3C был создан метаязык XML, на основе которого заинтересованные разработчики создали и создают специфичные дочерние языки разметки - CML, MathML и уже десятки других. С учетом небольшой синтаксической доработки, HTML также является дочерним языком XML.
Согласно второй точки зрения информация, заключенная в любом документе, в том числе и в Web-странице, является в большей или меньшей степени регулярной. Ранние варианты HTML слабо учитывали эту регулярность, что приводило к громоздкости сообщений на этом языке и не вполне удовлетворяло разработчиков Web-приложений. Первым делом, стараниями W3C-консорциума, разработчикам была предоставлена возможность вычленить из HTML-документа описание внешнего вида отдельных, регулярно повторяющихся его фрагментов в самостоятельный объект – таблицу стилей CSS. Далее была вычленена в самостоятельный объект собственно разметка – таблица стилей XSL, которую, возможно, следовало бы более точно назвать таблицей шаблонов разметки. В итоге остался XML-документ, описывающий в чистом виде структуру данных документа.
Таким образом, структурированные данные документа были отделены от способа их логико-графического представления (разметки) в виде списков, параграфов, таблиц, диаграмм и т.п., а логико-графическое представление от конкретного внешнего вида (стиля) – размеров, цветов, начертаний и т.п.
В общем виде XML-документ имеет структуру произвольного дерева, которая описывается набором вложенных друг в друга тегов, каждый из которых имеет следующий синтаксический вид:
<ИмяУзла ИмяАтр1=”значение” ИмяАтр2=”значение” ... > вложенные теги и тексты </ИмяУзла>
Разница этих двух точек зрения на XML состоит в том, что ставить во главу угла – разметку или данные. В первом случае имена тегов и их атрибутов являются указателями на конкретный шаблон разметки и стандартизуются в словарях-спецификациях XML для каждого конкретного языка разметки. Во втором случае имена тегов XML - это указатели регулярных данных самого XML- документа. Нас интересует второй вариант, и под XML- документом мы будем понимать структуру данных документа, выраженную языком XML. Далее рассмотрим особенности перевода с реляционного языка на язык XML и наоборот. Реляционный язык – это язык кортежей (неупорядоченных множеств пар “Имя Реквизита-Значение Реквизита”) и отношений (неупорядоченных множеств кортежей, имеющих одинаковый набор имен реквизитов). Внешним представлением сообщений на реляционном языке является набор двухмерных таблиц [2]. Конкретное приложение, работающее с РБД, делает разметку отношений, кортежей и значений в таблицы, строки (записи) и клетки (поля) и придает им некоторый внешний вид, обычно по опциональному выбору пользователя.
Внешним представлением сообщений на языке XML является набор реальных документов (и электронных, и бумажных), визуализация которых происходит при помощи универсального браузера (например, IE5) на основании XSL и CSS.
Перевод сообщений с реляционного языка на XML синтаксически не однозначен. Для иллюстрации рассмотрим простой пример, состоящий из 3 отношений, 5 реквизитов и 5 кортежей (рисунок 2).
Рисунок 2. Перевод сообщений с реляционного языка на XML
В простейшем и наиболее компактном варианте получается следующая конструкция (вариант 1):
<DataBase>
<Tab1 A=”a1” C=”c1”/>
<Tab2 B=”b1” D=”d1”/>
<Tab2 B=”b2” D=”d2”/>
<Tab3 A=”a1” B=”b1” E=”e1”/>
<Tab3 A=”a1” B=”b2” E=”e2”/></DataBase>
Ее недостатком является неоднородность представления кортежей и значений, что, например, осложняет отображение расширенных реляционных моделей. Если значения оформлять также в виде тегов, то получим следующее (вариант 2):
<DataBase>
<Tab1><A>a1</A><C>c1</C></Tab1>
<Tab2><B>b1</B><D>d1</D></Tab2>
<Tab2><B>b2</B><D>d2</D></Tab2>
<Tab3><A>a1</A><B>b1</B><E>e1</E></Tab3>
<Tab3><A>a1</A><B>b2</B><E>e2</E></Tab3></DataBase>
Оба варианта используют двухуровневую вложенность XML-узлов, с помощью которой устанавливаются направленные связи кортеж-значение. Направленные связи от записей Tab1 к записям Tab3 и от записей Tab2 к записям Tab3 (Tab3 обычно называют таблицей-связкой для реализации связей типа "многие-ко-многим") указываются одинаковыми значениями ключевых реквизитов A и B. В языке XML связи обычно указываются явно путем вложения тегов друг в друга и путем применения ссылок. Это позволяет в нашем примере убрать ссылочные ключи в Tab3 и установить ссылки на одного родителя путем вложения тега Tab3 в Tab2 и на второго родителя (Tab1) с помощью атрибутов Id и Ref (вариант 3):
<DataBase>
<Tab1 Id=”#1”>
<A>a1</A>
<C>c1</C></Tab1>
<Tab2>
<B>b1</B>
<D>d1</D>
<Tab3 Ref1=”#1”>
<E>e1</E></Tab3></Tab2>
<Tab2>
<B>b2</B>
<D>d2</D>
<Tab3 Ref1=”#1”>
<E>e2</E></Tab3></Tab2></DataBase>
Для того чтобы выполнить обратную операцию – привести произвольные XML- данные к реляционным – в первую очередь их необходимо преобразовать к одному из описанных выше вариантов. Для примера возьмем вариант 3.
- Для каждого тега (в общем виде) вынесем все атрибуты, кроме Id и Ref, и все фрагменты текста в отдельные вложенные теги. Получится следующая структура:
<ИмяУзла Id=”Указатель” Ref1=”Указатель” Ref2=”Указатель”...>
<ИмяАтр1> Значение </ИмяАтр1>
<ИмяАтр2> Значение </ИмяАтр2>...
<ИмяТекста1> Только текст </ИмяТекста1>
<ИмяТекста2> Только текст </ИмяТекста2>... Только вложенные теги </ИмяУзла>
- Реляционные данные хранятся в неупорядоченном виде, а данные XML в упорядоченном. Если в порядке следования атрибутов, фрагментов текста и вложенных тегов заложен смысл, то его, возможно, следует сохранить путем добавления к этой структуре специального вложенного тега, содержащего эту информацию.
- Узлы предпоследнего уровня иерархии, которым соответствуют кортежи, не могут содержать одноименные вложенные теги - эта ситуация должна быть преобразована. Грубо говоря, в реляционной таблице клетка не может быть разделена на части. Кроме того, если она и может быть пустой, то уж никак не может отсутствовать. Поэтому, необходимо учесть разницу между отсутствующим и пустым тегом последнего уровня.
- Узлы последнего уровня иерархии, которым соответствуют значения реквизитов, не могут содержать ссылочных атрибутов Id и Ref, так как в реляционных данных связи по ключам существуют только на уровне кортежей.
Преобразование варианта 3 в вариант 2 происходит путем включения ключевых тегов, в качестве которых, в общем случае, удобно использовать суррогатные ключи.
Как видно из рассмотренного примера, если данные размещать как текст и "размечать" их именами тегов, а атрибуты использовать только для ссылок, то получается весьма однородная структура, синтаксически несколько более широкая, чем реляционная.
Литература
- Веселов В.В., Долженков А.Н. Влияние языка XML на развитие технологий баз данных. - Сайт информационных технологий. webservis.ru
- Джонатан Эйнджел. XML: время пришло. - Lan/Журнал сетевых решений,№11/99