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

MongoDB和CouchDB都是基于文档的NoSQL数据库类型 。 文档数据库又称mdocumentstore , 通常用于存储半结构化数据的文档格式及其详细描述 。 它允许创建和更新程序 , 而不需要引用主模式 。 移动应用程序中的内容管理和数据处理是可以应用文档存储的两个字段 。
MongoDB的概述MongoDB是10gen的初创公司 , 它起源于2007年 。 它来自于文档存储家族 , 是典型的NoSQL数据库之一 , 无模式 , 具有较高的性能、可伸缩性和丰富的数据处理功能 。 这个开源数据库是用c++编写的 , 使用了动态模式 。 MongoDB的体系结构包含了根据文档结构分组为集合的文档 。 该数据库使用BSON 。 BSON是JSON的二进制表示 , 支持文档存储和数据交换 。 在MongoDB中 , 业务主题可以存储在最少数量的文档中 , 这些文档可以主要或次要地建立索引 , 而不会将它们分割成多个关系文档 。
除了MongoDB的上述功能之外 , 它还提供了一个大型副本集集合 , 其中每个集合可以包含多个数据副本 。 在复制集中 , 所有的主函数(读和写)都在主函数集中执行 , 而在前一个函数失败时使用辅助函数集 。 MongoDB合并了sharding , 它使用了水平伸缩过程 。 这个文档存储数据库的负载平衡属性是合理的 , 因为它运行在多个服务器上 , 因此提供了数据的重复和负载的平衡 。 作为回报 , 它还在硬件故障期间提供备份 。 它还使用了网格文件系统 , 该系统将特定的文件划分为不同的部分并分别存储它们 。
MongoDB的共同特点:
数据模型设计减少了对连接的需求 , 并提供了模式的简单演进 。 高性能 , 因为它既不包含连接 , 也不包含提供快速访问的事务 , 因此提高了性能 。 高可用性是由于合并了副本集 , 这些副本集能够在故障期间提供备份 , 而且非常健壮 。 在可伸缩性 。 MongoDB的分片特性使它能够在分布式函数中快速高效地执行 。 这也是可能的 , 因为它支持数据的水平扩展 。 语言是非常丰富的查询 。 MongoDB有自己的查询语言Mongo查询语言 , 可以替代SQL语言 。 类似地 , 实用函数和map或reduce可以替代复杂的聚合函数 。 CouchDB的概述CouchDB是ApacheSoftwareFoundation的一个产品 , 灵感来自于LotusNotes , 它也是一个基于文档的开源NoSQL数据库 , 主要关注于易于使用 。 它是一个单节点数据库 , 完全像其他数据库一样工作 。 它通常从单个节点实例开始 , 但可以无缝地升级到集群 。 它允许用户在许多服务器或vm上运行单个数据库 。 与单节点CouchDB相比 , CouchDB集群提供了高容量和高可用性 。 它使用Erlang , 一种通用语言 。 和MongoDB一样 , 它也使用javascript和map/reduce 。 它以文档集合的形式而不是表的形式存储数据 。 更新后的CouchDB是无锁的 , 这意味着在写操作期间不需要锁定数据库 。 这个数据库中的文档还使用了HTTP协议和JSON , 以及向它们附加非JSON文件的能力 。 因此 , CouchDB与任何支持JSON格式的应用程序或软件兼容 。
CouchDB的常见特性
CouchDB服务器托管命名数据库 , 命名数据库存储数据库中唯一命名的文档 , CouchDB提供一个RESTfulHTTPAPI , 用于读取和更新(添加、编辑、删除)数据库文档CouchDB提供了一个基于浏览器的GUI来处理数据、权限和配置 。 CouchDB提供了最简单的复制形式 。 CouchDB促进了身份验证和会话支持:像web应用程序一样通过会话cookie保持身份验证打开 。 CouchDB提供数据库级安全性 , 其中每个数据库的权限被划分为读者和管理员 。 允许读取器对CouchDB数据库进行读写 。 CouchDB使用身份验证验证插入到数据库中的数据 , 以验证创建者和登录会话id是否相同 。 RESTAPI用于编写和查询数据 。 它还提供文档读取、添加、编辑和删除功能 。 它通过MVCC实现使用ACID模型而不是BASE 。 就像MongoDB支持设备离线时的复制一样 。 它使用一种称为最终一致性的特殊复制模型 。 CouchDB在数据方面是高度可靠的 。 单节点数据库使用仅追加的抗崩溃数据结构 , 而多模式或集群数据库可以冗余地保存数据 , 以便在用户需要时提供数据 。 CouchDB可以根据大集群(如全球集群)扩展到小集群(如移动设备) 。 CouchDB能够在任何Android或iOS设备上运行 , 这使得它在其他数据库中脱颖而出 。
CouchDB体系结构是分布式的 , 支持双向同步 。 由于使用唯一id , 它不需要任何模式 。 尽管CouchDB遵循CAP模型的AP(可用性和分区容错)特性 , 但为了克服交易一致性 , 它在实际基础上遵循ACID模型 。
CouchDB和MongoDB的比较 例如 , 为了使用Groovy的RESTClient在CouchDB中插入一些数据 , 并发出一个RESTfulpost , 如下所示:
importstaticgroovyx.net.http.ContentType.JSON
importgroovyx.net.http.RESTClient
defclient=newRESTClient("http://localhost:5498/")
response=client.put(path:"parking_tickets/1280002020",
contentType:JSON,
requestContentType:JSON,
body:[officer:"MichealJordan",
location:"189BerkelyRoad",
vehicle_plate:"KL5800",
offense:"Parkedinnoparkingzone",
date:"2020/02/01"])
示例代码查询任何官员财产为“MichealJordan”的文件的函数:
function(doc){
if(doc.officer=="MichealJordan"){
emit(null,doc);
}
}
当我们发出一个HTTPGET请求到那个视图的名字 , 我们可以期望至少一个文档如下:
response=client.get(path:"parking_tickets/_view/by_name/officer_grey",
contentType:JSON,requestContentType:JSON)
assertresponse.data.total_rows==1
response.data.rows.each{
assertit.value.officer=="MichealJordan"
}
MongoDB的工作方式很像我们习惯使用的普通数据库:我们可以在运行时查询我们内心想要的任何东西 。
使用MongoDB的本地Java驱动程序插入停车罚单的相同实例:
DBCollectioncoll=db.getCollection("parking_tickets");
BasicDBObjectdoc=newBasicDBObject();
doc.put("officer","MichealJordan");
doc.put("location","189BerkelyRoad");
doc.put("vehicle_plate","KL5800");
//...
coll.insert(doc);
只需对警官的财产进行查询 , 即可查询警官MichealJordan从MongoDB发出的任何罚单:
BasicDBObjectquery=newBasicDBObject();
query.put("officer","MichealJordan");
DBCursorcur=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和CouchDB的比较】讨论:请加入知识星球【首席架构师圈】或者加小号【jiagoushi_pro】
(此处已添加圈子卡片 , 请到今日头条客户端查看)


    推荐阅读