1、概念數據庫
SQL (Structured Query Language) 數據庫,指關係型數據庫。主要表明:SQL Server,Oracle,MySQL(開源),PostgreSQL(開源)。架構
NoSQL(Not Only SQL)泛指非關係型數據庫。主要表明:MongoDB,Redis,CouchDB。機器學習
2、區別性能
1、存儲方式學習
SQL數據存在特定結構的表中;而NoSQL則更加靈活和可擴展,存儲方式能夠省是JSON文檔、哈希表或者其餘方式。SQL一般以數據庫表形式存儲數據。舉個栗子,存個學生借書數據:spa
而NoSQL存儲方式比較靈活,好比使用類JSON文件存儲上表中熊大的借閱數據:設計
2、表/數據集合的數據的關係blog
在SQL中,必須定義好表和字段結構後才能添加數據,例如定義表的主鍵(primary key),索引(index),觸發器(trigger),存儲過程(stored procedure)等。表結構能夠在被定義以後更新,可是若是有比較大的結構變動的話就會變得比較複雜。在NoSQL中,數據能夠在任什麼時候候任何地方添加,不須要先定義表。例以下面這段代碼會自動建立一個新的"借閱表"數據集合:索引
NoSQL也能夠在數據集中創建索引。以MongoDB爲例,會自動在數據集合建立後建立惟一值_id字段,這樣的話就能夠在數據集建立後增長索引。事務
從這點來看,NoSQL可能更加適合初始化數據還不明確或者未定的項目中。
3、外部數據存儲
SQL中如何須要增長外部關聯數據的話,規範化作法是在原表中增長一個外鍵,關聯外部數據表。例如須要在借閱表中增長審覈人信息,先創建一個審覈人表:
再在原來的借閱人表中增長審覈人外鍵:
這樣若是咱們須要更新審覈人我的信息的時候只須要更新審覈人表而不須要對借閱人表作更新。而在NoSQL中除了這種規範化的外部數據表作法之外,咱們還能用以下的非規範化方式把外部數據直接放到原數據集中,以提升查詢效率。缺點也比較明顯,更新審覈人數據的時候將會比較麻煩。
4、SQL中的JOIN查詢
SQL中可使用JOIN表連接方式將多個關係數據表中的數據用一條簡單的查詢語句查詢出來。NoSQL暫未提供相似JOIN的查詢方式對多個數據集中的數據作查詢。因此大部分NoSQL使用非規範化的數據存儲方式存儲數據。
5、數據耦合性
SQL中不容許刪除已經被使用的外部數據,例如審覈人表中的"熊三"已經被分配給了借閱人熊大,那麼在審覈人表中將不容許刪除熊三這條數據,以保證數據完整性。而NoSQL中則沒有這種強耦合的概念,能夠隨時刪除任何數據。
6、事務
SQL中若是多張表數據須要同批次被更新,即若是其中一張表更新失敗的話其餘表也不能更新成功。這種場景能夠經過事務來控制,能夠在全部命令完成後再統一提交事務。而NoSQL中沒有事務這個概念,每個數據集的操做都是原子級的。
7、增刪改查語法
8、查詢性能
在相同水平的系統設計的前提下,由於NoSQL中省略了JOIN查詢的消耗,故理論上性能上是優於SQL的。
3、補充
目前許多大型互聯網項目都會選用MySQL(或任何關係型數據庫) + NoSQL的組合方案。
關係型數據庫適合存儲結構化數據,如用戶的賬號、地址:
1)這些數據一般須要作結構化查詢(嗯,好像是廢話),好比join,這時候,關係型數據庫就要勝出一籌
2)這些數據的規模、增加的速度一般是能夠預期的
3)事務性、一致性
NoSQL適合存儲非結構化數據,如文章、評論:
1)這些數據一般用於模糊處理,如全文搜索、機器學習
2)這些數據是海量的,並且增加的速度是難以預期的,
3)根據數據的特色,NoSQL數據庫一般具備無限(至少接近)伸縮性
4)按key獲取數據效率很高,可是對join或其餘結構化查詢的支持就比較差
基於它們的適用範圍不一樣,目前主流架構纔會採用組合方案,一個也不能少。目前爲止,尚未出現一個可以通吃各類場景的數據庫,並且根據CAP理論,這樣的數據庫是不存在的。