Главная » SQL, Базы данных » СРЕДСТВА ЯЗЫКА SQL/XML

0

Ко времени написания данной книги в стандарте SQL не была предусмотрена поддержка языка XML, но предполагается, что соответствующие средства поддержки будут включены в этот стандарт под общим названием SQL/XML [27.15] и определены в части 14 следующей версии стандарта (рабочий вариант которой был опубликован в 2003 году). В настоящем разделе даны предварительные сведения об указанных средствах поддержки, но следует учитывать, что весь представленный здесь материал после формального утверждения спецификации средств SQL/XML может потребовать пересмотра.

Применение "коллекции XML"

Как было показано в предыдущем разделе, существует два основных способа, с помощью которых может быть организовано хранение данных XML в базе данных SQL. В этих двух подходах используются "коллекция XML" и  "столбец  XML"; в спецификации SQL/XML поддерживаются оба указанных способа. (По очевидным причинам в этой спецификации не поддерживаются собственно базы данных XML как таковые.) В данном  подразделе  рассматривается  так  называемая  "поддержка  с использованием коллекции XML".

Прежде всего, необходимо отметить, что само требование, согласно которому "поддержка коллекции XML" вообще должна быть включена в стандарт SQL,  является довольно странным! Дело в том, что (как показано в разделе 27.6) такая поддержка не имеет никакого отношения к СУБД (она, скорее, предназначена для определенных прикладных программ, таких как Web-серверы, которые  применяются в качестве надстройки над СУБД). Но, так или иначе, рассматриваемые средства поддержки фактически состоят из описанных ниже компонентов.

■     Правила преобразования наборов символов, идентификаторов, типов данных22 и значений SQL в наборы символов, имена, типы данных и значения XML.

■     Правила преобразования таблицы или набора таблиц SQL в два документа XML, один из которых содержит данные как таковые, а другой — соответствующую схе му на языке ХМ L Schema.

Эти правила, вместе взятые, обеспечивают публикацию данных SQL в форме XML; равным образом они обеспечивают поддержку тех информационных структур, которые в предыдущем разделе были названы "представлениями данных  SQL в виде документов XML" (но предназначенных только для выборки).  Поэтому, в частности, эти правила предоставляют основу для применения запросов XQuery к таким данным. Но следует отметить, что в спецификации SQL/XML не определены какие-либо правила выполнения обратного процесса, а именно для разделения данных XML на фрагменты и преобразования в форму SQL (если не считать того небольшого исключения, что в этой спецификации предусмотрены правила преобразования наборов символов и имен XML в наборы символов и идентификаторы SQL).

В качестве примера рассмотрим аналог на языке SQL обычно применяемой в этой книге переменной отношения деталей, т.е. таблицу р. Ниже приведено упрощенное определение23 этой таблицы на языке SQL.

22 Ковременинаписанияэтойкнигиструктурированныетипынеподдерживались.

CREATE TABLE P ( PNUM CHAR(6),

PNAME CHAR(20), COLOR CHAR(6), WEIGHT NUMERIC(5,1), CITY CHAR(20) ) ;

Предположим, что таблица содержит только обычные строки с данными о деталях Р1 и Р2. В таком случае в результате преобразования этих строк в формат XML может быть получен документ с данными, который выглядит примерно следующим образом.

<р>

<row>

<PNUM>P1< / PNUM>

<PNAME>Nut</PNAME>

<COLOR>Red</COLOR>

<WEIGHT>12.0</WEIGHT>

<CITY>London</CITY>

</row>

<row>

<PNUM>P2</PNUM>

<PNAME>Bolt</PNAME>

<COLOR>Green</COLOR>

<WEIGHT>17.0</WEIGHT>

<CITY>Paris</CITY>

</row>

</p>

Кроме того, вырабатывается документ схемы, который имеет следующий вид.

<xsd:schema xmlns:xsd="http://www.w3.org/2 001/XMLSchema">

<xsd:simpleType name="CHAR_6">

<xsd:restriction base="xsd:string">

<xsd:length value="6"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name="CHAR_20">

<xsd:restriction base="xsd:string">

<xsd: length value="20"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name="DECIMAL_5_l">

<xsd:restriction base="xsd:decimal">

<xsd:totalDigits value="5"/>

<xsd:fractionDigits value="l"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:complexType name="RowType.P">

<xsd:sequence>

23  Эти упрощения состоят в следующем — опущена конструкция PRIMARY KEY, поскольку в [27.15] не приведены сведения о преобразовании ключей в формат XML, исключены случаи  применения определяемых пользователем типов и опущены спецификации NOT NULL.

<xsd:element name="PNUM" type="CHAR_6"/>

<xsd:element name="PNAME" type="CHAR_20"/>

<xsd:element name="COLOR" type="CHAR_6"/>

<xsd:element name="WEIGHT" type="DECIMAL_5_1"/>

<xsd: element name="CITY" type="CHAR_2 0 "/>

</xsd:sequence> </xsd:complexType>

<xsd:complexType name="TableType.P">

<xsd:  sequence>

<xsd:element name="row" type="RowType.P" minOccurs="0" maxOccurs="unbounded"/> </xsd:seguence>

</xsd:complexType>

<xsd:element name="P" type="TableType.P"/> </xsd:schema>

Применение "столбца XML"

Теперь перейдем к изучению средств поддержки "столбца XML" в языке SQL. В спецификации SQL/XML введен новый тип данных, называемый просто XML (а не XMLDOC, как было описано в разделе 27.6), значениями которого фактически являются документы XML или их фрагменты (здесь под термином "фрагмент"  подразумевается, например, отдельный элемент XML или последовательность таких элементов). Для формирования или "выработки" значений типа XML из обычных данных SQL предусмотрены различные операторы. Ниже приведен простой пример.

INSERT INTO RESULT ( XMLCOL) SELECT XMLGEN ( ‘<Result>

<SNAME>{SX.SNAME}</SNAME>

< PNAME>{PX.PNAME}</PNAME>

<QTY>{SPX.QTY}</QTY>

</Result>’,

SX.SNAME, PX.PNAME, SPX.QTY ) AS Result FROM S AS SX, P AS PX, SP AS SPX WHERE SX.SNUM = SPX.SNUM AND  PX.PNUM = SPX.PNUM ;

Здесь предполагается, что столбец XMLCOL таблицы RESULT относится к типу  XML. Аналогия между этим примером и первым примером запроса XQuery из раздела 27.5 не является простым совпадением. Она фактически означает, что  определение оператора XMLGEN почти наверняка изменится еще до того, как произойдет утверждение спецификации SQL/XML, поскольку определение этого оператора основано еще на одном предложении по дополнению языка XQuery, которое само ко времени написания этой книги все еще находилось "в процессе разработки".

Поэтому следует еще раз отметить, что в спецификации SQL/XML введен новый тип XML, но в ней не определено почти ни одной операции24 со значениями этого типа — не предусмотрена даже операция проверки на равенство! В [27.15] фактически сказано следующее: "Если оба значения, V1 и V2, относятся к типу XML, то проверка того, являются ли V1 и V2 идентичными или нет…, зависит от  реализации". Но такая ситуация, повидимому,  будет  исправлена  ко  времени  формального  утверждения  спецификации SQL/XML. А в [27.11] указано, что ко времени ее утверждения (или, возможно, спустя некоторое время) могут быть также дополнительно введены перечисленные ниже средства.

■     Поддержка "маскирующих" выражений для конструкций XPath или XQuery.

■     Возможность проверки того, является ли указанное значение типа XML формально правильным элементом XML или допустимым документом XML, соответствует ли оно некоторой заданной схеме XML и т.д.

Но даже после введения всех этих усовершенствований предусмотренный в спецификации SQL/XML доступ к данным XML все еще будет оставаться в основном предназначенным для обеспечения только чтения, а полноценный доступ будет по-прежнему от

Специализированные средства поддержки

Как было  отмечено  в  разделе  27.5,  в  некоторых  программных  продуктах  SQL (например, в таких СУБД, как DB2 и Oracle) уже предусмотрены  специализированные средства поддержки для выборки и обновления данных XML. Автор не ставил перед собой задачу излагать в данном разделе подробные сведения о конкретных программных продуктах, но здесь приведены некоторые гипотетические примеры, позволяющие показать, какого рода функциональные  средства обычно предоставляют эти программные продукты. Неформально  можно  отметить, что эти примеры основаны на программном продукте "XML Extender" компании IBM для СУБД DB2, но в них внесены упрощения для устранения таких особенностей, которые являются несущественными с точки зрения изложения темы данного раздела.

В программном продукте "XML Extender" используется предусмотренная в  языке SQL поддержка функций, определяемых пользователем (см. главу 5), для предоставления множества  функций,  которые  (с  точки  зрения  пользователя)  по  существу  являются встроенными функциями. Эти функции могут вызываться из кода SQL и предоставляют целый ряд возможностей по выборке и обновлению данных XML. В этом разделе будут показаны  функции  XMLFILETOCLOB,  XMLCONTENT, XMLEXTRACTREAL И  XMLUPDATE (это — не настоящие, а вымышленные имена функций). Возможности, предоставляемые этими функциями, описаны ниже.

■     Сохранение документа XML в виде значения столбца SQL.

Пример. В приведенном ниже предложении с оператором UPDATE, во-первых,

используется функция XMLFILETOCLOB для преобразования документа XML,

24  В спецификации определен оператор XMLSERIALIZE, который преобразует значение типа  XML в форму символьной строки. Кроме того, в  данной спецификации определен оператор  XMLPARSE для "выполнения обратного действия", т.е. для преобразования документа XML  или  фрагмента документа, представленного в виде символьной строки, в тип XML. Кроме всего  прочего, эти два оператора предоставляют определенную поддержку для разделения и публикации.

хранящегося  во  внешнем  файле  BoltDrawing.svg  в  тип  CLOB,  а  затем,   вовторых,  происходит  сохранение  полученной  строки  типа  CLOB  в  виде  значения столбца DRAWING в строке таблицы Р, относящейся к детали части  Р2, следующим образом.

UPDATE P

SET   DRAWING = XMLFILETOCLOB ( ‘BoltDrawing.svg’ ) WHERE PNUM = ‘P2′ ;

Безусловно,  здесь  предполагается,  что  таблица  р  действительно  включает  столбец

DRAWING и что этот столбец имеет тип CLOB.

■     Выборка подобного значения столбца SQL.

Пример.  В  приведенном  ниже  предложении  с  оператором  SELECT   выполняется выборка значения CLOB, записанного в предыдущем примере, и  его публикация в виде документа XML во внешнем файле RetrievedBoltDrawing. svg.

SELECT  XMLCONTENT   (   DRAWING,    ‘RetrievedBoltDrawing.svg’    ) FROM     P

WHERE    PNUM  =   ‘P2′   ;

■     Выборка указанного компонента документа XML.

Пример.  Снова  предположим,  что  документ  PartsRelation  хранится  в   файле PartsRelation.xml. В таком случае приведенное ниже предложение с  оператором UPDATE   позволяет,   во-первых,   извлечь   из   этого   документа   значение   WEIGHT, относящееся к детали РЗ, и преобразовать его в тип  REAL, а затем, во-вторых, сохранить это значение в качестве значения  столбца WEIGHT в строке таблицы р с данными о детали РЗ.

UPDATE P

SET   WEIGHT = XMLEXTRACTREAL

( ‘PartsRelation.xml’, ‘//PartTuple[PNUM = "P3"]/WEIGHT’ )

WHERE PNUM = ‘P3′ ;

Примечание. Здесь принято фиктивное предположение, что столбец WEIGHT таблицы Р имеет тип REAL, а не NUMERIC  (5 , 1 ),  поскольку программный  продукт "XML Extender" в настоящее время не поддерживает функцию "извлечения в виде значения NUMERIC". Еще более важным является такое замечание, что XMLEXTRACTREAL и другие функции "извлечения" могут применяться к документам XML, хранящимся в столбцах SQL, а не только к документам XML, хранящимся во внешних файлах.

■     Обновление указанного компонента документа XML.

Пример.  Примем  немного  нереальное  предположение,  что  таблица  SP  включает столбец  PARTDETAIL  типа  CLOB,  значением  которого  в  любой  заданной  строке является  документ  XML  с  описанием  рассматриваемой   детали.  В  таком  случае приведенное  ниже  предложение  с  оператором   UPDATE  устанавливает  значение компонента  COLOR  этого  документа  XML,  равное  Green  для  любой  детали,  поставляемой поставщиком S4.

UPDATE SP

SET   PARTDETAIL = XMLUPDATE ( PARTDETAIL,

‘//PartTuple/COLOR’, ‘Green’

) WHERE SNUM = ‘S4′ ;

27.1.  РЕЗЮМЕ

В этой главе рассматривается связь между языком XML и базами данных. Но для того чтобы подготовить почву для такого изложения, необходимо было рассмотреть целый ряд дополнительных тем, поэтому в данной главе вначале кратко описана система World Wide Web, а затем приведены гораздо более подробные сведения о языке ХМ L как таковом.

Язык XML был определен на основе раннее созданных языков SGML и HTML; имя

"XML" является сокращением от "Extensible Markup Language" (расширяемый язык разметки), но (как и SGML) XML фактически является метаязыком или даже  "метаметаязыком". Конкретным приложением XML (т.е. языком, производным от XML, согласно определению, приведенному в начале этой главы) является  язык,  предназначенный для определения документов XML некоторого особого  рода (например, документов PartsRelation). Первоначально язык XML не имел ничего общего с базами данных; вместо этого он был предназначен просто для обеспечения "передачи, приема и обработки универсальных документов SGML в системе Web с применением таких способов, которые в настоящее время  возможны благодаря использованию языка HTML" [27.25]. Безусловно, нельзя  оспаривать необходимость хранить данные XML в базах данных и манипулировать с ними с помощью СУБД. Но на основании этого факта некоторые специалисты пришли к выводу, что язык XML должен стать основой технологии баз данных как таковой.

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

В основе любого конкретного документа XML лежит абстрактная структура, называемая  инфонабором,  с  которой  могут  проводиться  манипуляции  с  помощью  APIинтерфейса, называемого объектной моделью документа, и на базе которой могут выполняться запросы с использованием языка XQuery. В отношении документов XML иногда приходится также встречать утверждение, что они соответствуют слабоструктурированной модели данных, но фактически документы XML структурированы не в меньшей и не в большей степени, чем отношения; в  действительности, автор не видит существенного различия между слабоструктурированной моделью и старой иерархической моделью (по крайней мере, с точки зрения структурных особенностей этих моделей).

Любой конкретный документ XML является формально правильным по определению.

Он может быть также допустимым; под этим подразумевается, что он соответствует некоторому заданному определению типа документа (Document Type Definition — DTD). Правила написания определений DTD являются составной частью стандарта XML (фактически любое определение DTD представляет собой определение некоторого языка, производного от

XML). Но определения DTD характеризуются целым рядом недостатков, в частности, они лишь в очень небольшой степени обеспечивают поддержку  ограничений целостности. Язык XML Schema— это метаязык, поддерживающий формирование схем XML, которые могут использоваться для создания более строгих и более подробных описаний документов XML (в частности,  применительно к типам данных, хотя рассматриваемые типы едва ли можно считать настоящими типами в том смысле, какой был указан в главе 5). Процесс  контроля того, соответствует ли конкретный документ XML заданной схеме XML, называется проверкой по схеме.

Далее, в данной главе рассматривались языки XQuery и XPath (второй из них является строгим подмножеством первого), которые предоставляют доступ только  для чтения к данным XML, или, что более точно, к абстрактной или синтаксически проанализированной форме таких данных (т.е., по существу, к инфонабору). Здесь не была предпринята попытка подробно описать какой-либо из этих языков, но приведено несколько примеров, позволяющих получить определенное  представление о том, какие действия могут осуществляться с их помощью. В этой  главе были описаны обозначения пути, которые фактически позволяют  пользователю переходить  вдоль некоторого указанного пути в инфонаборе к некоторой намеченной цели. Кроме того, показано, какую важную роль в таких  выражениях выполняет понятие текущего положения, и поставлена под вопрос необходимость применения такого средства (безусловно, им определяется общий процедурный "внешний вид" и языка Xpath, и языка XQuery, а именно к процедурному подходу, применяемому в этих языках, автор относится довольно критически). Затем было отмечено, что язык XPath фактически представляет  собой просто схему адресации, поскольку он может использоваться для перемещения по существующим узлам в иерархии, но не позволяет создавать новые узлы (для этого требуется языкХQuегу).

После этого был представлен ряд примеров применения языка XQuery, в которых, в частности, иллюстрировалось использование выражений FLWOR (FLWOR — сокращение от for + let + where + order by + return). В связи с этим была  проведена аналогия между такими выражениями, а также, во-первых, выражениями реляционного

исчисления и, во-вторых, вложенными циклами обычных языков программирования; на основании этого был сделан вывод, что вторая из  указанных аналогий является более подходящей, чем первая. Кроме того, было затронуто несколько вопросов, касающихся

оптимизации. Наряду с этим, было отмечено отсутствие в языке XQuery какой-либо явной поддержки операций соединения (как было и в первоначальной версии языка SQL).

На следующем этапе были описаны три перечисленных ниже способа, которые могут применяться для хранения документа XML в базе данных.

1.         Применение "столбца XML". Может быть предусмотрено хранение всего документа в виде значения некоторого атрибута определенного кортежа. Для реализации этого подхода требуется создание нового типа данных, скажем, XMLDOC (безусловно, ос нащенного операциями, предназначенными для работы со значениями и пере менными этого типа).

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

Примечание. Процедура, обратная разделению (т.е. преобразование данных, отличных от XML, в форму XML), называется публикацией. Процедуры разделения и

публикации могут рассматриваться как способ создания представлений XML для данных, отличных от XML (процедура публикации обеспечивает поддержку операции выборки, а процедура разделения — поддержку операции обновления).

3.       Применение специализированной базы данных. Может быть предусмотрено хранение документа собственно в базе данных XML (т.е. в базе данных, которая содержит документы XML как таковые, а не отношения).

В данной главе описаны преимущества и недостатки этих подходов.

Наконец, была кратко описана спецификация SQL/XML (которая, по-видимому, будет окончательно включена в стандарт SQL, рабочая версия которого выпушена в 2003 году). В спецификации SQL/XML предусмотрена поддержка публикации данных SQL в

форме XML (хотя, по мнению автора, такая поддержка не совсем оправдана). Кроме того, в этой спецификации введен новый тип данных, называемый XML, значениями которого являются документы или фрагменты XML; тем самым предусмотрена возможность

хранить данные XML в столбцах SQL, но в этой спецификации предусмотрено лишь немного операций для работы с такими данными. Глава завершается кратким описанием поддержки XML в программных продуктах специального  назначения на примере поддержки, предусмотренной для СУБД DB2.

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии