What is NoSQL
目錄
關聯式資料庫(RDBMS)
目前常用的資料庫,完全遵守 ACID 原則,在任何情況下(Atomicity)都可保持每個Transaction
不成功則roll back
,(Consistency)資料一致性,(Isolation)讀寫不互相干擾,(Duration)資料永久性(EX:SQL Server
,PostgreSQL
,MySQL
…等)
且僅能支援垂直擴充,假設要應用在大量的資料的時候,只能透過硬體的升級(CPU 升級、加 HDD、增加 RAM…等)
非關聯式資料庫(NOSQL)
NOSQL
(Non-SQL,又為 Not only SQL) 稱為非關聯式資料庫,跟關聯式資料庫不一樣,不需要定義 schema
且沒有關聯的關係(EX:MongoDB
,Redis
,MariaDB
…)
-
非關聯式資料庫特點:
- 資料庫由 collection 組成
- collection 中每筆資料為一份 document,document 的資料格式不需一致
- 以
CAP theorem
為概念設計 - 常用於分散式雲端系統
NoSQL v.s RDBMS
RDBMS
- RDBMS 因具備 ACID 特性,且保證了資料的一致性,若資料需在任何情況下都穩定且一致,則推薦此類(EX: 金融系統)
NOSQL
- 由於 NOSQL 的 schema 不需要固定,且資料可以為任意結構,所以在
schema
需要頻繁變動或者是schema
不固定的時候,NOSQL 提供更有彈性的開發 - 需要儲存大量資料,利用分散式系統以及雲端儲存的時候,由於 NOSQL 相較於 RDBMS 更容易做水平擴充 (horizontal scaling),且本身的設計就是分散式系統的設計,因此對於未來有大量擴充需求的系統,會更容易的去擴充,且擴充的成本也較低
- 具備水平擴充,較不會有Single Failed
NOSQL 類別
1. 資料形態(粗略分類)
Key-Value
:Key-Value
資料庫是 NoSQL 資料庫中最大宗的類型,這類資料最大的特色就是採用Key-Value
資料架構,取消了原本關聯式資料庫中常用的欄位架構(Schema
),每筆資料各自獨立,所以,可以打造出分散式和高擴充能力的特性- 例如:
Google BigTable
,Hadoop HBase
,Amazon Dynamo
,Cassandra
,Hypertable
,Redis
,Firebase
…
Document
:- 也是一種
key-value
,限制value
的結構為半結構化資料semi-structure
,像是 JSON 等 - 將資訊存儲在文檔中的資料庫,旨在將資料儲存為類似 JSON 的文件並對其進行查詢
- 文件資料庫主要是用來儲存非結構性的文件,例如最常見的非結構化資料就是
HTML
網頁,一個HTML
網頁結構不像一般表格那樣有固定的欄位,每個欄位有特定資料類型和大小,例如網頁裡有Head
和Body
結構,Body
元素中可能會有10個段落,段落中會有文字、連結、圖片等,文件資料庫的資料結構往往是鬆散的樹狀結構 - 例如:
MongoDB
,CouchDB
,Lotus Notes
…
- 也是一種
Wide-column
(圖學架構):- 運用圖學架構來儲存節點間關係資料架構(基本的圖學資料包括了節點(Node)、關係(Relation)和屬性(Property)三種結構)
- 以多個
raw
、column
進行存取,將資料拆成小資料再進行組合,之後可透過column key
/row key
進行關聯查詢(可有效的壓縮資料及取用同級的資料集) - 例如:
Neo4j
,InfoGrid
,AllegroGrph
,Sparksee
…
2. CAP定理 (Consistency, Availability, Partition Tolerance)
- Consistency: 一致性,讀寫都會遵循 Atomicity 原則,等同於所有節點訪問同一份最新的資料副本
- Availability: 可用性,每次請求都能獲取到非錯的響應,但是無法保證得到的資料為最新的
- Partition Tolerance: 分區容錯性,電腦網路區分為相對獨立的子網,這些子網可以通過設計單獨優化,也可以是網絡設備的故障而導致,而分散式軟體必須設計成具有分區容錯性,也就是說,即使網路被分區後,仍然可以正常工作
根據定理,分散式系統只能滿足三項中的兩項而不可能滿足全部三項,因為在Available的情況下,Consistency與Partition Tolerance是互相矛盾的,因此大致的分類有 AP
、CA
、CP
AP
: 只要節點可用就能持續運作CA
: 在沒有任何的例外下,都是可用並保證資料的一致性CP
: 在節點不穩定的時候不接受request