MongoDB 與 Couchbase
一、概述
在本教程中,我們將比較兩個最流行的 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 查詢並承諾出色的性能和易於擴展。