用什么来存储可查询的序列化数据?

时间:2011-03-04 05:57:58

标签: java database nosql

我需要从可以采用任何格式的传入消息中提取数据。要存储的提取数据也取决于格式,即格式A可以提取字段X,Y,Z,但格式B可以提取字段A,B,C。我还需要通过搜索字段C来查看消息B.消息。

现在我正在配置和存储提取策略(XSLT)并在遇到相关格式时在运行时执行它,但我将提取的数据作为XmlType列存储在Oracle数据库中。 Oracle似乎对XmlType的开发/支持非常宽松,因为它需要一个旧的jar,它迫使你使用一个非常古老的DOM DocumentBuilderFactory impl(看起来像Java 1.4代码),它与Spring 3相撞,而且与Hibernate的搭配并不是很好。 XML查询也很慢且不直观。

我得出的结论是,使用XmlType的Oracle并不是存储提取数据的好方法,所以我的问题是,存储序列化/可查询数据的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您未列出的一个替代方案是使用XML Database。 (请注意,Oracle是十种左右的XML数据库产品之一。)

(显然,blob类型不允许查询持久化XML对象的“内部”,除非您将每个blob实例读入内存并在那里进行查询;例如使用XSLT。)

答案 1 :(得分:1)

我在PostgreSQL中存储复杂的xml对象方面取得了很大的成功。与功能索引功能一起,您甚至可以在存储的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%';