SQL 和 NoSQL 的區別

 SQL (Structured Query Language) 數據庫,指關係型數據庫。主要代表:SQL Server,Oracle,MySQL(開源),PostgreSQL(開源)。

    NoSQL(Not Only SQL)泛指非關係型數據庫。主要代表:MongoDB,Redis,CouchDB。

二、區別

1、存儲方式

  SQL數據存在特定結構的表中;而NoSQL則更加靈活和可擴展,存儲方式可以省是JSON文檔、哈希表或者其他方式。SQL通常以數據庫表形式存儲數據。舉個栗子,存個學生借書數據:

而NoSQL存儲方式比較靈活,比如使用類JSON文件存儲上表中熊大的借閱數據:

2、表/數據集合的數據的關係

  在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的。

三、補充

  目前許多大型互聯網項目都會選用MySQL(或任何關係型數據庫) + NoSQL的組合方案。

 

關係型數據庫適合存儲結構化數據,如用戶的帳號、地址:

  1)這些數據通常需要做結構化查詢(嗯,好像是廢話),比如join,這時候,關係型數據庫就要勝出一籌

  2)這些數據的規模、增長的速度通常是可以預期的

  3)事務性、一致性

 

NoSQL適合存儲非結構化數據,如文章、評論:

  1)這些數據通常用於模糊處理,如全文搜索、機器學習

  2)這些數據是海量的,而且增長的速度是難以預期的,

  3)根據數據的特點,NoSQL數據庫通常具有無限(至少接近)伸縮性

  4)按key獲取數據效率很高,但是對join或其他結構化查詢的支持就比較差

 

  基於它們的適用範圍不同,目前主流架構纔會採用組合方案,一個也不能少。目前爲止,還沒有出現一個能夠通吃各種場景的數據庫,而且根據CAP理論,這樣的數據庫是不存在的。 

數據表VS.數據集

關係型和非關係型數據庫的主要差異是數據存儲的方式。關係型數據天然就是表格式的,因此存儲在數據表的行和列中。數據表可以彼此關聯協作存儲,也很容易提取數據。與其相反,非關係型數據不適合存儲在數據表的行和列中,而是大塊組合在一起。非關係型數據通常存儲在數據集中,就像文檔、鍵值對或者圖結構。你的數據及其特性是選擇數據存儲和提取方式的首要影響因素。

預定義結構VS.動態結構

關係型數據通常對應於結構化數據,因爲數據表都有預定義好的結構(列的定義),結構描述了數據的形式和內容。這一點對數據建模至關重要,你必須“第一時間先把結構定義好”。雖然預定義結構帶來了可靠性和穩定性,但是已經存入數據的表結構要修改就非常痛苦了。另一方面,非關係型數據基於動態結構,通常適用於非結構化數據。非關係型數據可以很容易適應數據類型和結構的變化,因爲動態結構本身就支持這一點。

存儲規範化VS存儲代價

關係型數據庫的數據存儲是爲了更高的規範性,把數據分隔成最小的邏輯表(關係表)以避免重複,獲得最精簡的空間利用。雖然數據規範性會使數據管理更清晰,但它通常也會帶來一點點複雜性,尤其是單個操作可能涉及多個關係表的時候,數據管理就有點麻煩。另外,更精簡的空間利用通常可以節約寶貴的數據存儲,但是在當今世界我們基本可以認爲存儲的代價(磁盤空間)是微不足道的。而非關係型數據存儲在平面數據集中,數據經常可能存在重複。單個數據庫很少被分隔開,而是存儲成一個整體,這樣是爲了整塊數據更容易讀寫。

縱向擴容VS橫向擴容

SQL和NoSQL數據庫最大的差別可能是在擴展方式上,要支持日益增長的需求當然要擴展。要支持更多併發量,SQL數據庫是縱向擴展,也就是說提高處理能力,使用速度更快速的計算機,這樣處理相同的數據集就更快了。因爲數據存儲在關係表中,操作的性能瓶頸可能涉及很多個表,這都需要通過提高計算機性能來客服。雖然SQL數據庫有很大擴展空間,但最終肯定會達到縱向擴展的上限。而NoSQL數據庫是橫向擴展的。非關係型數據存儲天然就是分佈式的,NoSQL數據庫的擴展可以通過給資源池添加更多普通的數據庫服務器(節點)來分擔負載。

結構化查詢VS非結構化查詢

關係型數據庫通過所謂結構化查詢語言(也就是我們常說的SQL)來操作數據。SQL支持數據庫CRUD(增加,查詢,更新,刪除)操作的功能非常強大,是業界標準用法。非關係型數據庫以塊(像文檔一樣)爲單元操縱數據,使用所謂的非結構化查詢語言(UnQL),它是沒有標準的,因數據庫提供商的不同而不同。關係型表中主鍵的概念對應非關係存儲中的文檔Id。SQL數據庫使用預定義優化方式(比如列索引定義)幫助加速查詢操作,而NoSQL數據庫採用更簡單而精確的數據訪問模式。

映射VS本地化

SQL和NoSQL數據存儲的選擇還取決於開發人員,儘管這個因素影響不大。採用面向對象編程語言的開發人員通常會同時操作一個或多個數據實體(包括嵌套數據、列表和數組的複雜結構),把數據傳遞給應用程序用戶界面。要是討論到底層數據庫,事情就並不總是那麼公平合理了。在關係型存儲中,數據實體通常需要分成多個部分進行規範化,然後分開存儲到多個關係型表中精簡存儲。幸運的是,這是一個長期存在的問題,大部分編程平臺都有相應的簡單解決方案,比如ORM層(對象關係映射)。ORM是位於關係型數據源和開發者使用的面向對象數據實體之間的一個映射層。然而,對於非關係型存儲,不需要規範化數據,複雜數據實體可以整體存放在獨立單元中。應用程序中使用的對象通常序列化爲JSon串,存儲在NoSQL數據庫的JSon文檔中。

事務性VS純擴展性

如果你的數據操作需要高事務性或者複雜數據查詢需要控制執行計劃,那麼傳統的SQL數據庫從性能和穩定性方面考慮是你的最佳選擇。SQL數據庫支持對事務原子性細粒度控制,並且易於回滾事務。雖然NoSQL數據庫也可以使用事務操作,但它們真正閃亮的價值是在操作的擴展性和大數據量處理方面。

ACID VS CAP

SQL 數據庫久負盛名的價值就是通過所謂的ACID屬性(原子性,一致性,隔離性,持久性)保證數據完整性,大部分關係型存儲供應商都支持ACID。我們的目標是支持隔離不可分割的事務,其變化是持久的,數據也保持一致狀態。而NoSQL數據庫是讓你在CAP(一致性,可用性,分區容忍度)中的任意兩項中選擇,因爲在基於節點的分佈式系統中,很難做到三項都滿足。

數據VS大數據

SQL數據庫可以可靠地存儲和處理數據,而NoSQL最大的優勢是在應對大數據方面,也就是由我們社會或者計算機每天產生的大量非結構化的數據實體。NoSQL用無模式方式做數據管理,所以其橫向擴展潛力是無限的,這可能是深度處理大數據捕獲、管理、檢索、分析和可視化的唯一有效途徑。

數據記錄VS物聯網和人聯網

關係數據庫在關注數據規範化和保證性能的基礎上精簡存儲。但是近年來,我們產生數據的速度遠大於關係型存儲能滿足存儲的能力增長。刺激數據如此迅猛增長的原因是:巨大量的用戶數和物聯網。連接到互聯網的用戶在成倍增加,在同步使用我們的應用。由於大量移動設備數據傳感設備接入互聯網,機器產生的數據量也大幅增加。因此企業必須尋求NoSQL技術及基礎架構來處理持續涌入的半結構化和非結構化數據。

內部部署VS雲計算

雲計算現在已經無處不在了,它兼具SQL和NoSQL數據庫的益處。雲環境中的關係型存儲通常是以服務形式提供的,是可複製、高可用性且分佈式的,極大地提高了橫向擴展能力。託管於雲服務中的NoSQL數據庫也天然享有自動分片的好處,可以階段性地靈活彈性處理,集成高速緩存和巨大的計算能力來捕獲、存儲和分析大數據。

付費VS開源

有一種看法認爲,SQL數據庫大多數比較昂貴,而NoSQL數據庫通常都是開源的。事實上,兩種類型數據庫都有開源的和商業的。常見的SQL 數據庫有微軟公司的SQL Server,MySQL,SQLite,Oracle和PostGres。流行的NoSQL數據庫有Couchbase,MongoDB,Redis,BigTable和RavenDB。

SQL和NoSQL這兩者都有各自的優缺點,選擇正確的架構取決於你構建應用的需求。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章