MongoDB 也算是一種 NoSQL DB,所以我們會先從 NoSQL 說起,以利讀者們對於 NoSQL DB 有個基本認識以後,之後才來介紹 MongoDB。
一、NoSQL 的定義
一般人第一次看到「NoSQL」,直覺地都會以為是「不使用 SQL」的意思,其實不然,所以目前業界比較傾向使用「Not Only SQL」來解釋 NoSQL 一詞,也就是說通常是透過類似 SQL 的 API 來存取這類 DB。
以下則是摘錄《nosql-database.org》網站對「NoSQL」的定義:
「Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable. 」
![]() |
| 圖一、《nosql-database.org》網站上對「NoSQL」的定義與特徵說明 |
以下特徵採用的是《Toad World》網站「Survey distributed databases」一文的說法。
- Schema-less
有類似「Table」的資料結構,但不需預先定義 schema。每一筆記錄的欄位數量與結構也可以不一樣。紀錄的內容與限制條件主要由應用程式來控管。 - Shared nothing architecture
通常採用本地儲存、而非共同儲存設備(如 SAN 或 NAS)。本地磁碟的存取速度較透過網路傳輸快,也能透過增加節點的方式來擴充容量。使用一般規格的硬體即可(commodity hardware),故成本也隨之下降。 - Elasticity
只需增加更多主機,便能立即擴充儲存容量與負載能力,所以不需要有停機時間(downtime)。當新節點加入後,資料庫便會開始分配任務給它。 - Sharding
不將儲存視為龐大的空間,取而代之的是以「分片」(shard)方式來分割資料集。分片可在主機間進行複製(replication),但一個分片至少會由一部主機來管理。分片過大時,可採用自動分割方式,或者以程式為每一筆記錄指派所屬的分片ID。 - Asynchronous replication
相較於 RAID (mirroring / stripping)或同步複製機制,NoSQL DB採用的是非同步的複製。這種方式較不會受到額外網路流量影響,所以能使寫入動作更快完成。又因為資料不會立即複製,所以某些時候可能發生資料遺失的狀況。此外,也沒有 lock 機制以保護某些特定資料。 - BASE instead of ACID
由於 NoSQL DB 強調的是效能與可用度,所以「CAP Theorem」會比 RDBMS 的「ACID」更為重要。
三、NoSQL DB 的類型
世界頂尖的大師級人物 Martin Fowler、堪稱為「架構師中的架構師」。他在 2013 年的「goto; Conference」有一場主題為「Introduction to NoSQL」的演講,其中便對 NoSQL DB 做了一個分類:Document、Big Table、Graph 以及 Key-Value。
而下面這張圖就是我仿效該場演講其中一張投影片所重製的:
![]() |
| 圖二、NoSQL DB 的四大類型 |
以下則是放在 Youtube 上面的錄影,請大家一睹大師風采。
四、Non-Relational vs. Relational
2012 年 TechCrunch 網站上有一篇介紹 Big Data 五大開放源碼技術趨勢的文章 —— 「Big Data Right Now: Five Trendy Open Source Technologies」。該文作者 Tim Gasper 是 InfoChimps 的產品總監,InfoChimps 則是一家專門提供 Big Data 服務、平台的公司。
下圖也是我重製文中的一張照片,原圖是一張不是很清晰的照片。
![]() |
| 圖三、Non-Relational vs. Relational |
由上圖,我們可以知道:MongoDB 應該是一種 Non-Relational、NoSQL、Document based 的 DB:
- Non-Relational:代表了「無法或不使用 JOIN」。
- NoSQL:代表了「不使用標準 SQL 語言」。
- Document based:代表了「每筆紀錄都是一個 document」(相對於 RDBMS 的 row 而言)。
五、NoSQL DB 的理論基礎 - CAP & BASE
在 2000 年 的 PODC(Principles of Distributed Computing)會議上,柏克萊加州大學的 Eric Brewer 提出了著名的 「CAP Theorem」(CAP 定理)。2002 年,Seth Gilbert 和 Nancy Lynch 證明了這一理論:
- Consistency(一致性)
一致性是說資料的原子性,這種原子性在傳統 RDBMS 中是透過 Transaction 來保證的,當 Transaction 完成時,無論其是成功還是回滾,資料都會處於一致的狀態。在分散式環境中,一致性是說多個節點的資料是否一致。 - Availability(可用性)
可用性是說服務能一直保證是可用的狀態,當使用者發出一個請求,服務能在有限時間內返回結果。 - Partition Tolerance(分區容錯性)
Partition 是指網路的分區。可以這樣理解,一般來說,關鍵的資料和服務都會位於不同的 IDC 機房。
![]() |
| 圖四、CAP Theorem |
但是對於分散式資料系統而言,「分區容錯性」(P) 是基本要求,否則就不能稱為「分散式系統」了。因此,一般我們所說的 NoSQL DB 都是在「一致性」(C) 和「可用性」(A) 之間尋求平衡(即上圖中以紅色虛線框所標示的交集處)。
BASE 是 Basically Available、Soft state、Eventually consistent 三個片語的簡寫,是對 CAP 中 C和 A 的延伸:
- Basically Available:基本可用;
- Soft-state:軟狀態/柔性交易,即狀態可以有一段時間的不同步;
- Eventual consistency:最終一致性;
BASE 是基於 CAP 理論逐步演化而來,核心思想是:即便不能達到「強一致性」(Strong consistency),但可以根據應用特點採用適當的方式來達到「最終一致性」(Eventual consistency)的效果。
BASE 是反 ACID 的,它完全不同於 ACID 模型,犧牲強一致性,獲得基本可用性和柔性可靠性,並要求達到最終一致性。
CAP 和 BASE 理論是 NoSQL 的理論基礎。
個人以為 NoSQL DB 有以下三個缺點:
- 不易轉換
不像 RDBMS 有共通的標準語言 —— SQL,各種 NoSQL 都有自己的 API。所以一旦選定某種 NoSQL 產品,便不易再轉換至其他產品,比方說由 MongoDB 轉換為 Couchbase。 - 不支援 ACID
ACID 可說是「Transaction」的構成要件,也是所有 RDBMS 的主要特性。但大部分的 NoSQL DB 都不保證 ACID,必須使用一些變通技巧來實現(MongoDB 可使用 2 Phase Commits)。 - 不支援 JOIN
因為 NoSQL DB 是 Non-relational 的,所以不支援 JOIN 操作。以 MongoDB 而言,除了一開始就要妥善規劃 Data Model 之外(如使用 embedded document 或 reference),也可搭配 Index 和 Aggregation(含 MapReduce)等技巧來提高查詢效能。
本文對於 NoSQL 就暫時介紹到這裡囉,下面「延伸閱讀」還有許多不錯的資訊,各位也可以參考一下喔!
※ 延伸閱讀:
- [酷壳] 分布式系统的事务处理:
http://coolshell.cn/articles/10910.html - [Toad World] Survey distributed databases
http://www.toadworld.com/products/toad-for-cloud-databases/w/wiki/308.survey-distributed-databases.aspx - [Martin Fowloer] NoSQL
http://martinfowler.com/nosql.html - [myNoSQL] NoSQL Databases and Polyglot Persistence: A Curated Guide
http://nosql.mypopescu.com/




沒有留言:
張貼留言