NoSQL 是鍵-值數(shù)據(jù)庫(kù)爽醋、文檔型數(shù)據(jù)庫(kù)披泪、列型數(shù)據(jù)庫(kù)或圖數(shù)據(jù)庫(kù)的統(tǒng)稱踪蹬。
數(shù)據(jù)庫(kù)是非規(guī)范化的,表聯(lián)結(jié)大多在應(yīng)用程序代碼中完成恶迈。
大多數(shù) NoSQL 無(wú)法實(shí)現(xiàn)真正符合 ACID 的事務(wù)涩金,支持最終一致。
BASE 通常被用于描述 NoSQL 數(shù)據(jù)庫(kù)的特性暇仲。相比 CAP 理論步做,BASE 強(qiáng)調(diào)可用性超過一致性。
- 基本可用 - 系統(tǒng)保證可用性奈附。
- 軟狀態(tài) - 即使沒有輸入全度,系統(tǒng)狀態(tài)也可能隨著時(shí)間變化。
- 最終一致性 - 經(jīng)過一段時(shí)間之后斥滤,系統(tǒng)最終會(huì)變一致将鸵,因?yàn)橄到y(tǒng)在此期間沒有收到任何輸入。
鍵-值存儲(chǔ)
鍵-值存儲(chǔ)通秤悠模可以實(shí)現(xiàn) O(1) 時(shí)間讀寫顶掉,用內(nèi)存或 SSD 存儲(chǔ)數(shù)據(jù)。數(shù)據(jù)存儲(chǔ)可以按字典順序維護(hù)鍵漩符,從而實(shí)現(xiàn)鍵的高效檢索一喘。鍵-值存儲(chǔ)可以用于存儲(chǔ)元數(shù)據(jù)驱还。
鍵-值存儲(chǔ)性能很高嗜暴,通常用于存儲(chǔ)簡(jiǎn)單數(shù)據(jù)模型或頻繁修改的數(shù)據(jù),如存放在內(nèi)存中的緩存议蟆。
鍵-值存儲(chǔ)提供的操作有限闷沥,如果需要更多操作,復(fù)雜度將轉(zhuǎn)嫁到應(yīng)用程序?qū)用妗?/p>
鍵-值存儲(chǔ)是如文檔存儲(chǔ)咐容,在某些情況下舆逃,甚至是圖存儲(chǔ)等更復(fù)雜的存儲(chǔ)系統(tǒng)的基礎(chǔ)。
例如:
- Memcached
- Redis
文檔類型存儲(chǔ)
抽象模型:將文檔作為值的鍵-值存儲(chǔ)
文檔類型存儲(chǔ)以文檔(XML、JSON路狮、二進(jìn)制文件等)為中心虫啥,文檔存儲(chǔ)了指定對(duì)象的全部信息。
文檔存儲(chǔ)根據(jù)文檔自身的內(nèi)部結(jié)構(gòu)提供 API 或查詢語(yǔ)句來(lái)實(shí)現(xiàn)查詢奄妨。
基于底層實(shí)現(xiàn)涂籽,文檔可以根據(jù)集合、標(biāo)簽砸抛、元數(shù)據(jù)或者文件夾組織评雌。盡管不同文檔可以被組織在一起或者分成一組,但相互之間可能具有完全不同的字段直焙。
文檔類型存儲(chǔ)具備高度的靈活性景东,常用于處理偶爾變化的數(shù)據(jù)。
例如:
- MongoDB
- CouchDB
-
Amazon DynamoDB
它是完全托管的云數(shù)據(jù)庫(kù)奔誓,支持文檔和鍵值存儲(chǔ)模型斤吐。它擁有靈活的數(shù)據(jù)模型、可靠的性能以及自動(dòng)的吞吐容量擴(kuò)展功能厨喂。 - Elastic Search
列型存儲(chǔ)
抽象模型:嵌套的 ColumnFamily<RowKey, Columns<ColKey, Value, Timestamp>> 映射
類型存儲(chǔ)的基本數(shù)據(jù)單元是列 Column(名 ColKey/值 Value 對(duì))曲初。列可以在列族 Column Family(類似于 SQL 的數(shù)據(jù)表)中被分組。超級(jí)列族再分組普通列族杯聚。
你可以使用行鍵 RowKey 獨(dú)立訪問每一列臼婆,具有相同行鍵值 RowKey 的列組成一行。
每個(gè)值都包含版本的時(shí)間戳用于解決版本沖突幌绍。
Google 發(fā)布了第一個(gè)列型存儲(chǔ)數(shù)據(jù)庫(kù) Bigtable颁褂,它影響了 Hadoop 生態(tài)系統(tǒng)中活躍的開源數(shù)據(jù)庫(kù) HBase 和 Facebook 的 Cassandra。像 BigTable傀广,HBase 和 Cassandra 這樣的存儲(chǔ)系統(tǒng)將鍵以字母順序存儲(chǔ)颁独,可以高效地讀取鍵列。
列型存儲(chǔ)具備高可用性和高可擴(kuò)展性伪冰。通常被用于大數(shù)據(jù)相關(guān)存儲(chǔ)誓酒。
關(guān)于 Bigtable:
Cloud Bigtable 是 Google 面向大數(shù)據(jù)領(lǐng)域的 NoSQL 數(shù)據(jù)庫(kù)服務(wù)。它也是為 Google 搜索贮聂、Analytics(分析)靠柑、地圖和 Gmail 等眾多核心 Google 服務(wù)提供支撐的數(shù)據(jù)庫(kù)。
Bigtable 的設(shè)計(jì)目標(biāo)是以穩(wěn)定的低延遲和高吞吐性能處理巨量的工作負(fù)載吓懈,因此它是運(yùn)營(yíng)和分析型應(yīng)用(包括 IoT 物聯(lián)網(wǎng)歼冰、用戶分析和金融數(shù)據(jù)分析)的理想之選。
一個(gè)簡(jiǎn)單的例子參見 Example: HBase APIs for Java "Hello World" Application
圖數(shù)據(jù)庫(kù)
在圖數(shù)據(jù)庫(kù)中耻警,一個(gè)節(jié)點(diǎn)對(duì)應(yīng)一條記錄隔嫡,一個(gè)弧對(duì)應(yīng)兩個(gè)節(jié)點(diǎn)之間的關(guān)系甸怕。
圖數(shù)據(jù)庫(kù)被優(yōu)化用于表示外鍵繁多的復(fù)雜關(guān)系或多對(duì)多關(guān)系。
圖數(shù)據(jù)庫(kù)為存儲(chǔ)復(fù)雜關(guān)系的數(shù)據(jù)模型腮恩,如社交網(wǎng)絡(luò)梢杭,提供了很高的性能。它們相對(duì)較新秸滴,尚未廣泛應(yīng)用式曲,查找開發(fā)工具或者資源相對(duì)較難。許多圖只能通過 REST API 訪問缸榛。
例如:
-
Neo4j
一個(gè)簡(jiǎn)單的例子參見 Neo4j官方入門實(shí)例學(xué)習(xí)
SQL 還是 NoSQL
選取 SQL 的原因:
- 結(jié)構(gòu)化數(shù)據(jù)吝羞,嚴(yán)格的模式
- 關(guān)系型數(shù)據(jù)
- 需要復(fù)雜的聯(lián)結(jié)操作
- 事務(wù)
- 清晰的擴(kuò)展模式
- 既有資源更豐富:開發(fā)者、社區(qū)内颗、代碼庫(kù)钧排、工具等
- 通過索引進(jìn)行查詢非常快
選取 NoSQL 的原因:
- 半結(jié)構(gòu)化數(shù)據(jù)均澳,動(dòng)態(tài)或靈活的模式
- 非關(guān)系型數(shù)據(jù)
- 不需要復(fù)雜的聯(lián)結(jié)操作
- 存儲(chǔ) TB (甚至 PB)級(jí)別的數(shù)據(jù)
- 高數(shù)據(jù)密集的工作負(fù)載
- IOPS 高吞吐量
適合 NoSQL 的示例數(shù)據(jù):
- 埋點(diǎn)數(shù)據(jù)和日志數(shù)據(jù)
- 排行榜或者得分?jǐn)?shù)據(jù)
- 臨時(shí)數(shù)據(jù)恨溜,如購(gòu)物車
- 頻繁訪問的(“熱”)表
- 元數(shù)據(jù)/查找表