【问题标题】:When would I use XML instead of SQL? [closed]我什么时候会使用 XML 而不是 SQL? [关闭]
【发布时间】:2008-10-14 15:07:28
【问题描述】:

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

显然我在这里没有“得到”一些东西.. 谁能给我一些应用程序的例子,在这些应用程序中,将数据存储在 XML 文件而不是数据库中会更好吗?

【问题讨论】:

  • 我认为更准确的问题是 XML 与 RDBMS,而不是 SQL。
  • 我认为更准确的问题是 FILE 与 RDBMS,而不是 XML 与 SQL。
  • 如果您有时间,最近图灵奖得主 Michael Stonebraker 的 "What Goes Around Comes Around" 是一篇关于数据库历史的优秀论文,包括 XML 数据库如何重复过去的错误。

标签: sql xml


【解决方案1】:

引用This Book(有效的 XML:50 种改进 XML 的具体方法):

“XML 不是数据库。从来没有 本来就是数据库。它从来不是 将成为一个数据库。关系型 数据库是经过验证的技术 20多年的实施 经验。它们坚固、稳定、 有用的产品。他们不去 离开。 XML 是一种非常有用的技术 用于在不同的数据之间移动数据 数据库或数据库之间 其他程序。然而,它不是 本身就是一个数据库。不要像这样使用它 一个。”

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

【讨论】:

  • 我意识到这个答案是在 2008 年编写的,但是随着许多基于文件的数据库系统的出现,我发现自己想知道它们在许多情况下是否比传统的 RDBMS 更有意义。 SQL 是在磁盘空间昂贵的黑暗时代设计的,它已成为软件行业的一种思维方式。这并不意味着就现代方法而言它是正确的。
  • 这仍然不能使 XML 成为数据库,而只是将您存储在 BLOB 中的内容的序列化格式。这可能对您有用,但它不会使 XML 成为功能齐全的查询工具的替代品。
  • 更有效的磁盘空间管理并不是关系数据库的唯一优势。大多数关系数据库都使用固定的字段和记录长度,这使得它们能够在恒定时间内响应任何请求,而 XML-、Yaml-、JSon- 和其他基于文本的数据存储基本上是基于文本的,所以所有查询是通过文本解析执行的,这在处理器时间上有巨大的开销,并且可以在不可预测的时间内执行。这只能通过代价高昂的(就 CPU 时间而言)具有巨大内存需求的预缓冲来解决。
  • 如果我编写一个 SQL SP 来检索数据并使用 HTML 而不是 XSLT 文件来显示,它是更快还是差不多?
  • 现在您可以将 XQuery 用于 XML 数据库。
【解决方案2】:

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

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

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

【讨论】:

  • Wooo,Web 的“通用语”肯定已经过时了,不是吗?现在应该是 JSON...
【解决方案3】:

SQL 是很好的表格数据——可以轻松放入行和列的数据。 XML 适用于分层数据——具有多个不同大小级别的数据。

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

【讨论】:

    【解决方案4】:

    不要。

    试试SELECT author FROM book

    【讨论】:

      【解决方案5】:

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

      使用XML时下面的链接描述也不错:Why should I use XML ?

      【讨论】:

      【解决方案6】:

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

      所以我的答案是......当数据小到可以保存在内存中时,数据库就会过度杀戮。

      【讨论】:

        【解决方案7】:

        我使用 XML 做的事情:

        • 保持对象层次结构。
        • 将数据从一个进程或机器移动到另一个。
        • 很少更改(如果有的话)的数据;配置设置等。
        • 作为 XSLT 的输入转换:一般来说,如果我的一个程序发出 HTML,它会使用 XSLT 来完成它,因此源数据将在某些时候表示为 XML
        • 文本标记。 (我们不要忘记这一点!)

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

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

        所以这是一个看起来的例子,我使用 XML 作为数据库。但我真的不是。我使用的对象模型恰好实现了许多类似数据库的功能,并且我使用 XML 作为其持久性格式。

        【讨论】:

          【解决方案8】:

          当您没有数据库(想想单用户应用程序)或需要非常轻量级的存储格式时。

          也正如之前的海报所提到的,一种交换格式。

          【讨论】:

            【解决方案9】:

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

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

            RDMS(数据库)通常更具可扩展性,提供更大的并发支持,并且在处理大量数据时速度更快。关系模型使以后的数据挖掘更容易。数据库确实受到对象关系阻抗不匹配 (http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch) 的影响,这可能需要您编写丑陋的代码或使用复杂的 ORM。

            【讨论】:

              【解决方案10】:

              如果我的主机上只有有限的 mysql 数据库,我会去,然后我会看到使用 XML 作为数据存储的机会。

              【讨论】:

                【解决方案11】:

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

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

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

                与存储过程一样,无需停止或重新编译应用程序即可更新 XML 文件中的 SQL。

                【讨论】:

                  【解决方案12】:

                  有些应用程序使用 XML 文件来存储配置,我更喜欢使用 SQLite 来这样做。

                  【讨论】:

                    【解决方案13】:

                    我将从不使用任何类型的 XML 来存储我的数据。

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

                    这样,您的应用程序中的无数对象就不会分布 SQL 字符串生成。使维护更加容易。

                    【讨论】:

                    • “所有对象在 XSLT 中相互发送数据”,真的吗?
                    • 所有通过服务总线进行通信的人。
                    • XSLT 是用于将 XML 转换为不携带信息的语言。我想您可以使用 XSLT 发送数据,因为它是 XML 的一个子集,但您为什么要这样做?
                    • 是的,你是对的 - 我需要改写一下。
                    猜你喜欢
                    • 2011-09-11
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-09-29
                    • 2020-01-10
                    • 2010-09-23
                    • 2020-01-13
                    • 2013-04-06
                    • 2010-09-09
                    相关资源
                    最近更新 更多