将XML存储在数据库中"不好"吗?

End*_*der 19 xml database

我从几个消息来源获悉,在数据库中存储XML是"糟糕的",但我从未见过/听到过为什么会这样做的实际解释.这是真的吗?如果是真的,你能解释一下原因吗?而且,你能告诉我在数据库中存储XML的"好"案例是什么?

小智 29

这里有一些非常愚蠢的答案-只是因为数据库支持数据类型并没有你应该使用它的意思.这些东西总是作为特征添加,因为竞争有它们,而不是因为它们是正确的.全局变量?触发器?有人愿意为他们辩护,因为你可以使用它们并且它们在那里吗?

如果您有多个属性,则在关系数据库中处理它们的最佳方法是使用一对多关系.从XML开销中解析出有用的数据.然后,您只需存储父记录的ID(主键),每个行存储在第二个表中,每个属性一行.每个父记录可以包含任意数量的属性.这是数据库设计101,没什么聪明的.将它存储为非结构化XML只是为了存储可变数量的属性不是要走的路,它是一个破解花生的大锤.一对多关系的两个表之间更简单,更容易理解,快进行查询,更省力编码和更少的存储空间(这意味着更快的查询).除了存储供应商之外,每个人都获胜.

XML是一种数据传输协议 ; 正如GolezTrol正确地说,"这是一种导出(和导入)数据的方式" - 即:它只是用于促进不同系统之间数据结构通信的开销.一旦收到,标签应该被剥夺了和数据(而保存在你选择的数据库引擎中的数据),不管这可能是.不是XML本身.XML的开销是它描述的数据的10倍.想告诉你的老板为什么100GB的数据占用昂贵的SAN上1TB的空间?或者通过饱和的网络链接整夜备份?或者在生产中造成性能问题?如果您不解析现在无意义的标签中的数据,您只需将问题和持续的日常支持成本推到未来十年的运营支持中.邋,马虎,马虎.这使像EMC这样的供应商在业务上.

XML是元数据.没有什么聪明的,只是架构描述符.一旦它被转移和解析它就失去了它的用处,并且只是混乱,阻塞你使用的任何数据库.摆脱它,除非你强迫沉迷于昨天的无意义的蹩脚描述元数据,存储了很多次.醒来.这是典型的"皇帝新衣"综合症,不再被简单和一次性的东西所束缚.它只是元数据,不应该存储或崇拜,一旦解析它就是垃圾.什么更好?要解析它一次,或者每次需要数据时都无用地解析它?答案很明显对我来说很明显.

  • 这是一个过分强硬的立场.虽然存储XML可能肯定会触发灵魂搜索的快速时刻,但肯定有一些合理的理由去做.例如,当您的应用程序唯一的职责是存储和检索所述XML(类似于存储为BLOB的图像).如果我所要做的就是获取它并将它抽出去,如果你认为应该将工程时间用于解析xml的任务,你就会疯狂; 创建关系模型; 创建代码模型和相关的ORM层来映射它. (12认同)

Ran*_*der 19

这一点都不错.Microsoft SQL Server具有XML数据类型.存储XML的一个用例是我们发现的情况.对于特定表中的每一行,我们需要存储与该行相关的可变数量的属性.并且这些属性的数量可以随着时间和每行而变化.我们发现以XML格式存储这些属性及其值更有效.将来,每次调整属性数量时,我们都不需要进行架构更改.

  • 似乎是一种非常低效的方式.您无法在这些值中查询.将所有数据加载到客户端并解析XML也是非常低效的.您也可以将这些数据放入blob或其他任何内容中.这完全绕过了数据库的概念. (9认同)
  • 也许您应该考虑使用无架构数据存储?像RavenDB或MongoDB这样的东西? (5认同)
  • 这是一个非常聪明的解决方案.问题 - 您如何处理需要选择这些属性的情况? (2认同)

Sea*_*ira 11

存储XML,JSON,YAML,逗号分隔列表,二进制blob或数据库中的任何其他内容都不错 ...... 本身.

可以表明缺少一个什么样的数据库是(即与其他数据存储数据)的理解和联想到的单列的表称为数据库的愿景data1,data2等...,每个表行持有+5 MB输入XML编码的关系数据.

另一方面,可以为这样的结构制作许多有效的案例 - 快速更改的配置可能用JSON表示并存储在两列表中,结构如下:

dbo.good_table
ApplicationID (bigint)
Configuration (varchar(max))
Run Code Online (Sandbox Code Playgroud)

上表和这样的表之间的区别如下:

dbo.bad_table
ApplicationID (bigint)
ApplicationMembers(xml)
Run Code Online (Sandbox Code Playgroud)

good_table是否能够快速访问一段数据(配置),而bad_table使用数据库作为昂贵(和慢速)的硬盘.


Gol*_*rol 5

XML本身就是一种存储格式.它最常用于数据传输,因为它提供了一种结构化数据的通用机制.有一些固定的XML读写规则允许任何人读取XML数据.此外,验证和转换为其他输出格式相对容易(使用xslt).但是,XML并不是存储数据的最佳方式.读取XML文件非常耗时,并占用相对较多的空间.最好以数据结构的方式将数据存储在数据库中,如果您需要在报告中,网站上将数据从某些查询导出到XML,或将数据传递给其他方.

有XML数据库,但它们也不存储XML数据.它们只提供了一种保存和加载分层数据的方法(XML是一种分层结构),而不是标准的表结构.

因此,将XML内容存储在数据库中的blob中通常不是正确的方法,但总是存在例外情况.

XML与其他人在此处所说的不同 - 不是显示数据的方式.这是一种导出(和导入)数据的方法.它是数据传输的合理选择.这是因为您希望它导出的方式非常灵活,它可以很容易地转换为其他格式.比如,如果您有网上商店,并且想要将价格和产品信息导出到其他方,您可以选择XML.这些其他方可以编写简单的规则来将这些数据转换为他们的需求.任何一方都不必知道价格存储在另一方的方式,并且任何一方都不必编写复杂的工具来解析其他人已经编造的难以读取的二进制文件.