在数据库中存储XML数据 - 许多表与在列中转储xml

时间:2011-07-13 21:28:46

标签: java xml oracle xsd xmltype

我想存储我在java web服务中收到的xml。 报告将每隔5分钟运行一次,以便在xml元素中提取一些数据。

我想到了解决这个问题的两种方法。

  1. 在数据库中创建多个表以捕获xml数据。 基本上每个元素在数据库中都有自己的列。

  2. 将整个xml转储到可以存储xml数据的列中。 出于报告目的,在查询本身中解析该值。

  3. 上述哪种方法更好, 特别是在性能方面?这是至关重要的,因为报告将以非常高的频率(每5分钟)生成。

    xml架构非常复杂,并不简单。

6 个答案:

答案 0 :(得分:9)

如果要编写一次数据并多次查询,那么解析XML文档一次,将数据存储在适当的关系模式中并查询关系模式几乎肯定会更有效。解析XML并不便宜,因此每5分钟解析一次可能多个XML文档的开销可能很大。

当然,和所有性能问题一样,您的里程可能会有所不同,因此可能值得测试。如果您使用的是Oracle 11.2,并且您将数据存储为二进制XML(在这种情况下它将在解析后存储),并且您在存储的XMLTypes上创建了适当的XMLIndexes,则将数据保留在XML文档中的性能损失可能是相当小。它应该比适当的关系结构慢,但差异可能对你没有意义。

就个人而言,我更喜欢关系存储方法,甚至忽略性能问题,因为它使其他人更容易与数据交互。有更多的开发人员可以编写体面的SQL而不是编写合适的XPath表达式,并且有更多的查询工具可以从关系表生成报告,而不是从存储在数据库中的XML生成报告。

答案 1 :(得分:5)

鲆, 这实际上取决于你想用XML数据做什么。

当我使用XML进行控制时,例如配置页面的显示方式,我会将整个XML存储在一个BLOB字段中。它快速而且非常简单。这是一个简单的保存和加载例程。您可以在BLOB字段中轻松查看XML并进行编辑。

如果您需要搜索或报告XML内部的值,例如有多少客户具有特定属性,您可能希望解析为单个属性。这通常意味着您必须进行一些预处理和后期处理,但允许您快速获取单个属性。

答案 2 :(得分:4)

Adhoc Access

如果您需要以adhoc或任意方式对XML中包含的数据运行高效查询,则应将其解析为TablesColumns,它们在逻辑上可以是索引并加入。< / p>

限制访问

如果您只是存储数据,并根据其他标准(例如唯一ID或其他密钥)提供数据,并且XML本质上是不透明的BLOB,那么只需将其存储在BLOB中}列并完成它。

混合模式

您可能需要的是两者之间的内容,其中XML存储在BLOB中,只有相关位存储在TablesColumns中,因此您可以搜索XML有效载荷。

答案 3 :(得分:1)

不知道更多,很难肯定,但很可能你错过了一个可以简化生活的重要部分。

  1. 从XML绑定到POJO(JAXB,MOXy或JibX)
  2. 从POJO存储为规范化列(使用jDBI,Hibernate,甚至是简单的JDBC模板)
  3. 此外,根据您生成的报告类型,可能会考虑将数据保留在内存中的可能性 - 每5分钟听起来不像性能关键,但是再次持久性并不总是需要(或者仅仅是历史记录)数据或备份)。

答案 4 :(得分:1)

如果您需要保留和查询多个xml文档,则应使用XML数据库..

eXist很好,将这些xml保留在列中或者在许多表中分解它们是我认为不好的选择..

答案 5 :(得分:0)

您还可以查看Oracle中的Sqlserver或Xml Type中的XMLData列类型 http://msdn.microsoft.com/en-us/library/hh403385.aspx

您可以在xml数据列上为那些查询最多的xml字段创建计算列,这有助于更快地检索。要在某个xpath上检索某个值,您只需要将xpath传递给sqlserver,以便将该路径的值返回给您。