
Август/Сентябрь 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">
|