Столбцы и типы XML-данных (SQL Server)
В этом разделе описаны преимущества и ограничения типа данных xml в SQL Server, а также сведения, помогающие выбрать способ хранения XML-данных.
Модель данных: реляционная или XML
Если данные хорошо структурированы и известна их схема, то для их хранения наверняка лучше всего подойдет реляционная модель. В SQL Server предусмотрены все необходимые для этого средства и функции. С другой стороны, если данные структурированы частично, не структурированы или если их структура неизвестна, следует подумать о моделировании таких данных.
XML является удачным выбором, если нужна не зависящая от платформы модель, позволяющая гарантировать совместимость данных за счет применения структурной и семантической разметки. Кроме того, этот вариант уместен, если выполняются некоторые из следующих условий:
данные разрежены, их структура неизвестна или их структура может значительно измениться в будущем;
данные представляют иерархию контейнеров, а не ссылки между сущностями, и могут быть рекурсивными;
данные упорядочены;
требуется запрашивать данные или обновлять их фрагменты на основе их структуры.
Если ни одно из этих условий не выполняется, следует выбрать реляционную модель данных. Например, если данные представлены в формате XML, но приложение пользуется базой данных только для их хранения и извлечения, то для этого вполне подойдет тип данных [n]varchar(max). Хранение данных в XML-столбце обеспечивает дополнительные преимущества. В их число входят проверка структуры и правильности данных, а также поддержка детализированных запросов и обновлений XML-данных.
Причины хранения XML-данных в SQL Server
Ниже приведены некоторые условия, при которых лучше использовать собственные XML-функции SQL Server, а не управлять XML-данными, хранящимися в файловой системе.
Требуется эффективно распространять, запрашивать и изменять свои XML-данные на основе транзакций. Большое значение имеет высокая детализация доступа к данным. Например, иногда нужно извлекать некоторые разделы XML-документа или вставлять в него новые разделы без замены всего документа.
Предстоит иметь дело с реляционными и XML-данными, и необходимо обеспечить их совместимость в приложении.
Необходима языковая поддержка запросов и модификации данных в приложениях, охватывающих несколько доменов.
Требуется, чтобы сервер гарантировал верность структуры данных и, возможно, проверял данные в соответствии с XML-схемами.
Требуется проиндексировать XML-данные для оптимизации обработки запросов и улучшения масштабируемости и использовать эффективный оптимизатор запросов.
Требуется обращаться к XML-данным, используя технологии SOAP, ADO.NET и OLE DB.
Требуется использовать для управления XML-данными средства администрирования, реализованные в сервере баз данных. Примерами таких задач управления могут служить резервное копирование данных, их восстановление и репликация.
Если же ни одно из этих условий не выполняется, то для хранения данных лучше использовать отличный от XML тип больших объектов (например, [n]varchar(max) или varbinary(max)).
Варианты хранения XML-данных
SQL Server поддерживает несколько вариантов хранения XML-данных.
Естественное хранение в виде типа xml
Данные при этом хранятся во внутреннем представлении, которое обеспечивает неизменность XML-содержимого данных. Это внутреннее представление включает в себя сведения об иерархии контейнеров, порядке документов и значений элементов и атрибутов. Точнее говоря, при этом обеспечивается неизменность InfoSet-содержимого XML-данных. Сведения о спецификации InfoSet можно найти по адресу: http://www.w3.org/TR/xml-infoset. InfoSet-содержимое не всегда идентично текстовым XML-данным, потому что следующая информация при этом не сохраняется: несущественные пробелы, порядок атрибутов, префиксы пространств имен и XML-декларация.
Для типизированного (то есть связанного с XML-схемой) типа данных xml модуль проверки после обработки схемы (PSVI) добавляет в информационный набор данные о типах и кодирует их во внутреннее представление. Это значительно ускоряет синтаксический анализ. Дополнительные сведения см. в спецификациях XML-схем, разработанных консорциумом W3C XML. Найти их можно по адресам http://www.w3.org/TR/xmlschema-1 и http://www.w3.org/TR/xmlschema-2.
Сопоставление XML-данных и данных, хранящихся в реляционном формате
Используя аннотированную схему (AXSD), можно разбить XML на столбцы одной или нескольких таблиц. Это обеспечивает правильность данных на реляционном уровне. В результате гарантируется сохранность иерархической структуры данных, хотя порядок элементов не учитывается. Схема не может быть рекурсивной.
Хранение больших объектов, [n]varchar(max) и varbinary(max)
При этом хранится идентичная копия данных. Это полезно в приложениях специального назначения, например в приложениях, обрабатывающих юридическую документацию. Большинству приложений точная копия данных не нужна — им хватает XML-содержимого (правильности элементов InfoSet).
Обычно используется сочетание этих подходов. Например, XML-данные можно сохранить в столбце типа xml, производя продвижение его свойств до уровня реляционных столбцов. Или же можно использовать технологию сопоставления для хранения нерекурсивных фрагментов в столбцах, отличных от XML, а в столбцах типа xml хранить только рекурсивные фрагменты.
Выбор XML-технологии
Выбор между естественным форматом XML и XML-представлениями обычно зависит от следующих факторов.
Параметры хранения
Иногда XML-данные (например, руководство по продукции) лучше хранить как большой объект, а в других ситуациях — в реляционных столбцах (например, описание товара, преобразованное в формат XML). Каждый вариант хранения данных обеспечивает точность документа в разной степени.
Обработка запросов
Иногда один вариант хранения данных лучше другого соответствует природе и интенсивности запросов XML-данных. Степень поддержки детализированных запросов XML-данных, например оценки предикатов для XML-узлов, поддерживается двумя технологиями хранения данных в разной степени.
Индексирование XML-данных
Возможно, потребуется проиндексировать XML-данные, чтобы ускорить обработку XML-запросов. Возможности индексирования зависят от технологии хранения данных; для оптимизации рабочей нагрузки нужно выбрать более подходящий вариант.
Возможности модификации данных
Некоторые виды рабочей нагрузки сопряжены с детализированной модификацией XML-данных. Это может требоваться, например, при добавлении нового раздела в документ, в то время как при решении других задач, таких как обработка веб-содержимого, это не нужно. Для разработчиков того или иного приложения большое значение может иметь поддержка языка модификации данных.
Поддержка схем
XML-данные можно описать при помощи схемы, которая может быть, а может и не быть документом XML-схемы. Поддержка связанных со схемой XML-данных зависит от XML-технологии.
Кроме того, технологии хранения XML-данных различаются по быстродействию.
Хранение XML-данных в собственном формате
XML-данные можно хранить на сервере в столбце типа xml. Этот вариант уместен, если выполняются следующие условия:
необходим простой способ хранения XML-данных на сервере, при этом нужно сохранить порядок и структуру документа;
существует вероятность отсутствия схемы XML-данных;
требуется запрашивать и изменять XML-данные;
требуется проиндексировать XML-данные для ускорения обработки запросов;
требуется использовать в приложении представления системного каталога для управления XML-данными и XML-схемами.
Механизм хранения XML-данных в естественном формате полезен, если есть XML-документы, имеющие разную структуру, или XML-документы, соответствующие разным или сложным схемам, которые слишком трудно сопоставить с реляционными структурами.
Пример: моделирование XML-данных с использованием типа данных xml
Допустим, мы имеем дело с руководством по продукции в формате XML, которое охватывает ряд тем, разделенных на несколько глав, включающих по несколько разделов. Раздел может содержать подразделы. Таким образом, элемент <section> является рекурсивным. Руководства по продукции содержат большой объем смешанной информации, диаграмм и технических характеристик; эти данные структурированы частично. Пользователям руководств может пригодиться возможность контекстного поиска интересующих их тем, например подраздела «кластеризованный индекс» в разделе «индексирование», и запроса технических характеристик.
Для хранения таких XML-документов прекрасно подходит столбец типа xml. Это позволяет сохранить InfoSet-содержимое XML-данных. Индексирование XML-столбца позволяет повысить эффективность обработки запросов.
Пример: сохранение точных копий XML-данных
Предположим, что правительственные законы требуют, чтобы хранились точные текстовые копии XML-документов. К этой категории могут относиться подписанные документы, юридические постановления и отчеты о биржевых операциях. Такие данные можно хранить в столбце типа [n]varchar(max).
При обработке запросов во время выполнения преобразуйте данные в тип xml и выполните для них запрос XQuery. Преобразование типов в период выполнения может быть связано со значительной тратой ресурсов, особенно если документ велик. При высокой частоте запросов документы можно дополнительно сохранять в столбце типа xml и индексировать именно его, а для возврата точных копий документа использовать столбец [n]varchar(max).
XML-столбец может быть столбцом, вычисляемым на основе столбца [n]varchar(max). Однако для вычисляемого XML-столбца, а также для столбцов типов [n]varchar(max) или varbinary(max) нельзя создать XML-индекс.
Технология XML-представлений
Определив соответствие между XML-схемами и таблицами базы данных, можно создать «XML-представление» хранимых данных. Чтобы заполнить базовые таблицы при помощи XML-представления, можно использовать операцию массовой загрузки XML-данных. Запрашивать XML-данные можно при помощи технологии XPath версии 1.0, при этом запрос преобразуется в SQL-запросы таблиц. Обновления также распространяются на эти таблицы.
Эта технология полезна в следующих ситуациях:
требуется реализовать ориентированную на XML модель программирования, используя XML-представления существующих реляционных данных;
есть XSD-схема или XDR-схема XML-данных, которую, возможно, предоставила внешняя партнерская организация;
порядок данных не важен, данные таблиц нерекурсивны или максимальная глубина рекурсии не известна заранее;
требуется запрашивать и изменять данные посредством XML-представления с использованием технологии XPath версии 1.0;
требуется выполнять массовую загрузку XML-данных и распределять их между базовыми таблицами с использованием XML-представления.
Примерами данных, отвечающих этим условиям, могут служить реляционные данные, предоставляемые веб-службам и средствам обмена данными в форме XML, а также XML-данные с фиксированной схемой. Дополнительные сведения см. в библиотеке MSDN Online.
Пример: моделирование данных с использованием аннотированной XML-схемы (AXSD)
Предположим, что есть реляционные данные (например, сведения о заказчиках, заказах и товарах), которые нужно обрабатывать как XML. Определите в этом случае XML-представление, применив схему AXSD к реляционным данным. XML-представление позволяет выполнять массовую загрузку XML-данных в таблицы, а также запрашивать и обновлять реляционные данные. Эта модель особенно эффективна, если требуется обмениваться данными, содержащими XML-разметку, с другими приложениями без приостановления работы приложений SQL.
Комбинированная модель
Довольно часто для моделирования данных лучше всего подходит комбинация реляционных столбцов и столбцов типа xml . Некоторые значения XML-данных можно хранить в реляционных столбцах, а остальные или все значения XML — в XML-столбце. Это может привести к повышению производительности за счет более полного контроля над индексами, созданными для реляционных столбцов, и параметрами блокировки.
Значения, которые следует хранить в реляционных столбцах, зависят от рабочей нагрузки. Например, если извлекаются все XML-значения при использовании выражения пути /Customer/@CustId, то, выполнив продвижение значения атрибута CustId до реляционного столбца и осуществив его индексацию, можно ускорить обработку запросов. С другой стороны, если XML-данные чрезмерно распределить по реляционным столбцам без дублирования, составление данных в единое целое может оказаться слишком дорогим.
В случае высокоструктурированных XML-данных, таких как содержимое таблицы, преобразованное в XML, можно сопоставить все значения с реляционными столбцами и, возможно, использовать технологию XML-представлений.
Гранулярность XML-данных
Гранулярность XML-данных, хранимых в XML-столбце, очень важна при блокировках и, в меньшей степени, при обновлениях. В SQL Server используются одинаковые механизмы блокировки для XML-данных и данных, отличных от XML. Таким образом, при блокировке на уровне строки блокируются все экземпляры XML в строке. Если гранулярность велика, блокировка крупных экземпляров XML для выполнения обновлений сокращает производительность системы в многопользовательской среде. С другой стороны, при чрезмерной декомпозиции утрачивается инкапсуляция объекта и возрастают накладные расходы, связанные с воссозданием данных.
Чтобы создать эффективную систему, нужно достичь баланса между требованиями к моделированию данных и характеристиками блокировок и обновлений. Однако в SQL Server размер хранимых экземпляров XML имеет не такое большое значение.
Например, обновления экземпляра XML выполняются с использованием нового способа частичного обновления больших двоичных объектов (BLOB) и индексов, при котором существующий хранимый экземпляр XML сравнивается с его обновленной версией. При частичном обновлении большого двоичного объекта выполняется разностное сравнение двух экземпляров XML и обновляются только различающиеся данные. При частичном обновлении индекса изменяются только те строки XML-индекса, которые этого требуют.
Ограничения типа данных xml
Обратите внимание, что на тип данных xml накладываются следующие ограничения.
Размер хранимого представления экземпляра типа данных xml не должен превышать 2 ГБ.
Данный тип не может быть использован в качестве подтипа экземпляра sql_variant .
Приведение или преобразование к типам text или ntext не поддерживается. Вместо этого используются типы varchar(max) или nvarchar(max).
Сравнение и сортировка не допускаются. Это значит, что данные типа xml не могут использоваться в предложении GROUP BY.
Не может использоваться в качестве параметров любых скалярных встроенных функций, кроме ISNULL, COALESCE и DATALENGTH.
Не может использоваться как ключевой столбец индекса. Однако может включаться в виде данных в кластеризованный индекс или явно добавляться в некластеризованный индекс при его создании с помощью ключевого слова INCLUDE.
См. также
Основные понятия
Примеры массового импорта и экспорта XML-документов (SQL Server)