概念
SQL (Structured Query Language) 數(shù)據(jù)庫(kù)伴挚,指關(guān)系型數(shù)據(jù)庫(kù) - 主要代表:SQL Server阎抒,Oracle,MySQL(開源)司浪,PostgreSQL(開源)泊业。
NoSQL(Not Only SQL)泛指非關(guān)系型數(shù)據(jù)庫(kù) - 主要代表:MongoDB,Redis啊易,CouchDB吁伺。
主要區(qū)別
1.存儲(chǔ)方式:
SQL數(shù)據(jù)存在特定結(jié)構(gòu)的表中;而NoSQL則更加靈活和可擴(kuò)展租谈,存儲(chǔ)方式可以省是JSON文檔篮奄、哈希表或者其他方式。
SQL通常以數(shù)據(jù)庫(kù)表形式存儲(chǔ)數(shù)據(jù)割去。舉個(gè)栗子窟却,存?zhèn)€學(xué)生借書數(shù)據(jù):
而NoSQL存儲(chǔ)方式比較靈活,比如使用類JSON文件存儲(chǔ)上表中熊大的借閱數(shù)據(jù):
2. 表/數(shù)據(jù)集合的數(shù)據(jù)的關(guān)系
在SQL中劫拗,必須定義好表和字段結(jié)構(gòu)后才能添加數(shù)據(jù)间校,例如定義表的主鍵(primary key),索引(index),觸發(fā)器(trigger),存儲(chǔ)過程(stored procedure)等页慷。表結(jié)構(gòu)可以在被定義之后更新憔足,但是如果有比較大的結(jié)構(gòu)變更的話就會(huì)變得比較復(fù)雜。
在NoSQL中酒繁,數(shù)據(jù)可以在任何時(shí)候任何地方添加滓彰,不需要先定義表。例如下面這段代碼會(huì)自動(dòng)創(chuàng)建一個(gè)新的"借閱表"數(shù)據(jù)集合:
NoSQL也可以在數(shù)據(jù)集中建立索引州袒。以MongoDB為例揭绑,會(huì)自動(dòng)在數(shù)據(jù)集合創(chuàng)建后創(chuàng)建唯一值_id字段,這樣的話就可以在數(shù)據(jù)集創(chuàng)建后增加索引。
從這點(diǎn)來看他匪,NoSQL可能更加適合初始化數(shù)據(jù)還不明確或者未定的項(xiàng)目中菇存。
3. 外部數(shù)據(jù)存儲(chǔ)
SQL中如何需要增加外部關(guān)聯(lián)數(shù)據(jù)的話,規(guī)范化做法是在原表中增加一個(gè)外鍵邦蜜,關(guān)聯(lián)外部數(shù)據(jù)表依鸥。例如需要在借閱表中增加審核人信息,先建立一個(gè)審核人表
再在原來的借閱人表中增加審核人外鍵
這樣如果我們需要更新審核人個(gè)人信息的時(shí)候只需要更新審核人表而不需要對(duì)借閱人表做更新悼沈。
而在NoSQL中除了這種規(guī)范化的外部數(shù)據(jù)表做法以外贱迟,我們還能用如下的非規(guī)范化方式把外部數(shù)據(jù)直接放到原數(shù)據(jù)集中,以提高查詢效率絮供。缺點(diǎn)也比較明顯衣吠,更新審核人數(shù)據(jù)的時(shí)候?qū)?huì)比較麻煩。
4.SQL中的JOIN查詢
SQL中可以使用JOIN表鏈接方式將多個(gè)關(guān)系數(shù)據(jù)表中的數(shù)據(jù)用一條簡(jiǎn)單的查詢語(yǔ)句查詢出來壤靶。
而NoSQL暫未提供類似JOIN的查詢方式對(duì)多個(gè)數(shù)據(jù)集中的數(shù)據(jù)做查詢缚俏。所以大部分NoSQL使用非規(guī)范化的數(shù)據(jù)存儲(chǔ)方式存儲(chǔ)數(shù)據(jù)。
5.數(shù)據(jù)耦合性
SQL中不允許刪除已經(jīng)被使用的外部數(shù)據(jù)萍肆,例如審核人表中的"熊三"已經(jīng)被分配給了借閱人熊大袍榆,那么在審核人表中將不允許刪除熊三這條數(shù)據(jù),以保證數(shù)據(jù)完整性塘揣。
而NoSQL中則沒有這種強(qiáng)耦合的概念,可以隨時(shí)刪除任何數(shù)據(jù)宿崭。
6.事務(wù)
SQL中如果多張表數(shù)據(jù)需要同批次被更新亲铡,即如果其中一張表更新失敗的話其他表也不能更新成功。這種場(chǎng)景可以通過事務(wù)來控制葡兑,可以在所有命令完成后再統(tǒng)一提交事務(wù)奖蔓。
而NoSQL中沒有事務(wù)這個(gè)概念,每一個(gè)數(shù)據(jù)集的操作都是原子級(jí)的讹堤。
7.增刪改查語(yǔ)法
8.查詢性能
這個(gè)比較有爭(zhēng)議吆鹤。在相同水平的系統(tǒng)設(shè)計(jì)的前提下,因?yàn)镹oSQL中省略了JOIN查詢的消耗洲守,故理論上性能上是優(yōu)于SQL的疑务。