与关系数据库相比,使用像MongoDB这样的无模式数据库有什么好处?

时间:2010-01-22 13:13:08

标签: mongodb database

我习惯使用像MySQL或PostgreSQL这样的关系数据库,并结合使用Symfony,RoR或Django等MVC框架,我觉得它很棒。

但是最近我听说很多关于MongoDB的非关系型数据库,或引用official definition

  

可扩展,高性能,开放   源,无架构,面向文档   数据库中。

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

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

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

9 个答案:

答案 0 :(得分:56)

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

  1. 基于文档的数据模型。存储的基本单元类似于JSON,Python字典,Ruby哈希等。这是一个能够容纳数组和其他文档的丰富数据结构。这意味着您通常可以在单个实体中表示一个构造,该构造需要在关系数据库中正确表示多个表。如果您的数据是不可变的,这将特别有用。
  2. 深度查询能力。 MongoDB支持使用基于文档的查询语言对文档进行动态查询,该语言几乎与SQL一样强大。
  3. 没有架构迁移。由于MongoDB是无模式的,因此您的代码定义了您的模式。
  4. 明确的水平可扩展性路径。
  5. 你需要阅读更多关于它的内容并与它一起玩以获得更好的想法。这是一个在线演示:

    http://try.mongodb.org/

答案 1 :(得分: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这样的东西可能没什么意义。这一切都是为了找到合适的工具。

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

编辑:我几乎忘了通过this railscast向您介绍Ryan。它非常有趣,让你想立即开始!

答案 2 :(得分:5)

无模式的优势在于你可以转储你的负载,没有人会抱怨它,或说它是错误的。

这也意味着无论你在其中倾倒什么,在你这样做之后仍然完全没有意义。

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

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

如果没有完善的架构,没有扩展谓词,并且没有扩展预设,用户就无法从其中填充任何含义。

答案 3 :(得分:3)

MongoDB本周出现在FLOSS周刊上 - http://twit.tv/floss105 使用类似概念的数据库是CouchDB,它在另一个FLOSS Weekly上有特色:http://twit.tv/floss36

除了links provided by @marcgg

之外,我认为值得倾听

答案 4 :(得分: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限制都在新版本和版本中得到优化,这些版本在很大程度上克服了以前的限制。”

答案 5 :(得分:2)

这完全取决于权衡。 MongoDB很快但不是ACID,它没有交易。在某些用例中它比MySQL更好,在其他用例中更糟。

答案 6 :(得分:1)

MongoDB中写的Bellow Lines:权威指南。

  

有几个很好的理由:

     
      
  1. 在同一个集合中保存不同类型的文档可以是一个   开发人员和管理员的噩梦。开发人员需要确保   每个查询只返回某种文件或   执行查询的应用程序代码可以处理文档   不同的形状。如果我们要查询博客帖子,那就麻烦了   清除包含作者数据的文件。
  2.   
  3. 获取集合列表比提取集合要快得多   集合中的类型列表。例如,如果我们有一个类型键   在集合中说每个文件是否是“脱脂”   “整个”或“矮胖的猴子”文件,它会慢得多   在一个集合中找到这三个值而不是三个   单独的集合和查询其名称
  4.   
  5. 将同一类文档分组到同一个集合中   允许数据本地化。从a获取几篇博文   仅包含帖子的集合可能需要更少的磁盘   寻求从包含集合的相同帖子中获取   帖子和作者数据。
  6.   
  7. 我们在创建时开始对文档强加一些结构   索引。 (在唯一索引的情况下尤其如此。)   这些索引是按集合定义的。只放文件   对于同一个集合中的单一类型,我们可以索引我们的   收集更有效率
  8.   

答案 7 :(得分:0)

在有文本存储的数据库问题之后),我浏览了MongoDB和类似的系统 如果我理解正确,它们应该更容易使用和设置,并且更快。也许更安全,因为缺少SQL会阻止SQL注入...
显然,MongoDB主要用于Web应用程序 基本上,他们说自己,这些数据库不适合复杂的查询,数据挖掘等。但他们在快速检索大量平面数据方面发挥了重要作用。

答案 8 :(得分:0)

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