一、概述
在本教程中,我们将比较两个最流行的NoSQL 数据库——MongoDB 和Couchbase。我们将了解体系结构、功能列表、数据模型、查询,以及它们如何处理分区。
2. NoSQL 数据库介绍
SQL 数据库自1970 年以来一直存在,并且在很长一段时间内一直是事实上的数据库。他们的目的之一是减少数据重复,因为当时存储并不便宜。水平扩展意味着SQL 数据库的大量维护工作,但可以通过购买功能更强大的服务器来垂直扩展。
NoSQL(不仅是SQL)数据库出现在2000 年代后期,允许更容易的横向扩展。随着计算能力变得越来越便宜,我们现在可以将数据分发到许多功能不那么强大的机器上。这里的数据不是存储在表中,而是存储在文档中(通常是JSON 格式),并且模式不像SQL 数据库那样严格。
最早的NoSQL 数据库之一是MongoDB。其简单的设置和易用性使其在很长一段时间内一直保持领先地位。然而,有像Couchbase 这样的新竞争者,它具有易于扩展和高性能的特点。
3.建筑
让我们看一下MongoDB 部署的架构:
在这里,每个节点都包含一个副本集,其中包含一个主副本和两个辅助副本。
每个副本都有自己的MongoD 服务,用于管理数据、索引和查询。MongoS 组件充当分布式查询路由器和处理器。
现在让我们看一下Couchbase 的部署架构:
Couchbase 部署中的每个节点都有一个强制性的集群管理器。其他服务组件,即数据、索引、查询和搜索,可以存在也可以不存在。
对于Couchbase,数据存储在使用自动哈希在节点之间分区的Buckets 中。
不需要配置服务器,因为元数据管理已按设计内置到数据库中。向外扩展只是添加更多节点的问题。
4. 特征比较
让我们看一下这两个NoSQL 数据库的主要特性比较:
贮存 | 将文档存储为二进制JSON (BSON) | 将文档存储为JSON |
查询 | 专有查询语言 | N1QL – 支持SQL 查询 |
分区 | 通过分片手动处理分区 | 使用哈希机制自动分区 |
交易 | 从4.2 版本开始支持分布式事务 | 从6.6 版本开始支持分布式事务 |
搜索 | 从4.0 版本开始支持文本搜索 | 从6.0 版本开始支持全文搜索 |
5. 数据模型
与SQL 数据库不同,在NoSQL 的情况下,不强制执行数据模型。文档不需要具有相同的架构。我们可以自由地为每个关系建模,但我们认为合适。
我们来看看实体之间关系的建模:
一对一(1-1):NoSQL 数据库处理此问题的默认方式是将一个实体嵌入另一个实体。这也是MongoDB 和Couchbase 的行为。我们还可以嵌入另一个实体的实体ID。这两个数据库都支持这一点。
一对多(1-N):我们通过在第一个实体中嵌入N 个实体数组或N 个实体ID 数组来解决此问题。MongoDB 和Couchbase 支持这一点。
多对多(MN):我们通过在M 个实体中的每个实体中嵌入N 个实体数组或在M 个实体中的每个实体中嵌入N 个实体ID 数组来解决此问题。MongoDB 和Couchbase 也支持这一点。
决定将哪个实体嵌入另一个实体以及选择嵌入实体还是嵌入id 是一个关键的设计决策。我们在仔细考虑应用程序将如何使用我们的数据库后做出此决定。
六、数据查询
对于查询,MongoDB 有其专有的查询语言,而Couchbase 使用N1QL,一种类似于SQL 的语言。让我们以一个STUDENT
集合为例,看看每个数据库如何处理通常的命令查询操作。
6.1.SELECT
下面是SQL 语言、MongoDB 查询语言和Couchbase N1QL 中的SELECT
操作:
-- SQL
SELECT * FROM STUDENT WHERE name = 'Ryan';
-- MongoDB query language
db.STUDENT.find({name:"Ryan"})
-- Couchbase N1QL
SELECT * FROM STUDENT WHERE name = 'Ryan';
6.2.INSERT
现在,让我们看看INSERT
操作在SQL、MongoDB 查询语言和Couchbase N1QL 中的样子:
-- SQL
INSERT INTO STUDENT(id, name) VALUES (123, 'Ryan');
-- MongoDB query language
db.STUDENT.save({_id: "123", {"id": "123", "name": "Ryan"})
-- Couchbase N1QL
INSERT INTO STUDENT(KEY, VALUE) VALUES ('123', {"id": "123", "name": "Ryan"})
6.3.UPDATE
接下来是SQL、MongoDB 查询语言和Couchbase N1QL 中的UPDATE
操作:
-- SQL
UPDATE STUDENT SET name='John' WHERE id = 123;
-- MongoDB query language
db.STUDENT.update({_id: "123"}, {"name": "John"})
-- Couchbase N1QL
UPDATE STUDENT SET name = "John" WHERE id = "123"
6.4.DELETE
这是最后一个基本操作—— DELETE
。让我们在SQL、MongoDB 查询语言和Couchbase N1QL 中看看它:
-- SQL
DELETE FROM STUDENT WHERE id = 123;
-- MongoDB query language
db.STUDENT.remove({_id: "123"})
-- Couchbase N1QL
DELETE FROM CUSTOMER WHERE id = "123";
我们可以在我们的Spring Data MongoDB 教程中深入了解使用Spring Data 的MongoDB 查询。
此外,我们可以在我们的Spring Data Couchbase 教程中了解如何使用Spring Data 持久化Couchbase 文档。
7.分区
分区是任何NoSQL 数据库的关键特性,这两个也不例外。
默认情况下,MongoDB 不会对其数据进行分区。相反,它将所有数据保存在单个节点上。MongoDB 通过将数据拆分为子集(分片)来进行水平扩展,我们可以将每个子集分布在不同的节点上。配置服务器管理部署集群的配置。
Couchbase 中没有配置服务器。相反,每个节点都有自己的集群管理器服务,并且可以运行任何数据、索引、查询和搜索服务。这样,我们可以通过在需要的地方分配计算能力来实现极大的灵活性。
八、结论
在本文中,我们探讨了MongoDB 和Couchbase 之间的相同点和不同点。
总而言之,MongoDB 是开启我们进入NoSQL 世界之旅的绝佳方式。它周围有一个很棒的社区,MongoDB 大学为开发人员提供了大量培训。
另一方面,Couchbase 支持SQL 查询并承诺出色的性能和易于扩展。
0 评论