NoSQL學習筆記

NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。

關係型數據庫管理系統(RDMBSs)

關係型數據庫遵循ACID規則

事務在英文中是transaction,和現實世界中的交易很類似,它有如下四個特性:

1、A (Atomicity) 原子性

原子性很容易理解,也就是說事務裏的所有操作要麼全部做完,要麼都不做,事務成功的條件是事務裏的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾。

比如銀行轉賬,從A賬戶轉100元至B賬戶,分爲兩個步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要麼一起完成,要麼一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了100元。

2、C (Consistency) 一致性

一致性也比較容易理解,也就是說數據庫要一直處於一致的狀態,事務的運行不會改變數據庫原本的一致性約束。

例如現有完整性約束a+b=10,如果一個事務改變了a,那麼必須得改變b,使得事務結束後依然滿足a+b=10,否則事務失敗。

3、I (Isolation) 獨立性

所謂的獨立性是指併發的事務之間不會互相影響,如果一個事務要訪問的數據正在被另外一個事務修改,只要另外一個事務未提交,它所訪問的數據就不受未提交事務的影響。

比如現有有個交易是從A賬戶轉100元至B賬戶,在這個交易還未完成的情況下,如果此時B查詢自己的賬戶,是看不到新增加的100元的。

4、D (Durability) 持久性

持久性是指一旦事務提交後,它所做的修改將會永久的保存在數據庫上,即使出現宕機也不會丟失。

 

分佈式計算的優點

可靠性(容錯) :

分佈式計算系統中的一個重要的優點是可靠性。一臺服務器的系統崩潰並不影響到其餘的服務器。

可擴展性:

在分佈式計算系統可以根據需要增加更多的機器。

資源共享:

共享數據是必不可少的應用,如銀行,預訂系統。

靈活性:

由於該系統是非常靈活的,它很容易安裝,實施和調試新的服務。

更快的速度:

分佈式計算系統可以有多臺計算機的計算能力,使得它比其他系統有更快的處理速度。

開放系統:

由於它是開放的系統,本地或者遠程都可以訪問到該服務。

更高的性能:

相較於集中式計算機網絡集羣可以提供更高的性能(及更好的性價比)。

分佈式計算的缺點

故障排除:

故障排除和診斷問題。

軟件:

更少的軟件支持是分佈式計算系統的主要缺點。

網絡:

網絡基礎設施的問題,包括:傳輸問題,高負載,信息丟失等。

安全性:

開發系統的特性讓分佈式計算系統存在着數據的安全性和共享的風險等問題。

 

RDBMS vs NoSQL

RDBMS
- 高度組織化結構化數據
- 結構化查詢語言(SQL) (SQL)
- 數據和關係都存儲在單獨的表中。
- 數據操縱語言,數據定義語言
- 嚴格的一致性
- 基礎事務

NoSQL
- 代表着不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
-鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理
- 高性能,高可用性和可伸縮性

CAP定理(CAP theorem)

在計算機科學中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer's theorem), 它指出對於一個分佈式計算系統來說,不可能同時滿足以下三點:

  • 一致性(Consistency) (所有節點在同一時間具有相同的數據)
  • 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
  • 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運作)

CAP理論的核心是:一個分佈式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的滿足兩個。

因此,根據 CAP 原理將 NoSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:

  • CA - 單點集羣,滿足一致性,可用性的系統,通常在可擴展性上不太強大。
  • CP - 滿足一致性,分區容忍性的系統,通常性能不是特別高。
  • AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。

cap-theoram-image

NoSQL的優點/缺點

優點:

  • - 高可擴展性
  • - 分佈式計算
  • - 低成本
  • - 架構的靈活性,半結構化數據
  • - 沒有複雜的關係

缺點:

    • - 沒有標準化
    • - 有限的查詢功能(到目前爲止)
    • - 最終一致是不直觀的程序

NoSQL 數據庫分類

類型 部分代表 特點
列存儲

Hbase

Cassandra

Hypertable

顧名思義,是按列存儲數據的。最大的特點是方便存儲結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。

文檔存儲

MongoDB

CouchDB

文檔存儲一般用類似json的格式存儲,存儲的內容是文檔型的。這樣也就有有機會對某些字段建立索引,實現關係數據庫的某些功能。

key-value存儲

Tokyo Cabinet / Tyrant

Berkeley DB

MemcacheDB

Redis

可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收。(Redis包含了其他功能)

圖存儲

Neo4J

FlockDB

圖形關係的最佳存儲。使用傳統關係數據庫來解決的話性能低下,而且設計使用不方便。

對象存儲

db4o

Versant

通過類似面嚮對象語言的語法操作數據庫,通過對象的方式存取數據。

xml數據庫

Berkeley DB XML

BaseX

高效的存儲XML數據,並支持XML的內部查詢語法,比如XQuery,Xpath。