簡單來說 SQL 數據庫和 NoSQL 數據庫有着共同的目標:存儲數據,但存儲的方式不同
一. 表
- SQL中的表結構具有嚴格的數據模式約束: 存儲數據很難出錯。
- NoSQL存儲數據更加靈活自由:可能導致數據不一致性問題的發生。
SQL
每個表規定了固定的字段,各個字段有固定的類型
NoSQL
而 NoSQL 使用類 Json 的鍵值對存儲數據(還有使用陣列、圖形的),
一個記錄或者說一個文檔可以是這樣的格式
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." }
]
}
所有的記錄組成一個集合,例如 redis
二. 數據庫的模式
SQL 模式
關係型數據庫中,在把數據存儲進去前,你需要做很多工作,如設置數據庫字符集,定義主鍵,設置各個字段的類型,設置索引等等,這些就是關係型數據庫的模式,這些模式的限制,讓表結構有着嚴格的約束。
NoSQL 無模式
而非關係型數據庫的數據可以隨時寫入,不需要去事先定好各種條條框框,也正因爲如此,NoSQL 數據庫更適合於那些不能夠確定數據需求的的工程項目。
三. 數據庫的規範化
SQL 規範化
例如我們擁有兩表
用戶表:
購物表:
通常情況下,我們不會在購物表中重複每個 user 的所有信息,而是會添加 user_id 字段關聯兩個表,以最小化數據的冗餘。
這叫做數據庫的規範化
NoSQL 非規範化
規範化的設計方法很好地優化了數據冗餘,但是在 NoSQL 中一般不會這麼設計,我們會直接爲每一條購物數據都添上用戶的所有信息:
{
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",
}
}
目的是更快地查詢,當然,如果需要頻繁更新用戶信息,自然會使效率下降
四. 事務
SQL 數據庫中提供了事務操作,將兩條或者多條更新操作結合成一個事務(要麼全部執行成功要麼都失敗)。
而 NoSQL 數據庫則缺乏傳統的事務機制,不過很多 NoSQL 數據庫也有各自的方式去處理這一類問題
五. 操作語法
SQL 數據庫使用傳統的 SQL 語言來進行增刪查改,而 NoSQL 數據庫則使用各自的語法來進行操作。
比如查詢,對比 SQL 的 select * from table;
, MongoDB 有 db.table.find()
,HBase 有scan table
通常情況下,由於 NoSQL 非規範化,數據模型的簡單等原因 NoSQL 比 SQL 語言更快,當然,一個設計得好的 SQL 數據庫的表現一定會比一個設計得不好的 NoSQL 數據庫性能好很多
六. 適用場景
適合使用 SQL 開發的項目:
- 數據庫模式,結構可以預先規定的,或者可以相對固定的項目
- 要求數據一致性
- 具有良好的開發者經驗和技術支持的標準的成熟技術
適合使用 NoSQL 開發的項目:
- 不相關,不確定和逐步發展的數據需求
- 更簡單或者更寬鬆的能夠快速開始編程的項目
- 速度和可擴展性至關重要的
當然現在很多項目都使用 SQL 和 NoSQL 相結合的方式,各自發揮其優點。
以上爲文章所有內容,如有錯誤,敬請指出,多多指教,謝謝!