NoSQL - MongoDB vs CouchDB

155

当涉及到NoSQL运动时,我完全是个新手。我听说过许多关于MongoDB和CouchDB的事情。我知道这两者之间存在差异。您建议我学习哪一个作为进入NoSQL世界的第一步?


作为第一步,MongoDB更好,因为它更容易学习,但它也有一些问题。没有最好的选择来使用特定的NoSQL数据库,这取决于你要做什么。请查看面向文档、键值、面向图形和列式的数据库。 - Chris
4个回答

150

请查看以下链接

更新:我找到了一篇很好的NoSQL数据库比较文章。

MongoDB(3.2)

  • 编写语言:C++
  • 主要特点:JSON文档存储
  • 许可证:AGPL(驱动程序:Apache)
  • 协议:自定义、二进制(BSON)
  • 主/从复制(使用副本集实现自动故障转移)
  • 内置分片
  • 查询是JavaScript表达式
  • 可以在服务器端运行任意JavaScript函数
  • 具有地理空间索引和查询功能
  • 多个存储引擎,具有不同的性能特点
  • 性能优先于功能
  • 文档验证
  • 日志记录
  • 强大的聚合框架
  • 在32位系统上,限制为约2.5GB
  • 集成文本搜索
  • GridFS用于存储大型数据和元数据(实际上不是一个文件系统)
  • 数据中心感知

最佳使用场景:如果需要动态查询。如果您更喜欢定义索引而不是Map/Reduce函数。如果您需要对大型数据库进行良好的性能表现。如果您想使用CouchDB,但是数据变化太大,导致磁盘空间被填满。

例如:对于大多数MySQL或PostgreSQL可以处理的事情,但是预定义列真的阻碍了您的工作。

CouchDB (1.2)

  • 使用 Erlang 编写
  • 主要特点:数据库的一致性和易于使用
  • 许可证:Apache
  • 协议:HTTP/REST
  • 双向复制,可以是连续的或临时的,并带有冲突检测,因此支持主-主复制。
  • MVCC - 写操作不会阻塞读操作
  • 可用以前版本的文档
  • 崩溃时安全(可靠)的设计
  • 需要定期压缩
  • 视图:内置 map/reduce
  • 格式化视图:列表和显示
  • 可以进行服务器端文档验证
  • 可以进行身份验证
  • 通过 '_changes' 进行实时更新
  • 附件处理

最适用于: 累积、偶尔更改的数据,并在其中运行预定义的查询。版本控制很重要的场景。

例如: 客户关系管理系统 (CRM)、内容管理系统 (CMS)。主-主复制是一个特别有趣的功能,允许轻松的多站点部署。


1
对于任何关心MongoDB服务器许可证为AGPL的人,查看mongodb的许可政策可能会提供一些缓解。 - Patrick
@amra 所以,您的意思是如果我仅保存数据并读取它,使用couchdb是最好的选择? - verystrongjoe
@verystrongjoe 这取决于数据和查询的复杂性。通常无法确定哪一个是最好的。 - amra
@amra 好的。但是,如果它需要累积数据并选择数据,而我必须在Mongo和Couch之间进行选择,哪一个更好? - verystrongjoe
自2012年以来,CouchApps已经“不再推荐使用”:http://docs.couchdb.com/en/latest/ddocs/ - Tim Sylvester

123

如果你来自MySQL的世界,由于MongoDB支持类似查询语言,它会给你更加自然的感觉。

我认为这是让MongoDB变得友好的原因之一。

如果你想要利用非常棒的主-主复制支持,在多节点设置中使用CouchDB可能会很不错,比如在不同的数据中心中等等。

MongoDB的复制(副本集)是一个主-从-从-从-*的设置,你只能向副本集中的主写入并从任何一个读取。

对于标准的网站配置,这很好。它非常适合映射到MySQL的使用。

但是,如果你试图创建像CDN这样的全球服务,需要保持所有全局节点同步并实现读/写,那么像CouchDB中的复制就会对你有很大的帮助。

虽然MongoDB有一个类似查询语言的东西,而且感觉非常直观,但是CouchDB采用了“map-reduce”方法和视图的概念。起初感觉有些奇怪,但是当你掌握它之后,它真的很直观。

这里是一个快速概述,以便让它有些意义:

  • CouchDB将所有数据存储在B-tree中
  • 你不能使用类似“SELECT * FROM user WHERE…”这样的动态查询
  • 相反,你定义了离散的“视图”来查看你的数据……“这里是我的所有用户视图”,“这里是大于10岁的所有用户视图”,“这里是大于30岁的所有用户视图”等等。
  • 这些视图使用map-reduce方法定义,并被定义为JavaScript函数。
  • 当你定义一个视图时,数据库开始通过它向你分配视图的数据库的所有文档进行馈送,并将你的函数结果记录为该数据上的“索引”。
  • 有一些基本的查询可以在视图上执行,比如请求特定的键(ID)或键范围,不管你的map/reduce函数做了什么。
  • 阅读这些幻灯片,它是我见过的Couch中map/reduce最好的解释。
  • 所以这两个数据存储都使用JSON文档,但CouchDB采用的是“每个服务器都是主服务器,可以与全球同步”的方法,如果需要这种方式,则非常棒,而MongoDB则真正成为了NoSQL世界中的MySQL。

    因此如果这听起来更像你需要/想要的,请选择MongoDB。

    像Mongo的二进制协议与CouchDB的RESTful接口之类的小差异都是次要细节。

    如果你想追求原始速度并且不在乎数据安全,你可以让Mongo比CouchDB更快,因为你可以告诉它在内存中运行,并且除了稀疏时间点外不会将数据写入磁盘。

    你也可以对Couch做同样的事情,但在这种“速度至上!”的场景中,它基于HTTP的通信协议将比Mongo中的原始二进制通信慢2-4倍。

    请记住,即使您在执行实时交易系统(此时请参考Redis),原始疯狂的速度如果服务器崩溃或磁盘故障导致数据库损坏,那么这个数据点也不像它看起来那么惊人。

    希望这些都能帮助到你!


    “MongoDB 真的是 NoSQL 世界中的 MySQL” - 我不知道事情是否有所改变,但这篇 2014 年的文章持不同意见:http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/ - Onur Yıldırım
    虽然在精神上宽松的情况下,我认为评论仍然有效,但你是对的,在过去的半个十年中发生了很多变化,我的评论应该很容易被驳回。 - Riyad Kalla


    1

    现在市场上有比以往更多的NoSQL数据库。如果您正在寻找一个适合企业应用的数据库,建议查看Gartner魔力象限,考虑支持、可扩展性、管理和成本等因素。

    http://www.gartner.com/technology/reprints.do?id=1-23A415Q&ct=141020&st=sb

    我建议任何未尝试过Couchbase的人使用它,但不建议使用报告中显示的版本(2.5.1),因为它几乎比CB服务器今天的版本落后了两个修订版本,并且在2015年下半年即将发布4.0版本。

    http://www.couchbase.com/coming-in-couchbase-server-4-0

    作为供应商/产品的另一个方面是,Couchbase是一种多用途的数据库。它可以作为纯K/V存储、支持多维缩放的文档导向数据库、Memcached、带有持久性的缓存以及支持符合ANSI 92标准的SQL自动连接,只需按下一个按钮即可复制到DR集群,并且甚至还具有内置于生态系统中的移动组件。
    如果没有别的,最新的基准测试也值得一看:

    http://info.couchbase.com/Benchmark_MongoDB_VS_CouchbaseServer_HPW_BM.html http://info.couchbase.com/NoSQL-Technical-Comparison-Report.html


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