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.JSON
import groovyx.net.http.RESTClient
def 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 == 1
response.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是一个更好的选择。关于这两个数据库的安全性,研究仍在进行中,很难说哪一个提供了更好的和安全的环境。