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

news2024/12/23 20:55:54

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可以替代复杂的聚合函数。

aa1671d13e66ce38d845e030ac30ad76.jpeg

图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是否相同。

106dfc045fd5a668dd7e41f941369b7f.jpeg

CouchDB架构

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

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

CouchDB和MongoDB的比较

特性CouchDBMongoDB
数据模型它遵循面向文档的模型,数据以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是强一致性的。
编写语言ErlangC++.
分析如果我们需要一个在移动设备上运行的数据库,需要主-主复制或单服务器持久性,那么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是一个更好的选择。关于这两个数据库的安全性,研究仍在进行中,很难说哪一个提供了更好的和安全的环境。

本文 :https://architect.pub/battle-nosql-databases-comparing-mongodb-and-couchdb
讨论:知识星球【首席架构师圈】或者加微信小号【ca_cto】或者加QQ群【792862318】
公众号

【jiagoushipro】
【超级架构师】
精彩图文详解架构方法论,架构实践,技术原理,技术趋势。
我们在等你,赶快扫描关注吧。
e5039bf00928a9f6d029754bf136b3d7.jpeg
微信小号

【ca_cea】
50000人社区,讨论:企业架构,云计算,大数据,数据科学,物联网,人工智能,安全,全栈开发,DevOps,数字化.

89c3761a09009cfd6803e90faf977849.jpeg

QQ群

【792862318】深度交流企业架构,业务架构,应用架构,数据架构,技术架构,集成架构,安全架构。以及大数据,云计算,物联网,人工智能等各种新兴技术。
加QQ群,有珍贵的报告和干货资料分享。

96ca9b5e5ccef1e91c9dc0782d1d0d7b.jpeg

视频号【超级架构师】
1分钟快速了解架构相关的基本概念,模型,方法,经验。
每天1分钟,架构心中熟。

58d56a25f49dd8cdb0edb710ee2e5099.jpeg

知识星球【首席架构师圈】向大咖提问,近距离接触,或者获得私密资料分享。

5c17466a9b9cb5ec3bbd94684b0e70e2.jpeg

喜马拉雅【超级架构师】路上或者车上了解最新黑科技资讯,架构心得。【智能时刻,架构君和你聊黑科技】
知识星球认识更多朋友,职场和技术闲聊。知识星球【职场和技术】
微博【超级架构师】智能时刻
哔哩哔哩【超级架构师】

516aadee98d85d6449979581631c45db.jpeg

抖音【cea_cio】超级架构师

fdeb64317e9bad0bb3843d08d837e64c.jpeg

快手【cea_cio_cto】超级架构师

d7a4b133f8fcd6627a319b363a1d527f.jpeg

小红书【cea_csa_cto】超级架构师

46d59053522f58ed00aa699327ba1848.jpeg

网站CIO(首席信息官)https://cio.ceo
网站CIO,CTO和CDOhttps://cioctocdo.com
网站应用开发和开发平台https://apaas.dev
网站开发信息网https://xinxi.dev
网站首席架构师社区https://jiagoushi.pro
网站超级架构师https://jiagou.dev
网站企业技术培训https://peixun.dev
网站程序员宝典https://pgmr.pub    
网站程序员云开发分享https://pgmr.cloud
网站开发者闲谈https://blog.developer.chat
网站CPO宝典https://cpo.work
网站架构师实战分享https://architect.pub    ‍
网站首席安全官https://cso.pub    ‍
网站CIO酷https://cio.cool
网站CDO信息https://cdo.fyi
网站CXO信息https://cxo.pub

谢谢大家关注,转发,点赞和点在看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

积分球原理及积分球类型介绍

标题积分球标准型积分球LED积分球均匀光源便携式高亮度积分球均匀光源微光积分球均匀光源积分球均匀光源iSphere高光谱响应光学积分球其他分类积分球 积分球原理:由于球体内整涂有白色漫反射材料的空腔球体,球壁上开有采样口,当待测样品光源进入积分球的…

Java之关于String字符串笔试面试重点

目录 一.关于字符串的常量池 1.关于字符串产生的三种方式 2.关于字符串的常量池 3.直接赋值法和new的方式产生对象的区别 二.关于intern方法 1.情况一(已经包含) 2.情况二(已经包含) 3.情况三(未包含) 4.情况四 三.关于字符串的不可变性 1.了解字符串的不可变性 2.Str…

python+selenium使用webdriver启动chrome出现闪退现象解决

这两天发现之前开发的爬虫程序出问题了:谷歌浏览器出现打开立即闪退的现象,代码未修改过,检查也没有任何问题! 查看chrome浏览器发现版本更新了 ↑(点击chrome浏览器右上角三个点,最下面帮助→Google Chr…

[软件工程导论(第六版)]第9章 面向对象方法学引论(课后习题详解)

文章目录1. 什么是面向对象方法学?它有哪些优点?2. 什么是“对象”?它与传统的数据有何异同?3. 什么是“类”?4. 什么是“继承”?5. 什么是模型?开发软件为何要建模?6. 什么是对象模…

[软件工程导论(第六版)]第8章 维护(复习笔记)

文章目录8.1 软件维护的定义8.2 软件维护的特点8.3 软件维护过程8.4 软件的可维护性8.5 预防性维护8.6 软件再工程过程维护的基本任务:保证软件在一个相当长的时期能够正常运行软件工程的主要目的就是要提高软件的可维护性,减少软件维护所需要的工作量&a…

C语言编程规范 第一部分

、代码总体原则 1、清晰第一 清晰性是易于维护、易于重构的程序必需具备的特征。代码首先是给人读的,好的代码应当可以像文章一样发声朗诵出来。目前软件维护期成本占整个生命周期成本的40%~90%。根据业界经验,维护期变更代码的成本,小型系统…

Spring Batch ItemProcessor组件-默认处理器

目录 引言 概念 默认ItemProcessor ValidatingItemProcessor:校验处理器 ItemProcessorAdapter:适配器处理器 ScriptItemProcessor:脚本处理器 CompositeItemProcessor:组合处理器 自定义ItemProcessor处理器 转视频版 引…

图数据库中的 OLTP 与 OLAP 融合实践

在一些图计算的场景下,我们会遇到同时需要处理 OLTP 和 OLAP 的问题。而本文就给了一个 OLTP 与 OLAP 融合实践的指导思路,希望给你带来一点启发。 Dag Controller 介绍 Dag Controller 是 NebulaGraph 企业版的图系统,经过反复测试无误后已…

rabbitMq安装(小短文)--未完成

rabbitMq是在activeMq的基础上创造的,有前者的功能,比前者强,属于后来居上。系统环境:windows10首先下载相关软件Erlang,因为他是这个语言写的。https://www.erlang.org/downloads然后安装,并且弄到环境变量里验证是否…

Robot Framework自动化测试---元素定位

不要误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加入了selenium2的API。比如笔者所处工作中,更多的是拿Robot framework来做数据库的接口测试&#xf…

Leetcode.2257 统计网格图中没有被保卫的格子数

题目链接 Leetcode.2257 统计网格图中没有被保卫的格子数 Rating : 1709 题目描述 给你两个整数 m和 n表示一个下标从 0开始的 m x n网格图。同时给你两个二维整数数组 guards和 walls,其中 guards[i] [rowi, coli]且 walls[j] [rowj, colj]&#xff…

适合初学者的超详细实用调试技巧(下)

我们日常写代码的时候,常常会遇到bug的情况,这个时候像我这样的初学者就会像无头苍蝇一样这里改改那里删删,调试的重要性也就显现出来,这篇文章接着上文来讲解。 上文地址:(8条消息) 适合初学者的超详细实用调试技巧&…

Tomcat目录介绍,结构目录有哪些?哪些常用?

bin 启动,关闭和其他脚本。这些 .sh文件(对于Unix系统)是这些.bat文件的功能副本(对于Windows系统)。由于Win32命令行缺少某些功能,因此此处包含一些其他文件。 比如说:windows下启动tomcat用的…

3款强大到离谱的电脑软件,个个提效神器,从此远离加班

推荐3款让你偷懒,让你上头的提效电脑软件,个个功能强大,让你远离加班! 很多几个小时才能做好的事情,用上它们,只需要5分钟就行!! 1、JNPF —— 个人最喜欢的低代码软件 它为开发者…

利用OpenCV的函数equalizeHist()对图像作直方图均衡化处理

如果一幅图像的灰度值集中在某个比较窄的区域,则图像的对比度会显得比较小,不便于对图像的分析和处理。 图像的直方图均衡化可以实现将原图像的灰度值范围扩大,这样图像的对比度就得到了提高,从而方便对图像进行后续的分析和处理…

从Docker挂载逃逸原理复现分析到BlueMoon实战

Docker逃逸 什么是Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互…

Elasticsearch:在满意度调查中实现并使用情绪分析器

如果你通过博客或新闻关注 Elastic,你已经知道在最新版本的 Elasticsearch 中已经提供了用于自然语言处理 (NLP) 的资源。事实上,在我之前的博客文章中,我已经推出了很多关于 NLP 的博文。请详细阅读 “Elastic:开发者上手指南” …

【Linux 多线程同步】使用同步和互斥实现生产消费模型

目录 1.同步的接口 2.多线程但是按顺序来执行 3.生产消费模型 4.使用互斥加同步实现生产消费模型 (采用环形队列) 同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题 …

GraphTrip论文笔记【Information Fusion 92 (2023)】

Dual-grained human mobility learning for location-aware trip recommendation with spatial–temporal graph knowledge fusion 期刊:EI检索 Information Fusion 92 (2023) Challenges (1)异质交互信息的挖掘 POI位置信息、POI类别信息…

重新标记ImageNet:从全局标签到局部标签(附github代码及论文)

欢迎关注“计算机视觉研究院”计算机视觉研究院专栏作者:Edison_GImageNet可以说是最受欢迎的图像分类基准,但它也是一个具有显著噪声的标签。最近的研究表明,许多样本包含多个类,尽管被假定为单个标签基准。因此,他们…