「文档数据库之争」MongoDB和CouchDB的比较

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 「文档数据库之争」MongoDB和CouchDB的比较

MongoDB和CouchDB都是基于文档的NoSQL数据库类型。文档数据库又称mdocument store,通常用于存储半结构化数据的文档格式及其详细描述。它允许创建和更新程序,而不需要引用主模式。移动应用程序中的内容管理和数据处理是可以应用文档存储的两个字段。

MongoDB的概述

MongoDB是10gen的初创公司,它起源于2007年。它来自于文档存储家族,是典型的NoSQL数据库之一,无模式,具有较高的性能、可伸缩性和丰富的数据处理功能。这个开源数据库是用c++编写的,使用了动态模式。MongoDB的体系结构包含了根据文档结构分组为集合的文档。该数据库使用BSON。BSON是JSON的二进制表示,支持文档存储和数据交换。在MongoDB中,业务主题可以存储在最少数量的文档中,这些文档可以主要或次要地建立索引,而不会将它们分割成多个关系文档。

除了MongoDB的上述功能之外,它还提供了一个大型副本集集合,其中每个集合可以包含多个数据副本。在复制集中,所有的主函数(读和写)都在主函数集中执行,而在前一个函数失败时使用辅助函数集。MongoDB合并了sharding,它使用了水平伸缩过程。这个文档存储数据库的负载平衡属性是合理的,因为它运行在多个服务器上,因此提供了数据的重复和负载的平衡。作为回报,它还在硬件故障期间提供备份。它还使用了网格文件系统,该系统将特定的文件划分为不同的部分并分别存储它们。

MongoDB的共同特点:

  • 数据模型设计减少了对连接的需求,并提供了模式的简单演进。
  • 高性能,因为它既不包含连接,也不包含提供快速访问的事务,因此提高了性能。
  • 高可用性是由于合并了副本集,这些副本集能够在故障期间提供备份,而且非常健壮。
  • 在可伸缩性。
  • MongoDB的分片特性使它能够在分布式函数中快速高效地执行。这也是可能的,因为它支持数据的水平扩展。
  • 语言是非常丰富的查询。MongoDB有自己的查询语言Mongo查询语言,可以替代SQL语言。类似地,实用函数和map或reduce可以替代复杂的聚合函数。


图1:MongoDB架构

CouchDB的概述

CouchDB是Apache Software Foundation的一个产品,灵感来自于Lotus Notes,它也是一个基于文档的开源NoSQL数据库,主要关注于易于使用。它是一个单节点数据库,完全像其他数据库一样工作。它通常从单个节点实例开始,但可以无缝地升级到集群。它允许用户在许多服务器或vm上运行单个数据库。与单节点CouchDB相比,CouchDB集群提供了高容量和高可用性。它使用Erlang,一种通用语言。和MongoDB一样,它也使用javascript和map/reduce。它以文档集合的形式而不是表的形式存储数据。更新后的CouchDB是无锁的,这意味着在写操作期间不需要锁定数据库。这个数据库中的文档还使用了HTTP协议和JSON,以及向它们附加非JSON文件的能力。因此,CouchDB与任何支持JSON格式的应用程序或软件兼容。

CouchDB的常见特性

  • CouchDB服务器托管命名数据库,命名数据库存储数据库中唯一命名的文档,CouchDB提供一个RESTful HTTP API,用于读取和更新(添加、编辑、删除)数据库文档
  • CouchDB提供了一个基于浏览器的GUI来处理数据、权限和配置。
  • CouchDB提供了最简单的复制形式。
  • CouchDB促进了身份验证和会话支持:像web应用程序一样通过会话cookie保持身份验证打开。
  • CouchDB提供数据库级安全性,其中每个数据库的权限被划分为读者和管理员。允许读取器对CouchDB数据库进行读写。
  • CouchDB使用身份验证验证插入到数据库中的数据,以验证创建者和登录会话id是否相同。


CouchDB架构

REST API用于编写和查询数据。它还提供文档读取、添加、编辑和删除功能。它通过MVCC实现使用ACID模型而不是BASE。就像MongoDB支持设备离线时的复制一样。它使用一种称为最终一致性的特殊复制模型。CouchDB在数据方面是高度可靠的。单节点数据库使用仅追加的抗崩溃数据结构,而多模式或集群数据库可以冗余地保存数据,以便在用户需要时提供数据。CouchDB可以根据大集群(如全球集群)扩展到小集群(如移动设备)。CouchDB能够在任何Android或iOS设备上运行,这使得它在其他数据库中脱颖而出。

CouchDB体系结构是分布式的,支持双向同步。由于使用唯一id,它不需要任何模式。尽管CouchDB遵循CAP模型的AP(可用性和分区容错)特性,但为了克服交易一致性,它在实际基础上遵循ACID模型。

CouchDB和MongoDB的比较

特性 CouchDB MongoDB
数据模型 它遵循面向文档的模型,数据以JSON格式表示。 它遵循面向文档的模型,但数据以BSON格式表示
接口 CouchDB使用基于HTTP/ REST的接口。它非常直观,设计非常好。 MongoDB在TCP/IP上使用二进制协议和自定义协议。
对象存储 在CouchDB中,数据库包含文档。 在MongoDB中,数据库包含集合,而集合包含文档。
速度 它的读取速度是关键的数据库,MongoDB比CouchDB快 MongoDB提供了更快的读取速度。
手机支持 CouchDB可以运行在苹果iOS和Android设备上,为移动设备提供支持。 没有提供移动支援
大小 数据库可以随着CouchDB而增长;当结构从一开始就没有明确定义时,MongoDB更适合快速增长。 如果我们有一个快速增长的数据库,MongoDB是更好的选择。
查询方法 查询使用map-reduce函数。虽然它可能是一种优雅的解决方案,但对于具有传统SQL经验的人来说,学习它可能更加困难。 MongoDB采用Map/Reduce (JavaScript)创建基于集合+对象的查询语言。对于有SQL知识的用户,MongoDB更容易学习,因为它更接近语法。
复制 CouchDB支持使用自定义冲突解决功能的主-主复制。 MongoDB支持主从复制。
并发性 它遵循MVCC(多版本并发控制)。 就地更新。
首选项 CouchDB支持可用性。 MongoDB支持一致性
性能的一致性 CouchDB比MongoDB更安全
一致性 CouchDB最终是一致的。 MongoDB是强一致性的。
编写语言 Erlang C++.
分析 如果我们需要一个在移动设备上运行的数据库,需要主-主复制或单服务器持久性,那么CouchDB是一个很好的选择。 如果我们正在寻找最大的吞吐量,或者有一个快速增长的数据库,MongoDB是最好的选择。


CouchDB和MongoDB:截然不同的查询

CouchDB和MongDB都是面向文档的数据存储,它们使用JSON文档,但是当涉及到查询时,这两个数据库就完全不同了。CouchDB需要预定义的视图(本质上是JavaScript的MapReduce函数),MongoDB支持动态查询(基本上是我们习惯的常规RDBMS特别SQL查询)。

例如,为了使用Groovy的RESTClient在CouchDB中插入一些数据,并发出一个RESTful post,如下所示:

    import static groovyx.net.http.ContentType.JSONimport groovyx.net.http.RESTClientdef client = new RESTClient("http://localhost:5498/")response = client.put(path: "parking_tickets/1280002020",contentType: JSON,requestContentType: JSON,body: [officer: "Micheal Jordan",location: "189 Berkely Road",vehicle_plate: "KL5800",offense: "Parked in no parking zone",date: "2020/02/01"])

    示例代码查询任何官员财产为“Micheal Jordan”的文件的函数:


    function(doc) {if(doc.officer == "Micheal Jordan"){emit(null, doc);}}

    当我们发出一个HTTP GET请求到那个视图的名字,我们可以期望至少一个文档如下:


      response = client.get(path: "parking_tickets/_view/by_name/officer_grey",contentType: JSON, requestContentType: JSON)assert response.data.total_rows == 1response.data.rows.each{assert it.value.officer == "Micheal Jordan"}

      MongoDB的工作方式很像我们习惯使用的普通数据库:我们可以在运行时查询我们内心想要的任何东西。

      使用MongoDB的本地Java驱动程序插入停车罚单的相同实例:

        DBCollection coll = db.getCollection("parking_tickets");BasicDBObject doc = new BasicDBObject();doc.put("officer", "Micheal Jordan");doc.put("location", "189 Berkely Road ");doc.put("vehicle_plate", "KL5800");//...coll.insert(doc);

        只需对警官的财产进行查询,即可查询警官Micheal Jordan从MongoDB发出的任何罚单:

          BasicDBObject query = new BasicDBObject();query.put("officer", "Micheal Jordan");DBCursor cur = coll.find(query);while (cur.hasNext()) {System.out.println(cur.next());}

          结论

          在这个博客中,我们比较了两种基于文档的NoSQL数据库——MongoDB和CouchDB。该表概述了这两个数据库之间的主要参数比较。正如我们所看到的,项目的优先级将决定系统的选择。主要区别包括复制方法和平台支持。而且,从比较中可以清楚地看出,如果应用程序需要更高的效率和速度,那么MongoDB是比CouchDB更好的选择。如果用户需要在移动设备上运行数据库,并且还需要多主机复制,那么CouchDB是一个明显的选择。此外,如果数据库快速增长,MongoDB比CouchDB更适合。使用CouchDB的主要优势是它在移动设备(Android和iOS)上得到支持,而不是在MongoDB上。因此,基本上,不同的应用程序需求会根据场景需要不同的数据库。

          我们观察到MongoDB比CouchDB稍微好一点,因为它使用类似sql的查询结构,而且前者更容易实现。另外,对于使用动态查询,MongoDB是一个更好的选择。关于这两个数据库的安全性,研究仍在进行中,很难说哪一个提供了更好的和安全的环境。

          相关实践学习
          MongoDB数据库入门
          MongoDB数据库入门实验。
          快速掌握 MongoDB 数据库
          本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
          相关文章
          |
          6天前
          |
          存储 JSON NoSQL
          学习 MongoDB:打开强大的数据库技术大门
          MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
          31 15
          |
          14天前
          |
          存储 NoSQL 关系型数据库
          阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
          我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
          阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
          |
          1月前
          |
          NoSQL Cloud Native atlas
          探索云原生数据库:MongoDB Atlas 的实践与思考
          【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
          |
          2月前
          |
          NoSQL Cloud Native atlas
          探索云原生数据库:MongoDB Atlas 的实践与思考
          【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
          |
          2月前
          |
          存储 关系型数据库 MySQL
          一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
          一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
          |
          3月前
          |
          存储 NoSQL 关系型数据库
          非关系型数据库-MongoDB技术(二)
          非关系型数据库-MongoDB技术(二)
          |
          3月前
          |
          NoSQL 关系型数据库 MongoDB
          非关系型数据库-MongoDB技术(一)
          非关系型数据库-MongoDB技术(一)
          |
          2月前
          |
          存储 NoSQL MongoDB
          MongoDB 数据库引用
          10月更文挑战第20天
          24 1
          |
          2月前
          |
          存储 NoSQL Shell
          MongoDB 创建数据库
          10月更文挑战第12天
          90 4
          |
          2月前
          |
          存储 NoSQL MongoDB
          基于阿里云数据库MongoDB版,微财数科“又快又稳”服务超7000万客户
          选择MongoDB主要基于其灵活的数据模型、高性能、高可用性、可扩展性、安全性和强大的分析能力。