与关系型数据库相比,使用无模式数据库(如MongoDB)的优势是什么?

96
我习惯使用类似MySQL或PostgreSQL的关系型数据库,再加上Symfony、RoR或Django等MVC框架,我认为这样做很好。
但是最近我听到了很多关于MongoDB的信息,它是一种非关系型数据库,引用官方定义的话:

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

我对此非常感兴趣,并且想要掌握所有下一个项目可能拥有的选项并选择最好的技术。
在哪些情况下使用MongoDB(或类似的数据库)比使用“传统”关系型数据库更好呢? MongoDB相对于MySQL的优势是什么? 或者至少,它为什么如此不同?
如果您有文档和/或示例的指针,那将会非常有帮助。
8个回答

58
以下是使用 MongoDB 构建 Web 应用程序的一些优势:
  1. 基于文档的数据模型。存储的基本单位类似于 JSON、Python 字典、Ruby 哈希表等。这是一种丰富的数据结构,能够容纳数组和其他文档。这意味着,通常情况下,你可以用单个实体表示一个构造,而在关系型数据库中需要用多个表才能恰当地表示该构造。如果你的数据是不可变的,这将特别有用。
  2. 深层次的查询能力。MongoDB 支持使用基于文档的查询语言对文档进行动态查询,这几乎和 SQL 一样强大。
  3. 无需进行模式迁移。由于 MongoDB 是无模式的,因此你的代码定义了你的模式。
  4. 明确的水平扩展路径。
为了更好地了解 MongoDB,你需要阅读更多相关内容并运用它。这里提供了在线演示:

http://try.mongodb.org/


Mongo提供了一种非常具体的水平扩展路径,在特定的场景中非常有用... - AK_

23

有许多优点。

例如,您的数据库架构将更具可扩展性,无需担心迁移,编写代码将更加愉悦... 例如,这是我的一个模型代码:

class Setting
  include MongoMapper::Document

  key :news_search, String, :required => true
  key :is_availaible_for_iphone, :required => true, :default => false

  belongs_to :movie
end

添加一个键只需要添加一行代码!

长期来看,还有其他优点,比如更好的可扩展性和速度。

...但请记住,非关系型数据库并不比关系型数据库更好。如果您的数据库有很多关系和规范化,使用像MongoDB这样的东西可能没有太大意义。关键是找到适合工作的正确工具。

要阅读更多内容,我建议查看 "为什么我认为Mongo是数据库中的Rails" 或 mongodb网站上的这篇文章。如果你想激动起来,而且你说法语,可以看看这篇文章,它解释了如何从头开始设置MongoDB。

编辑:我差点忘了告诉你 Ryan这个railscast。它非常有趣,让你想立即开始!


5
无架构的优点在于您可以倾倒任何负载,并且没有人会抱怨它,或者说它是错误的。这也意味着您放入其中的任何内容,在此之后将完全缺乏意义。有些人会将其标记为严重缺陷,而有些人则不会。
关系型数据库具有良好建立的模式,这是因为它具有良好建立的外延谓词集合,这使我们能够将意义附加到记录在数据库中的内容,并且这也是我们这样做的必要前提条件。
如果没有良好建立的模式,就没有外延谓词,没有外延谓词,用户就无法从中得出任何含义。

1
这实际上是一个反答案。大多数人理解的含义不仅仅来自关系概念。事实上,对于大多数应用程序开发人员来说,从高度规范化的模式中辨别含义比从文档存储中更难。 - user1020853
1
意义按照逻辑推理,源于命题。当谓词中的自由位置被实际数据项取代时,命题就会产生。但这些数据项必须来自某个结构。如果有一个结构,那么就有一个模式。因此,如果没有模式,就没有结构可用于构建命题,从而引发意义,除非伸出手指随意想象。这不是反对任何事物或支持任何事物,这是一个简单的事实。 - Erwin Smout
3
这只是一种看法,仅适用于相当狭窄的智力背景(而且这是哲学性的观点,而不是逻辑性的观点)。您的回答基本上是“如果您没有像关系数据库那样的架构,则没有意义。”这几乎不是对“有什么优势”的原始问题的回答,因此我称其为反答案。除非我们将“意义”限制在您所处的这种狭窄背景下,否则这也并不完全正确。没有“良好建立的架构”,也有足够的空间来表达“意义”。 - user1020853
1
那么你能否向我展示一下你对“意义”的“更广泛”观点是什么样的,以及它如何在没有逻辑谓词或命题的情况下存在。请注意,我的评论没有一次提到“关系”的字眼。预关系数据技术具有模式,因此适合推断“意义”。预数据库技术具有模式,因此适合推断“意义”。无模式具有没有模式(除非“自由”部分是彻头彻尾的谎言),因此不适合推断“意义”。... - Erwin Smout
1
是的,还有其他因素在起作用。这些数据库的设计者使用了一个数据模型(Codd意义上),该模型明确地促进了记录其信息模型组件的预期含义,但他们却忽略了这一点。这不是技术的错,而是用户的错。我的整个回复仍然适用。模式有助于记录预期含义(以及声明一致性规则的执行),没有模式意味着两者都不可能。 - Erwin Smout
显示剩余2条评论

3

在我的项目中使用过Postgres和Mongo两种数据库,以下是我的经验。

Postgres(RDBMS)

如果你的未来应用程序具有复杂的模式需要大量的连接或者所有数据都有关系,或者我们需要进行大量写入操作,那么建议使用Postgres。Postgres是开源的,更快、ACID兼容,并且在磁盘上使用更少的内存,而且对于JSON存储性能也非常好,包括事务的完全可序列化和3个级别的事务隔离。

坚持使用Postgres最大的优点是我们可以将数据存储到带有约束、一致性和速度的JSONB中。另一方面,我们可以使用所有SQL功能来处理其他类型的数据。底层引擎非常稳定,在各种数据量范围内运行良好。它还可以在您选择的硬件和操作系统上运行。Postgres提供NoSQL能力以及完整的事务支持,可以在字段数据上存储JSON文档。

Postgres的一般限制

Postgres的水平扩展比较困难,但是可以做到。

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

NO SQL数据库

Mongo DB (Wired Tiger)

MongoDB在“水平扩展”的维度上可能会超过Postgres。存储JSON是Mongo的优化重点。Mongo将数据存储在一种名为BSONb的二进制格式中,它(大致)只是JSON的超集的二进制表示。MongoDB完全按照设计存储对象。根据MongoDB的说法,对于写入密集型应用程序,新引擎(Wired Tiger)可以使用户的写入性能提高多达10倍(我应该尝试一下),并且存储利用率降低了80%,有助于降低存储成本,实现更大程度的硬件利用率。

MongoDb的一般限制

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

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


2

这一切都是权衡取舍。MongoDB速度快但不支持ACID,没有事务。在某些用例中,它比MySQL更好,而在其他情况下则更差。


请现在查看此评论。MongoDb 4.0 现在支持 ACID 事务。 - Anant Simran Singh

1
下面的内容是在《MongoDB权威指南》中编写的。
有几个很好的理由:
  1. 将不同类型的文档放在同一个集合中对开发人员和管理员来说可能是一场噩梦。开发人员需要确保每个查询仅返回某种类型的文档,或者执行查询的应用程序代码可以处理不同形状的文档。如果我们正在查询博客文章,那么排除包含作者数据的文档非常麻烦。
  2. 获取集合列表比提取集合中类型列表快得多。例如,如果我们在集合中有一个类型键,该键指示每个文档是“skim”,“whole”还是“chunky monkey”文档,那么在单个集合中查找这三个值要比查询其名称的三个单独的集合慢得多。
  3. 将相同类型的文档分组放在同一个集合中允许进行数据局部性。从仅包含帖子的集合中获取几篇博客文章可能需要比从包含帖子和作者数据的集合中获取相同的帖子少得多的磁盘寻道。
  4. 当我们创建索引时,开始对文档施加一些结构。(在唯一索引的情况下尤其如此。)这些索引是针对集合定义的。通过仅将单个类型的文档放入同一个集合中,我们可以更有效地索引集合。

0

在对文本存储数据库的疑问之后,我看了一下MongoDB和类似的系统。
如果我理解正确的话,它们应该更容易使用和设置,并且速度更快。由于缺少SQL,它们可能也更安全,因为可以防止SQL注入攻击...
显然,MongoDB主要用于Web应用程序。
基本上,他们本身就表明,这些数据库不适用于复杂查询、数据挖掘等。但是它们在快速检索大量扁平数据方面非常出色。


1
你的回答中存在一些误解。虽然MongoDB不容易受SQL注入攻击,但还是存在其他类型的注入攻击。在查询的$where子句中,可以指定任意JavaScript代码。此外,与许多其他NoSQL选项不同,MongoDB实际上可以执行一些相当复杂的查询。 - Emily
感谢您提供的详细信息。请注意,正如我所说,是MongoDB网站本身对关系查询施加了限制。除非我误解了其他内容... - PhiLho
他们似乎说MongoDB不适合复杂的关系查询,但对于复杂的非关系查询,它非常适合。请查看http://www.mongodb.org/display/DOCS/Advanced+Queries,了解一些很酷的功能。 - Emily

0
  1. MongoDB支持按字段搜索、正则表达式搜索。还包括用户定义的JavaScript函数。
  2. MongoDB可以用作文件系统,利用负载均衡和数据复制功能在多台机器上存储文件。

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