Postgresql XML类型的优点?

Mar*_*man 2 xml postgresql xpath

我是SQL的初学者,需要回答以下问题.我有成千上万的XML文件(每个都有数百个节点),需要在它们内部的数据之上构建一个Postgresql数据库.

我考虑两种方式:

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

哪种方法可以更好(更快,更舒适)?在SQL数据库中使用XML类型有哪些优缺点?

Cra*_*ger 5

选项(1)很糟糕,不要这样做.每个节点有一排巨单表将是可怕的查询,像EAV添加了硫磺的臭味和奖金角.

无论是模拟由XML作为实体(表)表示的数据和关系,或只是存储在数据库中的XML文档.

如果XML是定期构建的,那么您只能将XML建模为实体和关系.如果您有一堆不同的自由格式XML文件,那么您无法在RDBMS中对其进行有效的建模.如果它们常规的,这通常是最好的选择,例如:

<root>
   <parentnode attrib="value">
      <child otherattrib="value2">content</child>
   </parentnode>
   <...>
</root>
Run Code Online (Sandbox Code Playgroud)

你可以把它建模为:

  • parent带有idattrib列的表; 和
  • child带有idotherattrib列的表以及parent_id具有外键引用的列parent(id).

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

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

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

如果将其保留为XML文档,则在DB中进行索引和查询会更加困难,但更容易将XML从数据库和应用程序中取出.xpath表达式上的功能索引可以提供很多帮助.还需要添加一个CHECK约束来强制执行该xml字段,IS DOCUMENT这样您就无法存储XML片段,只能存储整个文档.

  • +1这里的"自由形式"的另一个词是"混合内容",这意味着你有一份文件而不是一份记录.混合内容XML应该存储在具有XML数据类型的单个列中,就像文本文档一样. (4认同)