Август/Сентябрь 2003


Тема номера: Объектно-реляционная технология Oracle9i


Шон Диллон

XML: к CLOB или к объектам?
(XML: To CLOB or Object?
By Sean Dillon)

Источник: журнал Oracle Magazine, no.4, 2003, http://otn.oracle.com/oramag/oracle/03-jul/o43xml.html

Выберите, когда в XML DB следует хранить CLOB, а когда - объекты.

В журнале Oracle Magazine (январь/февраль 2003 г. http://otn.oracle.com/oramag/oracle/03-jan/o13xml.html) Джонатан Генник (Jonatan Gennick) написал об XML DB и объяснил некоторые из ее возможностей, предлагаемых в Oracle9i Database Release2. Генник упоминал о двух различных архитектурах хранения нового типа данных – XMLType – CLOB (большие символьные объекты) и структурированный (или объектно-реляционный). В Oracle9i Database Release1 единственным вариантом хранения данных XML было хранение в формате CLOB. Теперь вOracle9i Database Release2 появился еще один вариант хранения XML – в объектно-реляционном виде, согласно структуре вашей XML Schema.

Так почему же следует делать выбор и предпочитать один способ хранения другому? Как всегда, ответом на этот вопрос будет ставшая очень популярной фраза: "Это зависит от целого ряда обстоятельств" [в тексте “It depends” – прим. ред.]. В документе Oracle9i XML Database Developer Guide Oracle – XML DB (руководство разработчиков баз данных Oracle9i XML) – Oracle9i намечает некоторые предварительные принципы того, какие возможности вы можете найти в вашем хранилище XML. В четвертой главе этого руководства, которая называется "Использование XMLType", содержится раздел, получивший название "Аргументы "за" и "против" вариантов хранения в формате XML (XML Storage Options) в Oracle XML DB". В разделе содержится информация, показанная в Таблице 1.

В Таблице 1 предлагаются некоторые общие руководящие принципы, каким механизмо хранения вы должны пользоваться в зависимости от поведения вашего приложения. В этой статье я постараюсь количественно определить некоторые из принципов, предлагаемых в Таблице 1. Я также рассмотрю некоторые из тех вещей, которые вы можете (и не можете) сделать в зависимости от выбранной вами архитектуры хранения.

Образцы данных, с которыми мы будем работать

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

Набор документов № 1: XML в XML Schema, применяющей объектные типы для хранения данных в объектно-реляционном виде.

Набор документов № 2: Хранение XML в другом, нежели XML Schema, виде, что по умолчанию подразумевает их хранение как CLOB.

Вы можете получить эти демонстрационные данные в файле http://asktom.oracle.com/~sdillon/xml/samplexml.zip.

Регистрация XML Schema

Мне требуется зарегистрировать XML Schema в базе данных, чтобы создать SQL-типы и таблицы, в которых будет храниться содержимое моих XML-документов. Есть множество способов зарегистрировать XML Schema в базе данных Oracle, но для моего примера я хочу использовать BFILE.

Я распаковал в мой каталог /tmp файл samplexml.zip, из которого извлек в каталог /tmp/xml XML Schema и все образцы данных, которые были нужны мне для испытаний (вместе со связанными подкаталогами). Для того, чтобы прочесть XML Schema из файловой системы и впоследствии зарегистрировать ее в XML DB, я использовал следующий код:

SQL> create directory xmldir as '/tmp/xml';

Directory created.

SQL> declare
  2    l_bfile bfile;
  3  begin
  4    l_bfile := bfilename(
                    'XMLDIR', 'po.xsd');
  5    dbms_lob.open(l_bfile);
  6    dbms_xmlSchema .registerSchema (
  7     'http://asktom.oracle.com/
         ~sdillon/xsd/purchaseOrder.xsd',
  8       l_bfile);

  9    dbms_lob.close(l_bfile);
 10  end;
 11  /
PL/SQL procedure successfully completed.

Теперь XML Schema зарегистрирована, но что более важно, создана таблица и объекты, используемые для хранения XML в соответствии с этой XML Schema. Давайте рассмотрим XML Schema подробнее. Я могу описать объекты, которые были созданы в течение процесса регистрации XML Schema, как показано в Листинге 1.

Если я сравню элементы типа PurchaseOrderType с объектным типом SQL XDBPO_TYPE, я увижу, что каждый элемент отображается или скалярным значением, или другим объектным SQL-типом (в случае элемента, являющегося сложным типом). Это указывает на то, что Oracle генерирует объектные SQL-типы, базируясь на структуре XML Schema! Следующий задаваемый нами логический вопрос звучит так: как Oracle узнает, что требуется создать для сохранения моего XML?

Атрибуты XML Schema DB

XML Schema используется в Oracle9i XML DB не только для проверки правильности XML- документов, но и для того, чтобы диктовать, как в базе данных хранится содержание этих документов. При регистрации моей XML Schema Oracle создает таблицу PURCHASEORDER, которая отвечает за хранение контента (содержания) моих XML-документов. Атрибуты XML DB Schema помогают администраторам и разработчикам решать, как эта память будет структурирована. Я могу, например, определить имена объектных SQL-типов или имена таблиц, куда будет загружен контент XML. Скажем, я могу установить следующие атрибуты:

  • DefaultTable. Он определяет имя таблицы, в которой будет сохранен XML.
  • SQLName. Он определяет имя атрибута того объекта, на который будет отображен этот элемент XML.
  • SQLType. Он определяет имя SQL-типа, соответствующего этому элементу XML.
  • SQLSchema. Он определяет имя пользователя базы данных, который будет владеть SQLType.
  • MaintainDOM. Если этот атрибут имеет значение TRUE, при хранении XML будет поддерживаться точность DOM (DOM fidelity). Это означает, что вместе с порядком элементов в документе будут сохранены такие вещи, как комментарии, команды обработки и объявления пространства имен. Это должно служить гарантией, что возвращаемые XML- документы будут идентичны оригинальным XML-документам для обходов DOM.

Аннотации XML DB делают возможными перекрытие определенных значений атрибутов элементов и отображений XML между типами данных XML Schema и типами данных SQL. Я использовал множество таких аннотаций в моем файле purchaseOrder.xsd. Ниже приведены некоторые из атрибутов, при использовании которых будут созданы аннотации и даны инструкции базе данных Oracle9i о том, как сохранить данные:

n	<xs:Schema  xmlns:xs="http://www.w3. org/2001/XMLSchema " 
xmlns:xdb="http:// xmlns:oracle.com/xdb" version="1.0" 
xdb:storeVarrayAsTable="true"> 

Это – объявление пространства имен для атрибутов XML DB, которые я собираюсь добавить. Обратите внимание на атрибут storeVarrayAsTable. Он установлен в TRUE, потому что я хочу, чтобы совокупности элементов хранились в таблице в виде, который известен как упорядоченная совокупность (Ordered Collection).

n	<xs:element name="PurchaseOrder" type="PurchaseOrderType" 
xdb:defaultTable="PURCHASEORDER"/> 

XML-документы, достоверность которых проверяется по purchaseOrder.xsd, будут сохранены в таблице PURCHASEORDER.

n	<xs:complexType name=
"PurchaseOrderType" xdb:SQLType= "XDBPO_TYPE">
E-mail this page