告訴你 SQL 數(shù)據(jù)庫(kù)與 NoSQL 數(shù)據(jù)庫(kù)的區(qū)別

簡(jiǎn)單來說 SQL 數(shù)據(jù)庫(kù)和 NoSQL 數(shù)據(jù)庫(kù)有著共同的目標(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 的鍵值對(duì)存儲(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ù)庫(kù)的模式

SQL 模式

關(guān)系型數(shù)據(jù)庫(kù)中,在把數(shù)據(jù)存儲(chǔ)進(jìn)去前,你需要做很多工作,如設(shè)置數(shù)據(jù)庫(kù)字符集,定義主鍵,設(shè)置各個(gè)字段的類型,設(shè)置索引等等,這些就是關(guān)系型數(shù)據(jù)庫(kù)的模式,這些模式的限制,讓表結(jié)構(gòu)有著嚴(yán)格的約束。

NoSQL 無模式

而非關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)可以隨時(shí)寫入,不需要去事先定好各種條條框框,也正因?yàn)槿绱?,NoSQL 數(shù)據(jù)庫(kù)更適合于那些不能夠確定數(shù)據(jù)需求的的工程項(xiàng)目。

三. 數(shù)據(jù)庫(kù)的規(guī)范化

SQL 規(guī)范化

例如我們擁有兩表
用戶表:

購(gòu)物表:

通常情況下,我們不會(huì)在購(gòu)物表中重復(fù)每個(gè) user 的所有信息,而是會(huì)添加 user_id 字段關(guān)聯(lián)兩個(gè)表,以最小化數(shù)據(jù)的冗余。
這叫做數(shù)據(jù)庫(kù)的規(guī)范化

NoSQL 非規(guī)范化

規(guī)范化的設(shè)計(jì)方法很好地優(yōu)化了數(shù)據(jù)冗余,但是在 NoSQL 中一般不會(huì)這么設(shè)計(jì),我們會(huì)直接為每一條購(gòu)物數(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ù)庫(kù)中提供了事務(wù)操作,將兩條或者多條更新操作結(jié)合成一個(gè)事務(wù)(要么全部執(zhí)行成功要么都失敗)。

而 NoSQL 數(shù)據(jù)庫(kù)則缺乏傳統(tǒng)的事務(wù)機(jī)制,不過很多 NoSQL 數(shù)據(jù)庫(kù)也有各自的方式去處理這一類問題

五. 操作語法

SQL 數(shù)據(jù)庫(kù)使用傳統(tǒng)的 SQL 語言來進(jìn)行增刪查改,而 NoSQL 數(shù)據(jù)庫(kù)則使用各自的語法來進(jìn)行操作。

比如查詢,對(duì)比 SQL 的 select * from table; , MongoDB 有 db.table.find() ,HBase 有scan table

通常情況下,由于 NoSQL 非規(guī)范化,數(shù)據(jù)模型的簡(jiǎn)單等原因 NoSQL 比 SQL 語言更快,當(dāng)然,一個(gè)設(shè)計(jì)得好的 SQL 數(shù)據(jù)庫(kù)的表現(xiàn)一定會(huì)比一個(gè)設(shè)計(jì)得不好的 NoSQL 數(shù)據(jù)庫(kù)性能好很多

六. 適用場(chǎng)景

適合使用 SQL 開發(fā)的項(xiàng)目:
  • 數(shù)據(jù)庫(kù)模式,結(jié)構(gòu)可以預(yù)先規(guī)定的,或者可以相對(duì)固定的項(xiàng)目
  • 要求數(shù)據(jù)一致性
  • 具有良好的開發(fā)者經(jīng)驗(yàn)和技術(shù)支持的標(biāo)準(zhǔn)的成熟技術(shù)
適合使用 NoSQL 開發(fā)的項(xiàng)目:
  • 不相關(guān),不確定和逐步發(fā)展的數(shù)據(jù)需求
  • 更簡(jiǎn)單或者更寬松的能夠快速開始編程的項(xiàng)目
  • 速度和可擴(kuò)展性至關(guān)重要的

當(dāng)然現(xiàn)在很多項(xiàng)目都使用 SQL 和 NoSQL 相結(jié)合的方式,各自發(fā)揮其優(yōu)點(diǎn)。


以上為文章所有內(nèi)容,如有錯(cuò)誤,敬請(qǐng)指出,多多指教,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容