簡單來說 SQL 數(shù)據(jù)庫和 NoSQL 數(shù)據(jù)庫有著共同的目標(biāo):存儲(chǔ)數(shù)據(jù),但存儲(chǔ)的方式不同
一. 表
- SQL中的表結(jié)構(gòu)具有嚴(yán)格的數(shù)據(jù)模式約束: 存儲(chǔ)數(shù)據(jù)很難出錯(cuò)。
- NoSQL存儲(chǔ)數(shù)據(jù)更加靈活自由:可能導(dǎo)致數(shù)據(jù)不一致性問題的發(fā)生。
SQL
每個(gè)表規(guī)定了固定的字段,各個(gè)字段有固定的類型
NoSQL
而 NoSQL 使用類 Json 的鍵值對存儲(chǔ)數(shù)據(jù)(還有使用陣列、圖形的),
一個(gè)記錄或者說一個(gè)文檔可以是這樣的格式
KEY 1:
{
id: 123456,
name:"howie",
age: 20
}
也可以是這樣的格式
KEY 2:
{
ISBN: 9780992461225,
title: "JavaScript: Novice to Ninja",
author: "Darren Jones",
price: 29.00,
review: [
{ name: "A Reader", text: "The best JavaScript book I've ever read." },
{ name: "JS Expert", text: "Recommended to novice and expert developers alike." }
]
}
所有的記錄組成一個(gè)集合,例如 redis
二. 數(shù)據(jù)庫的模式
SQL 模式
關(guān)系型數(shù)據(jù)庫中,在把數(shù)據(jù)存儲(chǔ)進(jìn)去前,你需要做很多工作,如設(shè)置數(shù)據(jù)庫字符集,定義主鍵,設(shè)置各個(gè)字段的類型,設(shè)置索引等等,這些就是關(guān)系型數(shù)據(jù)庫的模式,這些模式的限制,讓表結(jié)構(gòu)有著嚴(yán)格的約束。
NoSQL 無模式
而非關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)可以隨時(shí)寫入,不需要去事先定好各種條條框框,也正因?yàn)槿绱?,NoSQL 數(shù)據(jù)庫更適合于那些不能夠確定數(shù)據(jù)需求的的工程項(xiàng)目。
三. 數(shù)據(jù)庫的規(guī)范化
SQL 規(guī)范化
例如我們擁有兩表
用戶表:
購物表:
通常情況下,我們不會(huì)在購物表中重復(fù)每個(gè) user 的所有信息,而是會(huì)添加 user_id 字段關(guān)聯(lián)兩個(gè)表,以最小化數(shù)據(jù)的冗余。
這叫做數(shù)據(jù)庫的規(guī)范化
NoSQL 非規(guī)范化
規(guī)范化的設(shè)計(jì)方法很好地優(yōu)化了數(shù)據(jù)冗余,但是在 NoSQL 中一般不會(huì)這么設(shè)計(jì),我們會(huì)直接為每一條購物數(shù)據(jù)都添上用戶的所有信息:
{
id: 1,
pay: 20,
goods: "杯子",
number: 2,
time: "2018-06-04 22:58:46",
user : {
id: 1,
name: "Time",
age: 18,
password: "111111",
}
},
{
id: 2,
pay: 50,
goods: "書本",
number: 1,
time: "2018-06-04 22:59:46",
user : {
id: 1,
name: "Time",
age: 18,
password: "111111",
}
}
目的是更快地查詢,當(dāng)然,如果需要頻繁更新用戶信息,自然會(huì)使效率下降
四. 事務(wù)
SQL 數(shù)據(jù)庫中提供了事務(wù)操作,將兩條或者多條更新操作結(jié)合成一個(gè)事務(wù)(要么全部執(zhí)行成功要么都失?。?/p>
而 NoSQL 數(shù)據(jù)庫則缺乏傳統(tǒng)的事務(wù)機(jī)制,不過很多 NoSQL 數(shù)據(jù)庫也有各自的方式去處理這一類問題
五. 操作語法
SQL 數(shù)據(jù)庫使用傳統(tǒng)的 SQL 語言來進(jìn)行增刪查改,而 NoSQL 數(shù)據(jù)庫則使用各自的語法來進(jìn)行操作。
比如查詢,對比 SQL 的 select * from table; , MongoDB 有 db.table.find() ,HBase 有scan table
通常情況下,由于 NoSQL 非規(guī)范化,數(shù)據(jù)模型的簡單等原因 NoSQL 比 SQL 語言更快,當(dāng)然,一個(gè)設(shè)計(jì)得好的 SQL 數(shù)據(jù)庫的表現(xiàn)一定會(huì)比一個(gè)設(shè)計(jì)得不好的 NoSQL 數(shù)據(jù)庫性能好很多
六. 適用場景
適合使用 SQL 開發(fā)的項(xiàng)目:
- 數(shù)據(jù)庫模式,結(jié)構(gòu)可以預(yù)先規(guī)定的,或者可以相對固定的項(xiàng)目
- 要求數(shù)據(jù)一致性
- 具有良好的開發(fā)者經(jīng)驗(yàn)和技術(shù)支持的標(biāo)準(zhǔn)的成熟技術(shù)
適合使用 NoSQL 開發(fā)的項(xiàng)目:
- 不相關(guān),不確定和逐步發(fā)展的數(shù)據(jù)需求
- 更簡單或者更寬松的能夠快速開始編程的項(xiàng)目
- 速度和可擴(kuò)展性至關(guān)重要的
當(dāng)然現(xiàn)在很多項(xiàng)目都使用 SQL 和 NoSQL 相結(jié)合的方式,各自發(fā)揮其優(yōu)點(diǎn)。
以上為文章所有內(nèi)容,如有錯(cuò)誤,敬請指出,多多指教,謝謝!