无论您是经验丰富的开发人员、还是数据库管理员、亦或NoSQL数据库的爱好者,可能已经注意到,在如今快速发展的企业架构格局中,MongoDB和Couchbase已成为NoSQL数据库的两大典型竞品。
本文将通过展示在真实企业架构中使用MongoDB和Couchbase的Java示例,和您一起探索两者之间的关键差异,各自独有的优势和不足,以及如何在它们之间快速切换,以确保无缝地适应项目的动态需求。
让我们首先对NoSQL文档数据库,以及基本的存储和检索原理有所理解。NoSQL数据库采用灵活的模式和JSON/BSON文档格式,以适应不断变化数据的需求。NoSQL数据库,也被称为“Not Only SQL”,旨在解决传统关系数据库的局限性。与具有固定模式的结构化表的关系数据库不同,NoSQL数据库提供了一个灵活的无模式(schema-less)数据模型。在NoSQL类别中,文档数据库直接在文档中存储和检索数据。如下图所示,它们通常表现为类似JSON的对象或BSON(Binary JSON)文档。通过嵌套结构,这些文档能够高度适应不断变化的数据需求。
作为领先的NoSQL文档数据库,Couchbase在性能、可扩展性和可用性方面非常出色。它结合了分布式键值存储和面向文档的数据库功能,能够在多个节点和数据中心之间提供无缝的水平扩展。凭借其强大的一致性模型,Couchbase可以处理具有低延迟和高吞吐量需求的大规模应用。同时,它也能够提供强大的移动和边缘计算支持,并已成为了需要横跨不同设备进行数据同步的应用项目的理想选择。
作为另一款著名的NoSQL文档数据库,MongoDB以其易用性、灵活性和强大的查询功能而广受欢迎。它能够将数据存储到类似JSON的BSON文档中,并提供动态的进化模式。MongoDB的设计非常适合敏捷开发。开发人员能够通过快速迭代,来适应不断变化的应用需求。凭借着水平扩展功能,以及丰富的工具和库生态系统,MongoDB已成为了从Web应用到大数据实时分析等用例的热门选择。
总的说来,Couchbase和MongoDB都有着如下核心功能和属性:
下面,让我们来探讨一下每个数据库的不足:
如何在Couchbase和MongoDB之间进行选择,主要取决于具体的项目要求、现有的技术堆栈,以及对于一致性、可扩展性和易用性的需求。下面的表格对比了两种数据库的特点,可方便架构师和开发人员根据其应用的独特需求、以及性能目标,做出明智的决策。
特点 |
COUCHBASE |
MONGODB |
查询语言 |
N1QL(类似SQL) |
MongoDB查询语言(MQL) |
一致性模型 |
强一致性 |
最终一致性(可配置) |
分片机制 |
自动和手动分片 |
自动分片 |
聚合框架 |
提供(使用N1QL) |
提供 |
联合 |
支持(使用N1QL) |
不支持(需要去规范化) |
下面,我将通过在真实的Java企业应用场景中,使用Couchbase、MongoDB、以及Jakarta NoSQL规范,来讨论两种数据库如何通过其独特的功能,来执行查询,管理一致性,以及处理聚合。我们将创建一个啤酒工厂应用,来高效地管理啤酒送货地址和用户信息。该应用将在Open Liberty服务器上运行,并能够与Jakarta EE 10或Eclipse MicroProfile 6相兼容。
首先,我们将使用Jakarta EE Starter或Eclipse MicroProfile Starter来创建项目,然后添加所需的依赖项。有了Jakarta NoSQL的广泛数据库支持,我们可以通过下列代码段,将Couchbase和MongoDB添加到Maven依赖列表中。
XML
org.eclipse.jnosql.databases
jnosql-couchbase
${jnosql.version}
org.eclipse.jnosql.databases
jnosql-mongodb
${jnosql.version}
设置好依赖项后,我们将在microprofile-config.properties文件中配置凭据。此外,我们将使用系统环境配置,去覆盖Eclipse MicroProfile的配置。当类路径(classpath)中存在多个选项时,jnosql.document.provider键将确保我们选择合适的文档提供程序。请参见如下代码段:
Properties files
jnosql.couchbase.host=couchbase://localhost
jnosql.couchbase.user=root
jnosql.couchbase.password=123456
jnosql.document.database=factory
jnosql.mongodb.host=localhost:27017
#for use couchbase uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration
该应用的核心在于实体创建,我们在其中定义了Beer实体,以及嵌套式Address的子文档结构。
Java
@Entity("beer")
public class Beer {
@Id
private String id;
@Column
private String name;
@Column
private String style;
@Column
private String hop;
@Column
private String yeast;
@Column
private String malt;
@Column
private Address address;
@Column
private String user;
}
@Entity
public class Address {
@Column
private String city;
@Column
private String country;
}
在实体准备就绪后,我们将使用Template和DocumentTemplate在Java应用和数据库之间建立通信。利用Jakarta Data的存储库界面上,我们将实现有效的数据库交互,并在Beer实体上执行CRUD操作。
Java
@ApplicationScoped
@Path("beers2")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class BeerTemplateResource {
private final DocumentTemplate template;
@Inject
public BeerTemplateResource(DocumentTemplate template) {
this.template = template;
}
@Deprecated
BeerTemplateResource() {
this(null);
}
@GET
public List findByAll(@BeanParam BeerParam param){
if(param.isMaltAndHopQuery()){
return this.template.select(Beer.class).where("malt")
.eq(param.malt())
.and("hop")
.eq(param.hop())
.result();
}
else if(param.isHopQuery()) {
return this.template.select(Beer.class).where("hop")
.eq(param.hop())
.result();
}
else if(param.isMaltQuery()) {
return this.template.select(Beer.class).where("malt")
.eq(param.malt())
.result();
}
return this.template.select(Beer.class).result();
}
@POST
public void create(Beer beer){
this.template.insert(beer);
}
@DELETE
@Path("{id}")
public void deleteById(@PathParam("id") String id){
this.template.delete(Beer.class).where("id").eq(id).execute();
}
@Path("random")
@POST
public void random() {
var faker = new Faker();
for (int index = 0; index < 1_000; index++) {
var beer = Beer.of(faker);
this.template.insert(beer);
}
}
}
配置完这两种数据库后,我们将为该项目设置MongoDB和Couchbase。对于MongoDB而言,为了简单起见,我们可以使用如下命令来调用单个Docker容器:
Shell
docker run -d --name mongodb-instance -p 27017:27017 mongo
接着,我们通过注释Couchbase行和取消注释MongoDB行,来修改属性文件,以将MongoDB设置为provider:
Properties files
#for use couchbase uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration
设置好MongoDB后,我们后续便可以按需使用它了。
我们遵循类似的方法,转移到Couchbase上,并使用如下命令创建单个Docker容器,以进行测试:
Shell
docker run -d --name db -p 8091-8097:8091-8097 -p 9123:9123 -p 11207:11207 -p 11210:11210 -p 11280:11280 -p 18091-18097:18091-18097 couchbase
鉴于Couchbase需要更多的配置,您可以通过浏览器访问其用户界面(UI),以轻松地定义各种所需的参数:
在具体配置中,我们需要利用如下代码执行与前面相反的操作:
Properties files
#for use couchbase uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration
一旦MongoDB和Couchbase准备就绪,我们便可以利用Jakarta NoSQL的功能,以及Java与这两种NoSQL数据库的无缝交互,来开发啤酒工厂应用了。
我们基于上述数据库的相关定义和设置,使用如下Maven命令来构建项目:
Shell
mvn clean package
并使用如下Maven命令来运行应用:
Shell
java -jar target/eclipse-store.jar
我们可以使用任何HTTP客户端(在此,我们将使用curl),来测试应用运行情况。
1.我们使用如下命令,来生成啤酒的随机数据:
Shell
curl --location --request POST 'http://localhost:9080/beers/random'
2.使用如下命令获取所有的啤酒信息:
Shell
curl --location 'http://localhost:9080/beers/'
3.通过如下命令,我们根据特定请求(例如,啤酒“Magnum”或麦芽“Vienna”)来过滤啤酒:
Properties files
curl --location 'http://localhost:9080/beers/?page=1&hop=Magnum'
curl --location 'http://localhost:9080/beers/?page=1&hop=Magnum&malt=Vienna'
通过执行上述命令,我们可以测试在企业应用开发中,不同NoSQL数据库的能力与效率。
综上所述,我们体验了在Jakarta EE生态系统中,使用NoSQL数据库轻松实现标准化注释、API和Jakarta 数据存储库的简单开发过程。可以说,Jakarta NoSQL促进了MongoDB和Couchbase之间的无缝切换能力,使得我们能够根据项目的实际要求,在两种数据库之间轻松地转换,并通过一些简单的配置更改,以获取两种数据库各自的最佳性能和可扩展性,进而实现了与应用的流畅交互。
JNPF,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。
低代码是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。
官网:http://www.jnpfsoft.com/?csdn ,如果你有闲暇时间,可以做个知识拓展。
它是一款基于Java Boot/.Net Core构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的Demo方便直接使用;后端框架支持Vue2、Vue3。
为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动。