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

简介: 「文档数据库之争」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是一个更好的选择。关于这两个数据库的安全性,研究仍在进行中,很难说哪一个提供了更好的和安全的环境。

          相关文章
          |
          6月前
          |
          NoSQL MongoDB 数据库
          数据库数据恢复—MongoDB数据库数据恢复案例
          MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
          |
          6月前
          |
          缓存 NoSQL Linux
          在CentOS 7系统中彻底移除MongoDB数据库的步骤
          以上步骤完成后,MongoDB应该会从您的CentOS 7系统中被彻底移除。在执行上述操作前,请确保已经备份好所有重要数据以防丢失。这些步骤操作需要一些基本的Linux系统管理知识,若您对某一步骤不是非常清楚,请先进行必要的学习或咨询专业人士。在执行系统级操作时,推荐在实施前创建系统快照或备份,以便在出现问题时能够恢复到原先的状态。
          568 79
          |
          6月前
          |
          存储 NoSQL MongoDB
          MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
          MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
          319 8
          MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
          |
          5月前
          |
          运维 NoSQL 容灾
          告别运维噩梦:手把手教你将自建 MongoDB 平滑迁移至云数据库
          程序员为何逃离自建MongoDB?扩容困难、运维复杂、高可用性差成痛点。阿里云MongoDB提供分钟级扩容、自动诊断与高可用保障,助力企业高效运维、降本增效,实现数据库“无感运维”。
          |
          4月前
          |
          缓存 关系型数据库 BI
          使用MYSQL Report分析数据库性能(下)
          使用MYSQL Report分析数据库性能
          424 158
          |
          4月前
          |
          关系型数据库 MySQL 数据库
          自建数据库如何迁移至RDS MySQL实例
          数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
          |
          4月前
          |
          关系型数据库 MySQL 数据库
          阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
          阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
          947 152
          |
          4月前
          |
          关系型数据库 MySQL 数据库
          阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
          阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
          788 156
          |
          4月前
          |
          缓存 监控 关系型数据库
          使用MYSQL Report分析数据库性能(中)
          使用MYSQL Report分析数据库性能
          394 156
          |
          4月前
          |
          缓存 监控 关系型数据库
          使用MYSQL Report分析数据库性能(上)
          最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
          495 161

          热门文章

          最新文章

          推荐镜像

          更多