xml - Postgresql XML类型的优势?

标签 xml postgresql xpath

我是SQL初学者,需要回答以下问题。 我有数千个 XML 文件(每个文件都有数百个节点),需要在其中的数据之上构建一个 Postgresql 数据库。

我考虑两种方式:

  1. 将 XML 文件转换为一个(或多个)大型数据库表(一个 XML 节点 = SQL 表中的一行)并使用该表。
  2. 创建一个具有原生 XML 类型的数据库(在数据库中存储 XML 类型的数据)并使用 XPath 进行搜索和过滤......

哪种方法更好(更快、更舒适)?在 SQL 数据库中使用 XML 类型的优点和缺点是什么?

最佳答案

选项 (1) 很糟糕,不要那样做。每个节点一行的单个巨型表将糟糕查询,like EAV添加了硫磺味和额外的牛角。

要么建模 XML 表示的数据作为实体(表)和关系,要么只将 XML 文档存储在数据库中。

只有在 XML 具有规则结构的情况下,您才能将 XML 有效地建模为实体和关系。如果您有一堆不同的自由格式 XML 文件,那么您就无法在 RDBMS 中真正有效地对其进行建模。如果它们常规的,这通常是最好的选择,例如:

<root>
   <parentnode attrib="value">
      <child otherattrib="value2">content</child>
   </parentnode>
   <...>
</root>

您可以将其建模为:

  • parent 表,包含 idattrib 列;和
  • 一个 child 表,包含一个 idotherattrib 列以及一个 parent_id 列对 parent(id) 的关键引用。

具体如何为 XML 建模取决于 XML。什么是强制性的,什么不是?您是否需要重建输入 XML 中实体的准确顺序,或者节点内的顺序是否无关紧要?是否有自由形式的可嵌套实体?

作为一种决策的示例,如果您的父节点可以具有零个或一个(但不能更多)给定子节点类型,您可以选择使用两个表和一个 1 :1 可选关系,或者您可以将子元素合并到单个表中的父元素中,其中子属性/内容可为空。在性能(连接成本与表格宽度和每页行数)和易用性方面各有优缺点。

如果 XML 结构是严格的,那么建模为表格通常很方便;如果它是自由形式,通常将它作为 XML 存储在数据库中并使用 xpath 查询它更有用。

如果将其保存为 XML 文档,则很难在数据库中编制索引和查询,但更容易将 XML 从数据库中取出并提供给应用程序。 xpath 表达式的函数索引可以提供很多帮助。还值得添加一个 CHECK 约束来强制 xml 字段 IS DOCUMENT 所以你不能存储 XML 片段,只能存储整个文档。

关于xml - Postgresql XML类型的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15570278/

相关文章:

c# - Postgresql 对列名和表名使用替代字符而不是引号

java - 内容类型 "text/xml; charset=utf-8"是错误的吗?

php - 在 PHP 中更改 XML 节点元素值并保存文件

postgresql - 修复重复行以遵守约束

python - Django:相关模型上的 RunPython 迁移真的很慢

javascript - 如何查询一个json文件?

python - XQuery:将日期时间与毫秒进行比较

javascript - Xpath获取所有带有内部文本的链接

java - 使用 Sax 解析具有相同标签的 XML 元素

python - 如何使用 python 获取 XML 的所有子节点?