咱們都知道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時代,海量數據的管理需求,數據高併發的需求,高可擴展性和高可用性的需求都很難知足。網絡
非關係型數據庫:複雜的查詢和事務,還有不如關係型成熟數據結構
解決辦法
沒有一個模式可以適用於大相徑庭的業務場景
關係模型做爲統一的數據模型即被用於數據分析,也被用於在線業務,但這二者一個強調高吞吐,一個強調低延時,已經演化出徹底不一樣的架構。
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與中間的一些設計策略
我的博客~
簡書~