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


95

我习惯于使用关系数据库(如MySQL或PostgreSQL),并与诸如Symfony,RoR或Django的MVC框架结合使用,我认为它很好用。

但是最近我听到了很多有关MongoDB的信息,MongoDB是一个非关系型数据库,或者引用官方定义

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

我真的很感兴趣,希望了解下一个项目的所有选择,并从中选择最好的技术。

在哪种情况下,使用MongoDB(或类似数据库)比使用“经典”关系数据库更好?一般而言,MongoDB与MySQL相比有什么优势?或者至少,为什么如此不同?

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

Answers:


57

以下是MongoDB用于构建Web应用程序的一些优点:

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

您需要阅读更多有关它的内容并尝试使用它,以获得更好的主意。这是一个在线演示:

http://try.mongodb.org/


3
我接受了这个答案,但下面请看其他好的答案。例如,@ marcgg提供了有趣的链接。
纪尧姆·佛兰德

说“更好的表现”具有误导性;这取决于你在做什么。MongoDB不支持联接并不能使其更快,这只是意味着它在简单的数据库操作上会更好(据说,我实际上还没有一个基准来证明这一点)。一旦您需要联接所提供的功能,您在Mongo上的性能就会直线下降。但是,如果您根本不需要联接或关系功能,那么可以肯定,Mongo可能会更具性能/可扩展性。
Sasha Chedygov 2013年

谢谢@SashaChedygov。我同意你的看法。那真是2010年我的草率:)
凯尔·班克

@KyleBanker:不用担心,只是发表评论,以防有人在2013年看到它并弄错了主意。:) +1以进行编辑。
Sasha Chedygov 2013年

Mongo提供了非常具体的水平可伸缩性路径,在特定情况下很有用....
AK_14 2014年

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)的演讲。这非常有趣,让您想立即开始!


似乎很有趣。来看看它,希望我会对它的工作原理有更好的了解。
纪尧姆·法兰德

5

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

这也意味着,无论您转储其中的内容,执行此操作后都将完全没有意义。

有些人会贴上严重的劣势,有些则不会。

关系数据库具有完善的架构这一事实是由于它具有一套完善的扩展谓词这一事实的结果,这些扩展谓词使我们能够将含义附加到数据库中记录的内容以及这也是我们这样做的必要先决条件。

没有完善的模式,没有扩展谓词,也没有扩展谓词,用户将无法从填充的内容中获得任何意义。


1
这确实是一个反答案。正如大多数人所理解的那样,大多数含义不仅仅来自关系概念。实际上,与文档存储相比,对于大多数应用程序开发人员而言,要从高度规范化的模式中识别含义要困难得多。
user1020853 2015年

1
正如逻辑所言,含义源自命题。如果将空闲空间替换为实际数据项,则带有空闲空间的谓词可能会产生命题。但是那些数据项必须来自结构。如果有一个结构,那么就有一个模式。因此,如果没有模式,就没有任何结构可以用来构筑主张,然后提出意义,除非将手指伸到空中,然后举起一只手指。那不是反任何东西或赞成任何东西,这是一个简单的简单事实。
Erwin Smout'3

3
那只是意义的一种观点,并且只适合狭义的思想背景(这是一种哲学的观点,而不是逻辑的观点)。您的答案基本上是“如果没有像关系数据库那样的架构,那么您就没有意义了”。这几乎不是对原始查询“有什么好处?”的答案。因此,我称其为反回答。除非我们将“含义”限制在您所来自的狭窄环境中,否则这也不是真的。没有“建立良好的模式”的“意义”还有很多空间。
user1020853'3

1
那么,您如何向我展示您对“含义”的“广泛”看法是什么样的,以及它在没有逻辑谓词或命题的情况下如何存在。请注意,我的评论没有提及“关系”一词。关系前的数据技术具有模式,因此适合于推断“含义”。数据库前技术具有模式,因此适合于推断“含义”。自由模式没有模式(除非“自由”部分是一个彻头彻尾的谎言),因此不适合推断“含义”。...
Erwin Smout'3

1
...无模式迫使其用户进入猜谜游戏。即使这些用户能够在90%或99%的时间里做到正确,但这仍然只是一个猜谜游戏。
Erwin Smout'3


3

在使用我的项目中的两个数据库后,我在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限制已在较新版本和发行版中进行了优化,这些新版本在很大程度上克服了其先前的限制”。


2

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


请立即查看此评论。MongoDb 4.0现在支持酸交易。
Anant Simran Singh '18

1

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

有几个很好的理由:

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

0

在询问带有文本存储的数据库之后,我浏览了MongoDB和类似的系统。
如果我理解正确,它们应该更易于使用和设置,并且速度更快。也许由于缺少SQL会阻止SQL注入,因此也更加安全。
显然,MongoDB主要用于Web应用程序。
从根本上说,这些数据库本身并不适合复杂的查询,数据挖掘等。但是它们擅长快速检索大量平面数据。


1
您的答案中有一些误解。尽管MongoDB不容易受到SQL注入的攻击,但它更容易受到注入的影响。您可以在查询的$ where子句中指定任意Javascript。而且,与许多其他NoSQL选项不同,MongoDB实际上可以执行一些非常复杂的查询。
艾米丽(Emily)2010年

感谢您的精确度。请注意,正如我所说,是MongoDB网站本身对关系查询发出了限制。除非我误解了其他东西...
PhiLho 2010年

他们似乎很可能说MongoDB不适合复杂的关系查询,但是对于复杂的非关系查询,它非常适合。查看mongodb.org/display/DOCS/Advanced+Queries,了解您可以做的一些有趣的事情。
艾米丽2010年

0
  1. MongoDB支持按字段搜索,正则表达式搜索。包括用户定义的Java脚本函数。
  2. MongoDB可以用作文件系统,利用多台计算机上的负载平衡和数据复制功能来存储文件。
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.