什么时候使用XML而不是SQL?[关闭]


102

我从事数据库驱动的Web应用程序已经有几年了,最近我从事了一个涉及具有XML功能的CMS的项目。这使我开始思考XML / XSLT的一般用法,以及在什么情况下它比我一直使用的方法更有用,该方法是将所有数据存储在(My)SQL数据库中,然后使用PHP / Python /等 根据需要在网络上使用它。

显然我在这里没有“得到”某些东西。有人可以给我一些应用程序示例,其中最好将数据存储在XML文件而不是数据库中?


4
我认为问题是XML与RDBMS相比更准确,而不是SQL。
日,日本


4
我认为问题是FILE与RDBMS相比更准确,而不是XML与SQL。
pfeds

如果有时间,最近的图灵奖得主迈克尔·斯通布雷克(Michael Stonebraker)的“周围发生的事情”是一篇有关数据库历史的出色论文,包括XML数据库如何重复过去的错误。
Jeffrey Bosboom

Answers:


100

引用本书(有效的XML:50种改进XML的特定方法):

“ XML不是数据库。它从来没有打算成为一个数据库。它永远不会成为数据库。关系数据库是经过验证的技术,具有20多年的实施经验。它们是坚固,稳定,有用的产品。他们不会消失。XML是在不同数据库之间或数据库与其他程序之间移动数据的非常有用的技术。但是,它本身不是数据库。不要像一个人那样使用它。”

我认为这可以总结一下,如果有些直言不讳。XML是一种数据交换格式。可以有一个XML解析库,该库可以使用XPath表达式查询DOM,但这与DBMS不同。您可以使用DOM / XPath接口构建DBMS,但是要获得ACID属性或扩展到大型数据集,您需要实现DBMS引擎以及具有索引,日志记录和其他DBMS工件的数据格式-这(根据定义)使得它不是XML。


1
我意识到这个答案写于2008年,但是随着许多基于文件的数据库系统的出现,我发现自己想知道在许多情况下它们是否比传统的RDBMS更有意义。SQL是在磁盘空间昂贵的黑暗时代设计的,它已成为软件行业的一种思考方式。这并不意味着就现代方法而言是正确的。
pfeds

但这仍然不能使XML成为数据库,而只是将序列化格式存储在BLOB中。这对您可能有用,但不能使XML代替功能齐全的查询工具。
ConcernedOfTunbridgeWells

2
更加有效的磁盘空间管理并不是关系数据库的唯一优势。大多数关系数据库都使用固定的字段长度和记录长度,这使得它们能够在恒定时间内响应任何请求,而XML,Yaml,JSon和其他基于文本的数据存储基本上都是基于文本的,因此所有查询是通过文本解析执行的,这在处理器时间上具有巨大的开销,并且可以在不可预知的时间内执行。这只能通过需要大量内存的昂贵的(就CPU时间而言)预缓冲来解决。
mg30rg 2013年

如果我编写一个SQL SP来检索数据并使用HTML而不是XSLT文件来显示,它是更快还是差不多?
SearchForKnowledge

1
现在,您可以将XQuery用于XML数据库。
Don Dilanga


15

SQL是很好的表格数据-轻松适合行和列的数据。XML适用于分层数据,即具有多个不同大小级别的数据。

SQL非常适合存储和搜索。XML非常适合传输和格式化。


10

1)当您必须与他人交换数据时。XML是Web 的“ 通用语言 ”-与数据库文件不同,几乎每个人都可以阅读和解释它。

2)当您的数据量很小并且不必对它进行复杂的查询时。XML文件可用于存储配置或文档模板。

3)当您没有很多编写者试图访问相同的数据时。SQL数据库涉及并发机制,这些机制在幕后为您服务。SQL数据库可以支持索引,以快速检索大型数据集上的信息。


5

我将XML用于以下方面:

  • 持久化对象层次结构。
  • 将数据从一个进程或机器移动到另一进程或机器。
  • 很少更改的数据(如果有的话);配置设置等。
  • 当XSLT的输入转换时:一般而言,如果我的程序之一发出HTML,则它正在使用XSLT来执行,因此源数据在某些情况下将表示为XML。
  • 文字标记。(别忘了!)

这些用例与数据库的用例之间没有很多重叠。一些,但不是很多。

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

因此,在这种情况下,看起来我正在使用XML作为数据库。但是我真的不是。我使用的对象模型恰好实现了许多类似数据库的功能,并且我使用XML作为其持久性格式。


3

我相信有很多商业应用程序大量使用XML作为存储介质。我已经完成了一个项目计划应用程序,用户在其中将每个项目存储在自己的文件中。该应用程序位于USB记忆棒上,并且需要零安装。所有数据都是从XML中提取并在内存中处理的,因此getRecord(id)非常快捷。

所以我的答案是..当数据足够小以至于可以保存在内存中时,数据库将被杀死。



1

每当您没有拥有数据库的奢侈时(请考虑单用户应用程序)或需要非常轻便的存储格式。

同样如先前的海报所述,一种交换格式。


1

XML和RDMS都可以用作数据存储,但是每种实现都有其自身的优点和缺点。

在开始处理大量数据或决定要从数据中发现其他信息之前(例如:数据挖掘),使用XML为Web应用程序存储数据通常不是大问题。换句话说,为数据源存储大量XML文件不是非常可伸缩的,但是它使移动数据更加容易。XML还可以用于以非关系格式序列化复杂对象,如果您可以直接从XML序列化/反序列化对象,则可以消除对ORM的需求

RDMS(数据库)通常具有更高的可伸缩性,提供更大的并发支持,并且在处理大量数据时要快得多。关系模型使以后的数据挖掘更加容易。数据库确实遭受对象关系阻抗不匹配(http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch)的困扰,这可能需要您编写难看的代码或使用复杂的ORM。


1

如果主机上的mysql数据库有限,我会去的,那么我会看到将XML用作数据存储的机会。


1

这是将XML与SQL结合使用的示例:经过身份验证的用户可以将数据读写到各种数据库中,而并非所有数据库都是同一个DBMS。公司A的用户使用本地SQL Server数据库中的数据。公司B的用户使用来自远程Oracle数据库的数据。等等。十几个不同的数据库,每个数据库对于相同的基本数据都有略微不同的架构。

网站开发人员无法在远程数据库上创建存储过程。SQL必须直接从Web应用发送到数据库。由于每个数据库的SQL语法和架构略有不同,因此有必要对12个数据库中的每个数据库使用不同的SQL来执行相同的操作(SELECT,INSERT等)。

将SQL语句嵌入到Web应用程序中的一种选择是将它们放在XML文件中。每个XML文件都包含用于多个数据库之一的SQL语句集。该代码确定登录用户可以访问哪个数据库,并从指定的XML文件中检索适当的SQL。

与存储过程一样,可以在不停止或重新编译应用程序的情况下更新XML文件中的SQL。



0

永远不会使用任何XML来存储数据。

我们将XSLT转换用作SOA应用程序中的数据抽象层。所有对象都在XSLT中互相发送数据,因此只需要了解一种语言。数据库连接器除外,该连接器需要能够将数据转换为SQL,然后才能将其发送到DB。

这样,您就不会在应用程序中成千上万个对象上分布SQL字符串生成。使维护更加容易。


“所有对象都在XSLT中互相发送数据”,认真吗?
Goran

所有通过服务总线进行通信的人员。
Treb

XSLT是用于转换XML以不携带信息的语言。我想您可以使用XSLT发送数据,因为它是XML的子集,但是为什么要这么做呢?
Goran

是的,您是对的-我需要重新表述。
Treb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.