Каталог Индекс раздела

          

XQuery и SQL - в чем разница

Ken North
Ken North Computing LLC

XQuery and SQL: Vive la Différence
Опубликовано в: DB2 Magazine, Quarter 3, 2003, pp 42-45.

Невозможно обсуждать будущее программной индустрии без обсуждения XML. XML стал настолько важен, что SQL уже не является шаблонным ответом на вопрос "Какой язык запросов поддерживается всеми основными компаниями - производителями СУБД?" Новое дитя в семействе языков - XQuery, язык запросов для поиска документов с тегами XML в файлах и базах данных.

Спецификация XQuery, опубликованная Консорциумом WWW (W3C) и разработанная ветеранами процесса стандартизации SQL, появилась потому, что SQL - разработанный для запросов реляционных данных - не является идеально подходящим для документов XML. Хотя SQL достаточно хорошо работает с данными XML, когда есть приемлемое соответствие между таблицами SQL и документами XML, он не является универсальным решением. Некоторые XML-документы не находятся на базах данных SQL. Некоторые разделяются или разбираются на части перед занесением в базу данных SQL. Некоторые хранятся в естественном формате XML без декомпозиции.

Да и сама природа XML-документов создает трудности для SQL. XML-документы являются данными иерархическими, со структурой дерева. Они само-описывающиеся, так как состоят из контента и разметки (тегов, идентифицирующие контент). В базах данных SQL, таких как DB2, отдельные строки не содержат названий столбцов или типов, так как вся эта информация есть в системном каталоге. Модель XML иная. Как и в SQL, схемы, внешние по отношению к описываемому контенту, определяют имена и типы информации. Однако возможно обрабатывать XML-документы и без использования схем. XML-документы содержат встроенные теги, которые размечают контент. Но, в отличие от SQL, при сохранении и выборке XML-документов важна упорядоченность. Вложенность и упорядоченность элементов в XML-документе должны быть сохранены.

Многие запросы на поиск документы требуют позиционной логики для навигации нужному узлу в дереве документа. При расчленении документов и отображении их на столбцы необходимо сохранять информацию о структуре документа. Даже при отображении на столбцы SQL контента XML часто требуется навигационнвя логика для прохождения по дереву документа. Другие требования для запросов на документы XML включают в себя сравнение по шаблону, вычисления, выражения, функции и работу с пространствами имен и схемами.

Появляется XQuery

По этим и другим причинам, W3C в 1998 году собрал группу для обсуждения предложений по запросам в XML и в 1999 году сформировал Рабочую Группу по запросам в XML (XML Query Working Group). Эта группа в 2000 году начала сотрудничать с Рабочей Группой XML (Extensible Stylesheet Language Working Group).

Рабочая Группа по запросам в XML включает в себя людей, которые принимали участие в создании языка SQL, оптимизации запросов и развитии стандарта SQL. Представители таких компаний, как IBM, AT&T, BEA, Bell Labs, Data Direct, Microsoft и Oracle работали вместе для создания комплектов документов, которые охватывают спецификации требований, модель данных и алгебру запросов, модель обработки, формальную грамматику, варианты использования, спецификацию сериализации и спецификацию языка XQuery. В начале нынешнего годы Рабочая Группа по запросам в XML выработала рабочую редакцию спецификации XQuery 1.0 для публичного рассмотрения, а также работала с Рабочей Группой XML для улучшения спецификации XPath 2.0. XPath предлагает синтаксис для адресации частей документа; XQuery 1.0 поддерживает все выражения XPath 2.0. Единственная разница между выражениями XPath и XQuery состоит в том, что выражения XQuery возвращают упорядоченную последовательность узлов, тогда как выражения XPath возвращают множество узлов. XQuery обеспечивает совместимость с XPath через возвращаемые последовательности в порядке документа.

Как это работает

Запрос на языке XQuery содержит одно или более выражений запроса. XQuery поддерживает условные выражения, конструкторы элементов, выражения FOR, LET, WHERE, RETURN (FLWR), выражения с операторами и вызовами функций и с кванторами, а также выражения с проверкой типов и маршрутные выражения. Некоторые выражения XQuery разбираются до простых узловых значений (таких как элементы и атрибуты) или атомарных значений (таких как строки и числа). Запросы также могут разбиваться на последовательности как узлов, так и простых значений.

Результат в XQuery - экземпляр Модели Данных Запроса в XML (XML Query Data Model). XQuery использует типы схем XML и предлагает статические типы времени компиляции и динамические типы времени выполнения. Он также поддерживает примитивные и производные типы.

В любом обсуждении XQuery вы несомненно услышите частые ссылки на FLWR-выражения, синтаксические конструкции извлечения, фильтрации и преобразования записей, использующие выражения FOR, LET, WHERE и RETURN. FLWR-выражение создает некоторые связи, применяет предикат и выдает множество результатов. Выражение FOR создает связи выбранных узлов, тогда как выражение LET создает единственную связь. Выражения FOR, которые могут быть и вложенными, полезны для итеративной обработки последовательностей результатов XQuery.

XQuery не соответствует некоторым соглашениям SQL. Например, SQL не имеет концепции узлов и не обеспечивает навигации и сохранения информации о положении узлов в дереве. XQuery 1.0 не поддерживает обновление данных, хотя такая поддержка запланирована.

Но и в XQuery, и в SQL есть ряд схожих концепций. Оба языка предоставляют ключевые слова для операций проекции и преобразования (SELECT в SQL или RETURN в XQuery). SQL обеспечивает соединения таблиц, а XQuery обеспечивает соединения между многими документами. XQuery обеспечивает фильтрацию при помощи WHERE и сортировку при помощи ORDER BY. XQuery и SQL обеспечивают вызовы функций и функции, определенные пользователем.

XQUERYX

Вдобавок к обновлениям XQuery, Рабочая Группа по запросам в XML также создала черновую спецификацию XQueryX - синтаксис для представления выражений XQuery как XML. XQueryX определяет отображение запроса на языке XQuery в запрос на языке XML. XQueryX в противоположность XQuery подробен; возможность свободного прочтения человеком не считается слишком большим преимуществом. Мотивацией для создания XQueryX было упрощение разбора и поддержка таких операций, как запросы в запросах и преобразование в новые запросы. Листинг 1 показывает пример запроса в языке XQuery. Листинг 2 показывает тот же запрос в XQueryX.

IBM И XML

DB2 Universal Database (UDB), начиная с версии 5, - это мощная платформа для управления различными типами данных и запросов к ним. Еще до появления спецификаций XML W3C, IBM расширила DB2 мощными возможностями для обработки текста. Так как XML - это текст, текстовый расширитель DB2 (DB2 Text Extender) предложил упреждающее решение для управления, индексирования и запросов для наборов XML-документов.

IBM в 2000 году модифицировала DB2 Text Extender расширителем XML - DB2 XML Extender- и разработала парсер XML. Расширитель XML предлагает множественные альтернативы для сохранения XML и поддерживает интеграцию XML-документов при помощи очередей сообщений WebSphere MQ. Дон Чемберлин (Don Chamberlin) из IBM, один из создателей SQL, также поддержал разработку языка запросов для XML. Чемберлин, а также исследователи Джонатан Роби (Jonathan Robie) и Даниэла Флореску (Daniela Florescu), создали Quilt - язык запросов, на основе которого Рабочая Группа по запросам в XML строит XQuery.

Web-сайт IBM alphaWorks, на котором альфа-коды новых технологий доступны для разработчиков, представляет XML for Tables для обеспечения XML-представления реляционных таблиц, а XQuery выполняет поиск в этих представлениях. XML for Tables отображает XQuery в SQL для запросов в базах данных DB2. Он берет результат запросов SQL и размечает его для создания результата в XML. XML for Tables в основном базируется на хранимых процедурах DB2.

Запросы XML стали важным аспектом проекта IBM Xperanto - технологии обзора, которая обеспечивает интеграцию разрозненных источников данных и поддержку федеративных баз данных. IBM расширила DB2 Control Center так, что, например, можно конфигурировать объекты федеративных баз данных. Технология обзора базируется на знаниях и опыте, приобретенных IBM в проектах Garlic, DiscoveryLink и DB2 DataJoiner. DB2 Information Integrator, который доступен с мая, вырос из этого проекта и поддерживает интеграцию структурированных, полуструктурированных и неструктурированных данных. DB2 Information Integrator может оптимизировать запросы, используя такие технологии, как соединения, табличные функции и объединенные представления для доступа к рассредоточенным данным, таким как сверхбольшие таблицы, Web-сервисы и таблицы DB2. Он может использовать функции DB2 для получения данных путем обращения к Web-сервисам или отправки сообщения в очередь. Он может определять представления XML для использования с XQuery.

DB2 Information Integrator обеспечит поддержку XQuery в будущем релизе (как и DB2 UDB, и DB2 Content Manager). Эта поддержка позволит DB2, как пример, обрабатывать коллекции документов XML (включая XML-документы, которые не хранятся в DB2) как виртуальную базу данных.

JAVA И XQJ

С июня 2003 года IBM и Oracle сотрудничают в Java Community Process для разработки интерфейса программирования XQuery для Java. Группа экспертов, работающая над новым запросом на спецификацию Java (Java Specification Request), JSR 225, разработает спецификацию на API XQuery для Java (XQJ). IBM помогает разрабатывать спецификацию XQJ и пакет совместимости технологий (Technology Compatibility Kit).

XQJ позволит программистам Java использовать XQuery для доступа к базам данных, так же, как JDBC позволяет программистам Java использовать SQL для доступа к данным. XQL будет определять интерфейсы и классы, которые поддерживают запросы в коллекциях документов или в отдельных документах. Он будет использовать общие с JDBC концепции, такие как поддержка транзакций, интерфейс, ориентированные на соединения, прекомпилированные запросы и параметризованные запросы. XQJ также будет обеспечивать обработку результатов запросов используя потоковые API для XML и Java API для обработки XML (JAXP), включая сериализацию JAXP. XQJ также обеспечит модель итератора или курсора для обработки результатов.

ОСЕДЛАНИЕ ВОЛНЫ

Большая часть программной индустрии держится на волне архитектуры, ориентированные на сервисы, включая Web-сервисы и сеточные сервисы. Это новое поколение программного обеспечения закладывается в XML и документо-центрированную модель. И документы в формате XML также являются моделью для новых стандартов обработки транзакций и новое поколение приложений электронного бизнеса.

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

Поддержка XQuery в DB2 и DB2 Information Integrator явится дополнениям к богатым возможностям тех сред для разработчиков и администраторов баз данных, которые пользователи получают от продуктов баз данных IBM. XQuery и DB2 Information Integrator позволяют пользователям искать контент XML-документов в DB2 и внешних файлах, а также интегрировать информацию из источников данных XML.

С добавлением поддержки XQuery, пользователи DB2 теперь имеют два решения, основанных на стандартах (SQL и XQuery), для извлечения информации из баз данных или документов. И поскольку XQuery разработали ветераны SQL, опытные пользователи SQL легко узнают и поймут концепции XQuery. Изучение XQuery даст пользователям DB2 новый мощный инструмент для поиска информации в коллекциях документов.

    FOR $b document("biblio.xml")//book    
    WHERE $b/publisher = "Apress" 
    AND $b/year = '2001"
    RETURN $b/title

ЛИСТИНГ 1. Пример Xquery

Назад

    <q:query xmins:q="http://www.w3.org/2001/06/xqueryx">
    <q:flwr>
     <q:forAssignment variable="$b">
      <q:step axis="SLASHSLASH">
       <q:function name="document">
        <q:constant datatype="CHARSTRING">biblio.xml</q:constant>    
       </q:function>
       <q:identifier>book</q:identifier>
      </q:step>
     </q:forAssignment>
     <q:where>
      <q:function name="AND">
       <q:function name="EQUALS">
        <q:step axis="CHILD">
         <q:variable>$b</q:variable>
         <q:identifier>publisher</q:identifier>
        </q:step>
        <q:constant datatype="CHARSTRING">Apress</q:constant>
       </q:function>
       <q:function name="EQUALS">
        <q:step axis="CHILD">
         <q:variable>$b</q:variable>
         <q:identifier>year</q:identifier>
        </q:step>
        <q:constant datatype="CHARSTRING">2001</q:constant>
       </q:function>
      </q:function>
     </q:where>
     <q:return>
      <q:step axis="CHILD">
       <q:variable>$b</q:variable>
       <q:identifier>title</q:identifier>
      </q:step>
     </q:return>
    </q:flwr>
    </q:query>

ЛИСТИНГ 2. Пример запроса, записанного в XML (XqueryX)

Назад

Каталог Индекс раздела