Что использовать для хранения сериализованных данных, которые можно запрашивать? - PullRequest
1 голос
/ 04 марта 2011

Мне нужно извлечь данные из входящего сообщения, которые могут быть в любом формате. Извлеченные данные для хранения также зависят от формата, т. Е. Формат A может извлекать поля X, Y, Z, но формат B может извлекать поля A, B, C. Мне также необходимо просмотреть сообщение B путем поиска поля C внутри сообщение.

Сейчас я настраиваю и сохраняю стратегию извлечения (XSLT) и выполняю ее во время выполнения, когда встречается связанный с ней формат, но я храню извлеченные данные в базе данных Oracle в виде столбца XmlType. У Oracle, похоже, довольно слабая разработка / поддержка XmlType, так как для этого требуется старый jar, который заставляет вас использовать довольно старый DOM DocumentBuilderFactory impl (выглядит как код Java 1.4), который вступает в противоречие с Spring 3, и не играть очень хорошо с Hibernate. Запросы XML медленные и не интуитивно понятные.

Я пришел к выводу, что Oracle с XmlType не очень хороший способ хранения извлеченных данных, поэтому мой вопрос: каков наилучший способ хранения сериализованных / запрашиваемых данных?

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Одна альтернатива, которую вы не перечислили, - это использование XML Database . (Обратите внимание, что Oracle является одним из десяти или около того продуктов баз данных XML.)

(Очевидно, что тип BLOB-объекта не позволит запрашивать «внутри» сохраняемых объектов XML, если вы не прочитаете каждый экземпляр BLOB-объекта в память и не выполните запрос там; например, с помощью XSLT.)

1 голос
/ 04 марта 2011

Я имел большой успех в хранении сложных объектов XML в PostgreSQL. Вместе с функциями функциональных индексов вы даже можете создавать индексы для значений узлов хранимых файлов XML и использовать эти индексы для очень быстрого поиска с использованием сканирования индекса без необходимости повторного анализа файла XML.

Это, однако, будет работать, только если вы знаете шаблоны запросов, произвольные запросы xpath также будут медленными.

Пример (непроверенный, содержит синтаксические ошибки наверняка):

Создать простую таблицу:

create table test123 (
    int serial primary key,
    myxml text
)

Теперь давайте предположим, что у вас есть XML-документы, такие как:

<test>
    <name>Peter</name>
    <info>Peter is a <i>very</i> good cook</info>
</test>

Теперь создайте индекс функции:

create index idx_test123_name on table123 using xpath(xml,"/test/name");

Теперь вы быстро ищите в XML:

SELECT xml FROM test123 WHERE xpath(xml,"/test/name") = 'Peter';

Вам также следует подумать о создании индекса с использованием text_pattern_ops, чтобы у вас был быстрый поиск префиксов, например:

SELECT xml FROM test123 WHERE xpath(xml,"/test/name") like 'Pe%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...