NoSql與Sql之間的優勝劣汰

前言

咱們都知道Sql(Structured Query Language),翻譯過來就是結構化查詢語言,經常使用的Sql database有mysql、oracle、sqlserver等等,那NoSql是什麼呢? NoSql在維基上面的解釋是,"non SQL" or "non relational",翻譯過來就是非SQL或非關係,咱們一般的解釋是Not only sql,不只僅是SQL,咱們從相關聯的地方來逐步掰扯掰扯。mysql

結構化與no 結構化git

  • 結構化數據:行數據,存儲在二維表(關係型數據庫),能夠用結構來邏輯表達實現的數據。
  • 非結構化數據:不方便用數據庫二維邏輯表來表現的數據即稱爲非結構化數據,包括全部格式的辦公文檔、文本、圖片、XML、圖像、音頻、視頻等。
  • 半結構化數據:介於二者之間,JSON、HTML文檔就屬於半結構化數據,自描述、數據的結構和內容混在一塊兒,沒有明顯區分。

先看看數據模型,結構化:二維表(關係型),非結構化:無,半結構化:樹,圖。github

設計角度
SQL遵循ACID原則
A:原子性(Atomicity)
C:一致性(Consistency)
I:隔離性(Isolation)
D:持久性(Durabilityweb

數據庫設計:3NF
一:確保每列保持原子性
二:確保表中的每列都和主鍵相關
三:確保每列都和主鍵直接相關而不是間接相關算法

NoSQL遵循CAP理論,布式系統只能知足其中兩項
C:一致性(Consistency)(全部節點在同一時間具備相同的數據)
A:可用性(Availability)(保證每一個請求無論成功或者失敗都有響應)
P:分區容錯性(Partition tolerance)(系統中任意信息的丟失或失敗不會影響系統的繼續運做)sql

使用BASE模型
Basically Available:基本可用
Soft State:軟狀態,能夠一段時間內狀態不一樣步
Eventually consistent:最終一致性數據庫

優缺點
優勢
關係型數據庫:事務機制和高效的查詢機制
非關係型數據庫:靈活的可擴展性,靈活的數據模型,與雲計算緊密融合。緩存

缺點
關係型數據庫:web2.0時代,海量數據的管理需求,數據高併發的需求,高可擴展性和高可用性的需求都很難知足。網絡

  1. 網站系統一般不要求嚴格的數據庫事務
  2. 並不要求嚴格的讀寫實時性
  3. 一般不包含大量複雜的SQL查詢

非關係型數據庫:複雜的查詢和事務,還有不如關係型成熟數據結構

解決辦法
沒有一個模式可以適用於大相徑庭的業務場景
關係模型做爲統一的數據模型即被用於數據分析,也被用於在線業務,但這二者一個強調高吞吐,一個強調低延時,已經演化出徹底不一樣的架構。
Hadoop就是針對數據分析,MongoDB、Redis等就是針對在線業務,二者都拋棄了關係模型。因此在設計的時候要根據業務的實際場景來劃分不一樣的數據區域,作不一樣的數據處理。

NoSQL四大類型

  • 鍵值數據庫:例:Redis、SimpleDB、Memcached,鍵值對模式,涉及頻繁讀寫,擁有簡單數據模型的應用,內容緩存,好比會話、配置文件、參數、購物車等,擴展性好、靈活、大量寫操做時性能高,沒法存儲結構化信息,條件查詢效率低,不支持事務,某些鍵值數據庫中產生故障時,不可用回滾。

  • 列族數據庫:例:BigTable、Hbase、HadoopDB,列族模式,分佈式數據庫存儲和管理、數據分佈於多個數據中心的應用,能夠容忍副本中存在短時間不一致狀況的應用,擁有動態字段的應用,擁有潛在大量數據的應用,查找速度快、可擴展性強,容易進行分佈式擴展,複雜性低,功能較少,大都不支持強事務一致性。

  • 文檔數據庫:例:MongoDB、CouchDB,鍵值是版本化的文檔,存儲、索引並管理面向文檔的數據或者相似的半結構化數據,用於後臺具備大量讀寫操做的網站,使用JSON數據結構的應用,使用嵌套結構等非規範化數據的應用程序,性能較好(高併發),靈活高,複雜低,數據結構靈活,能夠將常常查詢的數據存儲同一個文檔中,既能夠根據鍵來構建索引,也能夠根據值(內容)構建索引。像XML文檔、HTML文檔、JSON文檔都可以對包含的數據類型和內容進行「自我描述」。缺點是缺少統一的查詢語法,文檔數據庫不支持文檔間的事務。

  • 圖形數據庫:例:Neo4J,圖結構模式,專門用於處理具備高度相互關聯關係的數據,比較適合於社交網絡、模式識別、依賴分析、推薦系統已經路徑尋找等問題,靈活性高,支持複雜回形算法,可用於構建複雜的關係圖譜,複雜性高,只能支持必定的數據規模。

附上對比圖

比較標準 RDBMS NoSQL 備註
數據庫原理 徹底支持 部分支持 RDBMS有關係代數理論做爲基礎,NOSQL沒有統一的理論基礎
數據規模 超大 RDBMS很難橫向擴展,縱向擴展的空間有限,性能隨規模增大而下降,NOSQL容易實現增長設備支持
數據庫模式 固定 靈活 RDBMS定義數據庫模式嚴格遵照約束條件,NOSQL不存在數據庫模式
查詢效率 RDBMS藉助索引機制能夠實現快速查詢,NOSQL沒有複製查詢的索引,不具有高度結構化查詢特性
一致性 RDBMS遵循ACID原則,NOSQL放鬆事務要求,遵循BASE模型只能保證最終一致性
數據完整性 容易 很難 RDBMS經過主鍵或者非空約束、外鍵等來實現,NOSQL沒法實現
擴展性 通常 參考數據規模
可用性 很好 RDBMS在任什麼時候候均可以保證數據一致性爲優先目標、其次纔是優化系統性能,隨數據量增大爲保證一致性只能提供較弱的可用性,NOSQL能提供較高的可用性
標準化 RDBMS已經標準化(SQL),NOSQL沒有統一查詢語言,沒有行業標準
技術支持 RDBMS成熟,NOSQL起步
可維護性 複雜 複雜

結語

對NoSQL興趣的話推薦另一篇文章,是關於Hbase的。
淺談Hbase與中間的一些設計策略
我的博客~
簡書~

相關文章
相關標籤/搜索