Хранение данных XML в базе данных - многие таблицы и дамп XML в столбце - PullRequest
7 голосов
/ 14 июля 2011

Я хочу сохранить XML, полученный в моем веб-сервисе java.Отчеты будут запускаться каждые 5 минут для извлечения некоторых данных из элементов xml.

Я подумал о двух подходах к решению этой проблемы.

  1. Создание нескольких таблиц в базе данныхзахватить данные XML.В основном каждый элемент будет иметь свой собственный столбец в базе данных.

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

Какой из вышеперечисленных подходов лучше, особенно с точки зрения производительности?Это очень важно, поскольку отчеты будут создаваться с очень высокой частотой (каждые 5 минут).

Схема xml довольно сложна и не проста.

Ответы [ 6 ]

9 голосов
/ 14 июля 2011

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

Конечно, как и все вопросы производительности, ваш пробег может варьироваться, поэтому его стоит протестировать.Если вы используете Oracle 11.2 и сохраняете данные в виде двоичного XML (в этом случае они сохраняются после анализа) и вы создаете соответствующие XMLIndexes для сохраняемых вами типов XML, снижение производительности при оставлении данных в документе XML может бытьдовольно маленький.Это все равно должно быть медленнее, чем правильная реляционная структура, но эта разница не может быть для вас значимой.

Лично я предпочел бы подход с реляционным хранилищем вообще, даже игнорируя проблемы с производительностью, потому что он облегчает другимвзаимодействовать с данными.Существует гораздо больше разработчиков, которые могут писать приличный SQL, чем могут написать приличные выражения XPath, и гораздо больше инструментов запросов, которые могут генерировать отчеты из реляционных таблиц, чем генерировать отчеты из XML, хранящегося в базе данных.

5 голосов
/ 14 июля 2011

Maximus, Это действительно зависит от того, что вы хотите сделать с данными XML.

Когда я использую XML для целей управления, таких как настройка отображения страницы, я сохраню весь XML в одном поле BLOB. Это быстро и очень просто. Это простая процедура сохранения и загрузки. Вы можете легко просмотреть XML в поле BLOB и отредактировать его.

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

4 голосов
/ 14 июля 2011

Adhoc Access

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

Ограниченный доступ

Если вы просто храните данные и доставляете их на основе некоторых других критериев, таких как уникальный идентификатор или другой ключ, а XML по сути является непрозрачным BLOB, просто сохраните его в столбце BLOB и покончено с этим.

Гибридная модель

Вам, вероятно, понадобится что-то среднее: XML хранится в BLOB, а в Tables и Columns сохраняются только соответствующие биты, что позволяет эффективно искать полезную нагрузку XML.

1 голос
/ 14 июля 2011

Если вам нужно сохранить и запросить более пары XML-документов, вам следует использовать базу данных XML.

eXist - это хорошо, хранить эти xmls в столбце или не соглашаться с нимиво многих таблицах это плохой вариант я думаю ..

1 голос
/ 14 июля 2011

Не зная немного больше, трудно сказать наверняка, но, скорее всего, вам не хватает одной важной части, которая может значительно упростить жизнь.

  1. Привязка из XML к POJO (JAXB, MOXyили JibX)
  2. Хранить как нормализованные столбцы из POJO (используйте jDBI, Hibernate или даже простые шаблоны JDBC)

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

0 голосов
/ 23 июля 2014

Вы также можете проверить тип столбца XMLData, который находится в Sqlserver или Xml Type в Oracle http://msdn.microsoft.com/en-us/library/hh403385.aspx

Вы можете создать вычисляемые столбцы в столбце данных xml для тех полей XML, которые запрашиваются наиболеепоможет в более быстрых поисках.Чтобы получить определенное значение в определенном xpath, вам просто нужно передать xpath в sqlserver, чтобы он возвратил вам значение в этом xpath.

...