NO-Sql數據庫:Not Only不僅僅是SQL
定義:非關系型數據庫;NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。需要進一步數據挖掘和分析。
RDBMS VS NOSQL
RDBMS | NoSQL |
高度組織化結構化數據 | 代表着不僅僅是SQL |
結構化查詢語言(SQL) (SQL) | 沒有聲明性查詢語言 |
數據和關系都存儲在單獨的表中 | 沒有預定義的模式 |
數據操縱語言,數據定義語言 | 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫 |
嚴格的一致性 | 最終一致性,而非ACID屬性 |
基礎事務 | 非結構化和不可預知的數據 |
CAP定理 |
|
高性能,高可用性和可伸縮性 |
對可用性及一致性的弱要求原則:BASE
- Basically Availble --基本可用
- Soft-state --軟狀態/柔性事務。 "Soft state" 可以理解為"無連接"的, 而 "Hard state" 是"面向連接"的
- Eventual Consistency --最終一致性 最終一致性, 也是是 ACID 的最終目的。
NoSQL 數據庫分類
類型 |
部分代表
|
特點 |
列存儲 | Hbase Cassandra Hypertable |
顧名思義,是按列存儲數據的。最大的特點是方便存儲結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。 |
文檔存儲 |
MongoDB CouchDB |
文檔存儲一般用類似json的格式存儲,存儲的內容是文檔型的。這樣也就有有機會對某些字段建立索引,實現關系數據庫的某些功能。 |
key-value存儲 |
Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB Redis |
可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收。(Redis包含了其他功能) |
圖存儲 |
Neo4J FlockDB |
圖形關系的最佳存儲。使用傳統關系數據庫來解決的話性能低下,而且設計使用不方便。 |
對象存儲 |
db4o Versant |
通過類似面向對象語言的語法操作數據庫,通過對象的方式存取數據。 |
xml數據庫 |
Berkeley DB XML BaseX |
高效的存儲XML數據,並支持XML的內部查詢語法,比如XQuery,Xpath。
|
Key-Value存儲:(基於Redis)
傳統的關系型數據庫,處理一對多的問題,需要把外鍵放在多的一端,因為RDBMS理論中沒有集合這個概念。而使用Redis,我們可以在一端來管理一對多的關系,使用Set。
如果使用MySQL,當數據規模非常大時,上面兩個查詢操作都需要借助表關聯技術,而大表間的join在大型系統中是需要極力避免的操作。相反Redis的每個操作都會局限在一個較小的數據集范圍內,而且key-value的存儲形式,定位key只是一個復雜度為O(1)的操作。在very huge的數據量下,Redis性能效果非常優異,這就是NoSQL的優勢所在!