将数据存储为XML

时间:2009-08-27 08:47:23

标签: xml database

在哪种情况下,将数据存储为XML比RDBMS更可取?为什么?

你能说出任何类比吗?

10 个答案:

答案 0 :(得分:5)

<强>摘要

如果您没有太多数据并且您完全控制它(没有相关的第三方),那么XML是一个不错的选择。否则,RDBMS - 更多原因见下文。

<强>类比

如果RDBMS是一个文件柜(由某个索引组织的相同大小的记录的抽屉),那么XML就是一个背包(不一定有组织的随机大小的记录包,可能会在角落处伸出)。< / p>

XML的原因

1)灵活性

如果您的架构非常松散或随着时间的推移而发生变化,那么XML更可取,因为版本化RDMS在其内部存在数据时很难。根据我的经验,XML Serialization,XSLT和XPath查询可以适应XML模式的变化,并且可以继续为旧/新客户端工作。例如,您可以将一些新元素添加到文档中,读取该文档的旧EXE将忽略这些元素。执行“SELECT * FROM table”的RDBMS查询,您刚刚添加了一列,将产生未定义的结果。

2)部署

简单 - 只需运送您的EXE。

3)可调试性

易于“调试”数据 - XML已经是人类可读的;如果没有,XSLT可能会使它更具可读性。

4)互操作性

您可以将XML移交给其他系统,而不关心他们使用的平台/技术。

RDBMS的原因

1)表现

如果您有大量数据,那么RDBMS的索引功能将为您提供最佳性能。如果您从根本上只是尝试查找ID = 123的记录,那么读取大型XML(> 1000条记录)是非常昂贵的,而RDBMS可以快速完成。存储过程会使这更好。

2)安全性

您可以通过权限保护RDBMS的某些部分 - 例如授予/拒绝对各种用户的SELECT访问权限。

3)商业工具

有许多RDBMS工具可用于OLAP和报告等事务。

答案 1 :(得分:2)

如果数据自然可以在树状结构中描述,那么XML就可以了。不过,我更喜欢更轻便的选择。 YAML和JSON是候选人。

答案 2 :(得分:2)

我绝不会喜欢随时在数据库中存储大量XML个文件。

XML适用于可读和可扩展的文件格式 - 例如当您保存在应用程序中时。 XML是首选,因为它允许任何其他人使用该文件格式。

另一个时间XML更适合配置设置。例如,我做了很多游戏编程,将自己的游戏设置存储在数据库中会很疯狂。 XML(或任何相关文件)更容易。

但是,如果给出记录(记录中的数据),例如产品或客户,那么除了数据库以外的其他东西来存储这些数据是非常错误的。备份,速度和可扩展性是三个原因。

所以答案是 - 取决于

你必须做出判断并做出正确的决定。

至于类比:

  

XML就像特百惠一样。如果你去购物并回家,是的,你可以把每件物品放在一个定制的特百惠盒子里,但是在一天结束时,将东西放入冰箱可能更容易

但是,正如我上面提到的那样,XML有它的位置。

答案 3 :(得分:2)

我会非常小心,因为XML不是数据存储设备。 XML是一种元语言,一种用于创建语言的语言。 XML经常被误用作数据存储设备,但该频率并不能证明对该技术的错误理解。

我听说有人试图争辩说,元语言意味着数据的数据语言,这仍然不是数据存储设备。为表示数据结构的描述而创建的语言不是数据本身的语言,而语言的实例可能是由数据创建的结构,语言本身不是。

如果您不打算创建语言或代表某类数据的语言,我建议您不要使用XML,因为结果会变得臃肿,变慢,并且您不会使用任何辅助技术XML确实很强大。作为替代品,其他人提到了YAML和JSON,它们相当轻。我建议尝试其中之一。如果元数据及其结构/关系对您来说比数据本身更重要,那么我会坚持使用XML,因为处理和操作的可能性是非常可扩展的。

答案 4 :(得分:0)

如果你必须以兼容的,人类可访问的格式移动它们,或者你的数据的概念模型不能轻易地遵循关系模型。

此外,如果您的应用程序希望以易于解析但仍可扩展的格式存储数据。以浏览器为例。我会将书签数据存储在XML文件中,而不是存储在关系表中。

答案 5 :(得分:0)

如果我已经将XML作为XML(例如来自Web服务调用或其他东西)而将XML存储在数据库中,并且需要在某处保留“原始”数据副本。

我可能还会在XML中存储一些高度分层和/或只是半结构化的东西,这些东西在正常的RDBMS表擅长的行/列中表达起来很尴尬和棘手。

通常,只要您需要使用数据库处理数据库或应用程序中的信息,如果它位于关系表中,则更容易处理。因此,除非你真的有充分的理由使用XML,否则不要只使用它,因为你太懒了,不能创建几个表。

XML有它的优点和所有 - 但它通常相当冗长,有时处理起来有点麻烦(在表中的列上选择要比在XML中获取值更容易),以及整体通常比直接使用关系表慢。

SELECT fieldName 
FROM table

更容易使用,阅读和理解
SELECT 
   xmlData.value('(xpath-expression)[1]', 'int') as 'Field'
FROM table

所以,总结一下:如果你真的看到了需求和好处,就使用它,但不要过度(仅仅因为你可以或因为它很酷或性感)。谨慎使用并有充分理由。

马克

答案 6 :(得分:0)

我努力使用XML。除了http://commons.apache.org/digester/之外,它还是一个强大的来源。只是我的2分。

答案 7 :(得分:0)

对于编写应用程序首选项/设置,大多数情况下XML优先于数据库。 我认为是因为, 1.更容易破坏数据库文件 2. XML支持跨平台可移植性。

答案 8 :(得分:0)

我认为你的意思是“顺序文本文件中的XML”。否则它不是一个或两个问题:你可以将XML存储在关系数据库中,你可以将关系数据库导出到XML等等。那就说......

XML非常适合具有不可预测数据的复杂数据流。就像一个文本文件:在任何时候开始一个新的章节,包括一个脚注,切换到斜体等都是有意义的。你通常不希望每个章节都有相同数量的脚注,甚至每个文本文件都包括脚注。您不希望每个文档都有六个单词的纯文本,后跟三个单词用斜体字,然后是脚注等.XML允许标签以非常灵活的方式发生。

关系数据库非常适合一致格式的数据。例如,对于客户订单,您可能希望拥有客户名称,地址,订购商品,价格等。没有指定客户的订单几乎肯定无法处理。

如今,许多人正在使用XML进行所有数据存储和传输。我认为这是一个很大的错误。 XML不仅对于可预测格式的数据非常麻烦 - 即所谓的“括号税” - 但它也会产生各种错误机会。像CSV这样的固定格式甚至不能说你想在同一个订单上有两个客户名称。只有一个地方可以放,它没有办法放两次。但在XML中,您可以包含两个“客户”标签或属性。 CSV无法指定未定义的属性。客户名称无法以斜体显示或价格以千克为单位。但是在XML中可以有任意一组属性。因此,试图处理固定数据的XML流的程序必须处理各种可能的错误,这些错误甚至不会出现在其他格式中。

答案 9 :(得分:0)

这里有很多好的回应,但他们都错过了最重要的一点。关系数据库为您解决的一个大问题是同步多用户访问。对于单个用户程序,您可以在启动时从一组XML文件中读取所有内容,并在保存时再次将其写入 - 如果您可以首先找到单用户软件的市场。对于多用户访问的一般情况,该解决方案将无法正常工作,如果您开始搞乱细粒度锁定,那么您基本上是要重做已经为您完成的大约30年的工作,如果您使用的话关系数据库。