草庐IT

xml - Postgresql XML类型的优势?

coder 2024-07-04 原文

我是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/

有关xml - Postgresql XML类型的优势?的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  3. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  6. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  7. ruby-on-rails - Rails 迁移中的 PostgreSQL 点类型 - 2

    我想使用PostgreSQL中的point类型。我已经完成了:railsgmodelTestpoint:point最终的迁移是:classCreateTests当我运行时:rakedb:migrate结果是:==CreateTests:migrating====================================================--create_table(:tests)rakeaborted!Anerrorhasoccurred,thisandalllatermigrationscanceled:undefinedmethod`point'for#/hom

  8. ruby-on-rails - 我可以用鸭子类型(duck typing)改进这种方法吗? - 2

    希望我没有误解“ducktyping”的含义,但从我读到的内容来看,这意味着我应该根据对象如何响应方法而不是它是什么类型/类来编写代码。代码如下:defconvert_hash(hash)ifhash.keys.all?{|k|k.is_a?(Integer)}returnhashelsifhash.keys.all?{|k|k.is_a?(Property)}new_hash={}hash.each_pair{|k,v|new_hash[k.id]=v}returnnew_hashelseraise"CustomattributekeysshouldbeID'sorPropertyo

  9. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

    我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

  10. ruby-on-rails - 如何在 ActionController::TestCase 请求中设置内容类型 - 2

    我试图像这样在我的测试用例中执行获取:request.env['CONTENT_TYPE']='application/json'get:index,:application_name=>"Heka"虽然,它失败了:ActionView::MissingTemplate:Missingtemplatealarm_events/indexwith{:handlers=>[:builder,:haml,:erb,:rjs,:rhtml,:rxml],:locale=>[:en,:en],:formats=>[:html]尽管在我的Controller中我有:respond_to:html,

随机推荐