一篇文章帶你弄懂什么是 NoSQL
一、什么是 NoSQL
NoSQL是一類非 SQL(關(guān)系)數(shù)據(jù)庫,使用預(yù)定義表和列之外的其他數(shù)據(jù)模型。此類包含許多不同類型的數(shù)據(jù)庫以及數(shù)據(jù)存儲和操作的方法。
二、什么是 SQL
NoSQL與幾十年來事實上的標準關(guān)系 (SQL) 數(shù)據(jù)庫相對立。SQL 數(shù)據(jù)庫將數(shù)據(jù)存儲在由具有嚴格數(shù)據(jù)類型的列組成的預(yù)定義表中。表可以具有唯一性(表中行之間的關(guān)系)、檢查約束(驗證一行中的數(shù)據(jù))或外鍵約束(不同表中數(shù)據(jù)之間的關(guān)系)。
示例關(guān)系數(shù)據(jù)模型:
SQL是一種標準查詢語言,用于定義、操作和搜索關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)。
基本 SQL 查詢:
select customer_no, first_name, last_name, last_purchase
from customers
where address_state = 'CA'
為什么關(guān)系數(shù)據(jù)庫還不夠?
- 模式的靈活性——關(guān)系數(shù)據(jù)庫具有固定的模式,這意味著它們只能保存由數(shù)據(jù)庫管理員預(yù)定義的對象(在表中)和屬性(在列中)(寫入模式)。
- 開發(fā)中的敏捷性——必須在寫入數(shù)據(jù)之前定義模式使得開發(fā)數(shù)據(jù)庫的速度要慢得多。在 NoSQL 數(shù)據(jù)庫中,您可以只編寫數(shù)據(jù)并在需要讀取數(shù)據(jù)時擔(dān)心它們的數(shù)據(jù)格式(讀取模式),這使開發(fā)更加敏捷。
- 數(shù)據(jù)大小——許多 NoSQL 數(shù)據(jù)庫在構(gòu)建時都考慮到了大規(guī)模數(shù)據(jù),并且能夠存儲大量行或?qū)ο?,從而犧牲了對其完整性的管理?/span>
三、NoSQL 數(shù)據(jù)庫的類型
1、文檔數(shù)據(jù)庫
文檔數(shù)據(jù)庫將數(shù)據(jù)存儲在 JSON 文檔中,這些文檔是鍵值對的分層集合。文檔可能很復(fù)雜,并且包含子文檔和列表。
這是代表客戶的示例文檔:
{
"id": "1",
"name":{
"firstName":"John",
"lastName": "Doe"
},
"address":{
"street":"Lombard street",
"city": "San Francisco",
"state": "CA",
"country": "US",
}
}
流行的文檔數(shù)據(jù)庫:
- MongoDB
- DynamoDB
- Couchbase
- CouchDB
2、鍵值存儲
鍵值存儲是最基本的 NoSQL 數(shù)據(jù)庫,將數(shù)據(jù)存儲在簡單的鍵值對中(在最簡單的情況下,兩者都是純字符串),這意味著您可以在特定標簽下存儲一些值。
Redis的一個例子:
> set customer1 JohnDoe
流行的鍵值存儲:
- Redis
- Berkley DB
3、圖數(shù)據(jù)庫
圖數(shù)據(jù)庫將數(shù)據(jù)表示為由節(jié)點和關(guān)系構(gòu)建的網(wǎng)絡(luò)。
流行的圖數(shù)據(jù)庫:
- Neo4J
- Giraph
4、寬列存儲
寬列存儲存儲類似于關(guān)系數(shù)據(jù)庫,它們將數(shù)據(jù)存儲在表中,但數(shù)據(jù)是按列物理組織的。寬列數(shù)據(jù)庫中的數(shù)據(jù)是稀疏的,這意味著空列不占用空間,并且允許在表中創(chuàng)建數(shù)百、數(shù)千甚至數(shù)百萬列。
流行的寬列數(shù)據(jù)庫:
- Apache Cassandra。
- Apache HBase。
- Google Bigtable。