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

Max*_*mus 7 java xml oracle xsd xmltype

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

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

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

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

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

xml架构非常复杂,而不是一个简单的架构.

Jus*_*ave 9

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

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

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


Bri*_*ver 5

Maximus,这实际上取决于您想要对XML数据做什么.

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

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