Java 在数据库中存储XML数据-多个表而不是在列中转储XML

Java 在数据库中存储XML数据-多个表而不是在列中转储XML,java,xml,oracle,xsd,xmltype,Java,Xml,Oracle,Xsd,Xmltype,我想将接收到的xml存储在java web服务中。 报告将每5分钟运行一次,以提取xml元素中的一些数据 我想到了两种方法来解决这个问题 在数据库中创建多个表以捕获xml数据。 基本上,每个元素在数据库中都有自己的列 将整个xml转储到可以存储xml数据的列中。 出于报告目的,分析查询本身中的值 以上哪种方法更好, 特别是在性能方面?这是至关重要的,因为报告将以非常高的频率生成(每5分钟一次) xml模式非常复杂,不是一个简单的模式。临时访问 如果需要以特殊或任意方式对XML中包含的数据运行高效

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

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

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

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

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


    xml模式非常复杂,不是一个简单的模式。

    临时访问

    如果需要以特殊或任意方式对XML中包含的数据运行高效查询,则应将其解析为
    ,这些列可以逻辑地进行索引和联接

    有限访问

    如果您只是存储数据,并根据一些其他标准(如唯一id或其他键)传递数据,而XML本质上是一个不透明的
    BLOB
    ,那么只需将其存储在
    BLOB
    列中,就可以使用它了

    混合动力车型


    您可能需要的是介于两者之间的某种东西,其中XML存储在
    BLOB
    中,而
    表和
    列中只存储相关位,这样您就可以有效地搜索XML有效负载。

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

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

    就我个人而言,我更喜欢一般的关系存储方法,甚至忽略性能问题,因为它使其他人更容易与数据交互。能够编写像样的SQL的开发人员远远多于能够编写像样的XPath表达式的开发人员,能够根据关系表生成报告的查询工具远远多于能够根据存储在数据库中的XML生成报告的查询工具。

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

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


    如果您需要搜索或报告XML内部的值,例如有多少客户具有特定属性,那么您可能希望解析为单个属性。这通常意味着您必须进行一些前后处理,但可以让您快速了解各个属性。

    如果不了解更多信息,很难确定,但很可能您缺少了一个可以大大简化生活的重要部分

  • 从XML绑定到POJO(JAXB、MOXy或JibX)
  • 从POJO存储为规范化列(使用jDBI、Hibernate甚至简单的JDBC模板)

  • 还取决于您生产的是哪种报告,也许考虑将数据保持在内存中的可能性——每5分钟听起来不象性能关键,但再也不需要持久性(或者只针对历史数据或备份)。.

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


    很好,将这些Xml保留在一列中或在许多表中取消它们的组合是一个不好的选择。

    您还可以查看Sqlserver中的XMLData列类型或Oracle中的Xml类型


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

    混合模型:您的意思是存储表中经常查询的元素并将xml存储为blob吗?如果需要,可以从xml查询其他元素。