Классика баз данных - статьи

       

в жанре fiction на языке


for $r in doc("db.xml")/db/movie[gender="fiction"]/review return replace($r)
Запрос 1.Получение XHTML-представления обзоров кинофильмов в жанре fiction на языке XQuery при неизвестной структуре данных
В приведенном Запросе 1 рекурсивная функция replace обходит все возможные узлы документа и в зависимости от типа и имени узла возвращает результат. Необходимо отметить, что функция replace по сути заново конструирует весь элемент средствами конструкторов языка XQuery. Подобные запросы с рекурсивными функциями трудны для понимания и не отличаются компактностью и выразительностью записи.
Эффективное выполнение приведенного Xquery-запроса также порождает ряд проблем. Во-первых, для получения результата, необходимо обойти абсолютно все узлы элемента review. То есть для любого объема данных необходимо просканировать все эти данные целиком. Во-вторых, для получения результата необходимо заново сконструировать каждый узел элемента review. Операция конструирования XML-узла во многих XML-СУБД (например, в XML-СУБД Sedna[]) является "дорогой" операцией, что затрудняет эффективное вычисление запросов. Таким образом, такой подход не приемлем при работе с большими объемами данных.
Описанный пример является примером общей задачи "найти и заменить". Такая задача, например, часто возникает в задачах управления контентом, когда приходится обрабатывать документ-ориентированные XML-данные с частично известной структурой, в которых активно используется линейная разметка текста.
Рассмотрим другой пример. Допустим, что база XML-данных содержит данные о заказах в XML-элементах order, где каждый заказ состоит из набора наименований orderLine. Каждое из наименований характеризуется названием name, количеством quantity и ценой price в валюте cur. Пример такого элемента показан на рис. 1.
<orders> <order id="1"> <orderLine> <name>tire</name> <quantity>4</quantity> <price cur="rubles">1200</price> </orderLine> <orderLine> <name>oil</name> <quantity>1</quantity> <price cur="rubles">750</price> </orderLine> : </order> : </orders>

Содержание  Назад  Вперед