何时应该使用XML而不是SQL?

107

我已经从事面向数据库的Web应用程序开发几年了,最近接手了一个CMS项目,该项目支持XML。这让我开始思考XML/XSLT在一般情况下和在什么情况下会比我一直使用的方法更加有用,我的方法是将所有数据存储在(My)SQL数据库中,然后在需要时使用PHP/Python等语言进行Web访问。

很明显,有些地方我还没真正理解... 请问有没有例子可以说明,在哪些应用程序中使用XML文件而不是数据库存储数据会更好?


5
我认为问题更确切地说是XML与关系型数据库管理系统(RDBMS)之间的比较,而不是SQL与XML之间的比较。 - JAL
http://en.wikipedia.org/wiki/Xml_database - Max Toro
5
我认为问题更准确地是文件与关系型数据库的比较,而不是XML与SQL的比较。 - pfeds
如果你有时间的话,最近图灵奖得主Michael Stonebraker的"What Goes Around Comes Around"是一篇关于数据库历史的优秀论文,包括XML数据库如何重蹈过去的错误。 - Jeffrey Bosboom
13个回答

107

引用这本书 (Effective XML: 50 Specific Ways to Improve Your XML) 的话:

"XML不是数据库。它从来没有被设计成一个数据库,也永远不会成为数据库。关系型数据库是经过20多年实现经验证明的技术。它们是坚实、稳定、有用的产品。它们不会被淘汰。XML是在不同数据库之间或数据库和其他程序之间移动数据的非常有用的技术。但是,它本身不是数据库。不要像使用数据库一样使用它。"

我认为这句话概括了问题,虽然有点直白。XML是一种数据交换格式。可以使用XML解析库查询DOM并使用XPath表达式,但这与DBMS并不相同。您可以使用DOM/XPath接口构建DBMS,但要实现ACID属性或扩展到大型数据集,则需要实现DBMS引擎和具有索引、日志记录和其他DBMS特性的数据格式——这使它成为除XML之外的其他内容。


1
我意识到这个答案是在2008年写的,但随着一些基于文件的数据库系统的出现,我开始想知道它们是否在某些情况下比传统的关系型数据库更有意义。SQL是在磁盘空间昂贵的黑暗时代设计的,并且已经成为软件行业中的一种思维方式。这并不意味着它在现代方法方面是正确的。 - pfeds
这仍然不能将XML视为数据库,只是一种序列化格式,用于存储在BLOB中的某些内容。虽然这可能对您有用,但它并不能替代具有完整功能查询设施的数据库。 - ConcernedOfTunbridgeWells
2
更高效的磁盘空间管理并不是关系型数据库的唯一优势。大多数关系型数据库使用固定的字段和记录长度,使它们能够以恒定的时间响应任何请求,而基于 XML、Yaml、JSon 和其他文本的数据存储基本上是基于文本的,因此所有查询都是通过文本解析执行的,这在处理器时间上具有巨大的开销,并且可能需要不可预测的时间。这只能通过昂贵的(在 CPU 时间方面)预缓冲来解决,需要大量的内存要求。 - mg30rg
如果我编写一个SQL存储过程来检索数据,并使用HTML来显示,而不是XSLT文件,这样做会更快还是差不多? - SearchForKnowledge
1
现在你可以使用XQuery来操作XML数据库。 - Don Dilanga

24

使用XML来创建需要发送到其他应用程序的文件。相比于数据存储格式,XML更适合作为数据交换格式。

当使用XML时,下面的链接描述得不错:为什么应该使用XML?


链接更新至2012-09-06:http://xml.silmaril.ie/index.html - wip

17

SQL适合存储和搜索表格数据,这些数据很容易放入行和列中。 XML适合层级数据,这些数据有多个不同大小的层级。

SQL适合存储和搜索数据。 XML适合传输和格式化数据。


13

1) 当你需要与他人交换数据时,XML是Web的“lingua franca”,几乎每个人都可以读取和解释它,而不像数据库文件。

2) 当你的数据量很小,而且不用对其进行复杂的查询时,XML文件非常适合存储配置或文档模板等内容。

3) 当你没有许多作者试图访问同一组数据时,SQL数据库具有涉及并发机制的内置功能,可以支持索引快速检索大型数据集中的信息...


哇,网络的“通用语言”真的过时了,不是吗?现在应该是JSON... - Dave Markle

6

我使用XML的事项:

  • 持久化对象体系结构。
  • 将数据从一个进程或机器移动到另一个进程或机器。
  • 很少或根本不会更改的数据,例如配置设置之类的内容。
  • 作为XSLT转换的输入:一般来说,如果我的一个程序发出HTML,则它正在使用XSLT进行操作,因此源数据将以XML形式表示。
  • 文本标记。 (别忘了这个!)

在这些用例和数据库的用例之间没有太多重叠。有一些,但不多。

具有讽刺意味的是,我目前在桌面应用中最频繁使用XML的地方是构建内存中的ADO DataSet,并使用DataSet的WriteXml和ReadXml方法进行持久化和检索。我使用ADO是因为使用ADO动态构建由元信息定义的数据模型要比实现自己的对象模型容易得多。

所以这里有一个看起来像是我在使用XML作为数据库的情况。但实际上并不是这样。我正在使用一个实现了很多类似数据库功能的对象模型,并使用XML作为其持久性格式。


4

4
我相信有不少商业应用程序在存储方面大量使用 XML。我曾为一个项目计划应用程序做过这样的事情,其中用户将每个项目存储在自己的文件中。该应用程序位于 USB 棒中,无需安装即可使用。所有数据都从XML中提取,并在内存中处理,因此getRecord(id)速度非常快。
因此,我的答案是,当数据足够小可以保存在内存中时,使用数据库就过度了。

2

如果您没有数据库(比如单用户应用程序)或需要一种非常轻量级的存储格式,那么可以使用它。

正如之前的帖子提到的那样,它也是一种交换格式。


2
XML和RDMSs都可以用作数据存储,但每种实现都有其优点和缺点。
使用XML存储Web应用程序的数据通常不是一个大问题,直到你开始处理大量的数据或决定从数据中发现其他信息(例如:数据挖掘)。换句话说,存储大量XML文件作为数据源并不是很可扩展,但它使数据移动变得更容易。 XML还可以用于以非关系格式序列化复杂对象,如果您可以直接从XML序列化/反序列化对象,则可以消除ORM的需要。
RDMSs(数据库)通常更具可扩展性,提供更好的并发支持,并且在处理大量数据时速度更快。关系模型使得以后进行数据挖掘更加容易。数据库会遭受对象关系阻抗不匹配(http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch),这可能需要您编写丑陋的代码或使用复杂的ORM。

2

如果我的主机上有限制的mysql数据库,那么我会考虑使用XML作为数据存储库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接