【问题标题】:What are the advantages of using a schema-free database like MongoDB compared to a relational database?与关系数据库相比,使用像 MongoDB 这样的无模式数据库有什么优势?
【发布时间】:2011-01-08 05:03:25
【问题描述】:

我习惯使用 MySQL 或 PostgreSQL 等关系型数据库,并结合 Symfony、RoR 或 Django 等 MVC 框架,我认为效果很好。

但最近我听说了很多关于 MongoDB 的消息,它是一个非关系型数据库,或者引用 official definition

一个可扩展的、高性能的、开放的 源,无模式,面向文档 数据库。

我真的对处于领先地位很感兴趣,并且想了解我在下一个项目中的所有选择,并从中选择最好的技术。

在哪些情况下使用 MongoDB(或类似数据库)比使用“经典”关系数据库更好? 总体而言,MongoDB 与 MySQL 的优势是什么? 或者至少,为什么会如此不同?

如果您有文档和/或示例的指针,那也会有很大帮助。

【问题讨论】:

    标签: mongodb database


    【解决方案1】:

    以下是 MongoDB 在构建 Web 应用程序方面的一些优势:

    1. 基于文档的数据模型。存储的基本单元类似于 JSON、Python 字典、Ruby 哈希等。这是一种能够保存数组和其他文档的丰富数据结构。这意味着您通常可以在单个实体中表示需要多个表才能在关系数据库中正确表示的构造。如果您的数据是不可变的,这尤其有用。
    2. 深度查询能力。 MongoDB 支持使用几乎与 SQL 一样强大的基于文档的查询语言对文档进行动态查询。
    3. 没有架构迁移。由于 MongoDB 是无模式的,因此您的代码定义了您的模式。
    4. 水平可扩展性的清晰路径。

    您需要阅读有关它的更多信息并使用它以获得更好的想法。这是一个在线演示:

    http://try.mongodb.org/

    【讨论】:

    • Mongo 提供了一个非常具体的水平扩展路径,在特定场景下很有用......
    【解决方案2】:

    有很多优点。

    例如,您的数据库架构将更具可扩展性,您不必担心迁移,代码编写起来会更愉快...例如,这是我的模型的代码之一:

    class Setting
      include MongoMapper::Document
    
      key :news_search, String, :required => true
      key :is_availaible_for_iphone, :required => true, :default => false
    
      belongs_to :movie
    end
    

    加个key就是加一行代码!

    从长远来看,还会出现其他优势,例如更好的可扩展性和速度。

    ... 但请记住,非关系数据库并不比关系数据库更好。如果您的数据库有很多关系和规范化,那么使用 MongoDB 之类的东西可能没什么意义。一切都是为了找到适合工作的工具。

    要了解更多内容,我建议您查看 mongodb 网站上的“Why I think Mongo is to Databases what Rails was to Frameworks”或this post。如果您会说法语,请查看 this article,了解如何从头开始设置 MongoDB。

    编辑:我差点忘了通过Ryan 告诉你this railscast。这很有趣,让你想马上开始!

    【讨论】:

      【解决方案3】:

      无模式的优点是您可以转储其中的任何负载,没有人会抱怨它或说它是错误的。

      这也意味着无论你倾倒在其中的任何东西,在你这样做之后仍然完全没有意义。

      有些人会认为这是一个严重的劣势,有些人不会。

      关系数据库具有完善的架构这一事实是因为它具有一组完善的扩展谓词,这些谓词使我们能够为数据库中记录的内容附加意义,这也是我们这样做的必要前提。

      如果没有完善的模式,没有外延谓词,也没有外延谓词,用户就无法从其中填充的内容中获得任何意义。

      【讨论】:

      • 这确实是一个反答案。正如大多数人所理解的那样,大多数意义不仅仅来自关系概念。事实上,对于大多数应用程序开发人员来说,从高度规范化的模式中辨别意义比在文档存储中更难。
      • 意义,正如逻辑所言,源自命题。如果并且当这些空闲位置被实际数据项替换时,命题可以从具有空闲位置的谓词中产生。但是这些数据项必须来自一个结构。如果有一个结构,那么就有一个模式。因此,如果没有图式,就没有结构可以用来构建命题,然后产生意义,除非将手指伸向空中并编造一个。这不是反对任何事情或支持任何事情,这是一个简单明了的事实。
      • 这只是一种意义观点,只适合非常狭窄的知识背景(这是一种哲学背景,而不是逻辑背景)。你的回答基本上是“如果你没有像关系数据库那样的模式,那么你就没有意义。”这很难回答最初的“优势是什么?”的问题。因此我称之为反答案。这也不是真的,除非我们将“意义”限制在你来自的这个狭隘的上下文中。没有“完善的模式”,“意义”还有很大的空间。
      • 那么您如何向我展示您对“意义”的“更广泛”观点是什么样的,以及它如何在没有逻辑的谓词或命题的情况下存在。请注意,我的评论一次没有提到“关系”这个词。前关系数据技术具有模式,因此适合推断“意义”。前数据库技术有模式,因此适合推断“意义”。无模式没有模式(除非“免费”部分是彻头彻尾的谎言),因此不适合推断“意义”。 ...
      • ... 无模式迫使其用户进入猜谜游戏。即使这些用户能够在 90% 或 99% 的时间里做对,它仍然只是一个猜谜游戏。
      【解决方案4】:

      在我的项目中使用这两个数据库后,我对 Postgres 和 Mongo 的体验。

      Postgres(RDBMS)

      如果您未来的应用程序具有需要大量连接的复杂架构,或者所有数据都具有关系,或者如果我们编写繁重的工作,建议使用 Postgres。 Postgres 是开源的、速度更快、符合 ACID 并且使用更少的磁盘内存,并且在 JSON 存储方面也具有良好的性能,并且包括具有 3 级事务隔离的事务的完全可序列化性。

      使用 Postgres 的最大优势是我们拥有两全其美的优势。我们可以将数据存储到具有约束、一致性和速度的 JSONB 中。另一方面,我们可以将所有 SQL 特性用于其他类型的数据。底层引擎非常稳定,可以很好地应对各种数据量。它还可以在您选择的硬件和操作系统上运行。 Postgres 提供 NoSQL 功能以及完整的事务支持,存储带有字段数据约束的 JSON 文档。

      Postgres 的一般约束

      横向扩展 Postgres 要困难得多,但可行。

      使用 Postgres 无法完全实现快速读取操作。

      没有 SQL 数据库

      Mongo DB(有线老虎)

      MongoDB 在“水平尺度”维度上可能会击败 Postgres。存储 JSON 是 Mongo 的优化目标。 Mongo 以称为 BSONb 的二进制格式存储其数据,它(大致)只是 JSON 超集的二进制表示。 MongoDB 完全按照设计的方式存储对象。根据 MongoDB 的说法,对于写入密集型应用程序,Mongo 表示,新引擎(Wired Tiger)为用户提供高达 10 倍的写入性能提升(我应该试试这个),存储利用率降低 80%,有助于降低存储成本,实现更高的硬件利用率。

      MongoDb 的一般约束

      使用无模式存储引擎会导致隐式模式问题。这些模式不是由我们的存储引擎定义的,而是基于应用程序行为和期望定义的。

      独立的 NoSQL 技术不符合 ACID 标准,因为它们牺牲了关键数据保护以支持非结构化应用程序的高吞吐量性能。在 NoSQL 数据库上应用 ACID 并不难,但它会在某种程度上使数据库变得缓慢和不灵活。 “大部分 NoSQL 限制都在较新的版本和发行版中进行了优化,在很大程度上克服了之前的限制”。

      【讨论】:

        【解决方案5】:

        这都是关于权衡的。 MongoDB 速度快但不是 ACID,它没有事务。在某些用例中它比 MySQL 更好,而在另一些用例中则更差。

        【讨论】:

        • 请立即查看此评论。 MongoDb 4.0 现在支持酸性事务。
        【解决方案6】:

        用 MongoDB 编写的波纹管:权威指南。

        有几个很好的理由:

        1. 将不同类型的文档保存在同一个集合中可能是一种 开发人员和管理员的噩梦。开发人员需要确保 每个查询只返回某种类型的文档或 执行查询的应用程序代码可以处理 不同的形状。如果我们要查询博客文章,那很麻烦 清除包含作者数据的文档。
        2. 获取集合列表比提取集合列表快得多 集合中的类型列表。例如,如果我们有一个类型键 在说明每个文档是否是“略读”的集合中, “whole”或“chunky monkey”文档,它会慢得多 在单个集合中找到这三个值而不是拥有三个 单独的集合并查询它们的名称
        3. 在同一个集合中将同类文档分组在一起 允许数据局部性。从一个 仅包含帖子的集合可能需要更少的磁盘 寻找而不是从包含 帖子和作者数据。
        4. 当我们创建文档时,我们开始对文档强加一些结构 索引。 (在唯一索引的情况下尤其如此。) 这些索引是按集合定义的。只放文件 将单个类型放入同一个集合中,我们可以索引我们的 更高效地收藏

        【讨论】:

          【解决方案7】:

          在询问了具有文本存储的数据库之后),我看了一眼 MongoDB 和类似的系统。
          如果我理解正确,它们应该更易于使用和设置,而且速度更快。也许也更安全,因为缺少 SQL 可以防止 SQL 注入...
          显然,MongoDB 主要用于 Web 应用程序。
          基本上,他们自己说,这些数据库不适合复杂的查询、数据挖掘等。但它们擅长快速检索大量平面数据。

          【讨论】:

          • 您的回答中有几个误解。虽然 MongoDB 不容易受到 SQL 注入的影响,但它更容易受到注入的影响。您可以在查询的 $where 子句中指定任意 Javascript。此外,与许多其他 NoSQL 选项不同,MongoDB 实际上可以执行一些非常复杂的查询。
          • 感谢您的精确。请注意,正如我所说,是 MongoDB 站点本身对关系查询发出了限制。除非我误解了别的东西……
          • 他们似乎很可能说 MongoDB 不适合复杂的关系查询,但对于复杂的非关系查询,它非常适合。看看mongodb.org/display/DOCS/Advanced+Queries,了解一些你可以做的很酷的事情。
          【解决方案8】:
          1. MongoDB 支持按字段搜索、正则表达式搜索。包括用户定义的 java 脚本函数。
          2. MongoDB 可用作文件系统,利用多台机器上的负载平衡和数据复制功能来存储文件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-19
            • 2018-01-07
            • 1970-01-01
            • 2021-02-01
            • 1970-01-01
            相关资源
            最近更新 更多