NoSql
前言
隨着大數據時代的崛起,應用程序需要處理的數據的複雜性大大增加,數據的複雜性不僅包括它的大小,還包括它的相互關聯性,結構的千變萬化以及對數據的同時訪問。
假設,我們要查詢一組數據,但是join了4、5次,進行一次搜索深度爲4的查詢,這將會爲關係型數據引擎帶來巨大的壓力,當數據量過大時,每增加一個深度,無意再先前的基數上再做笛卡爾積,如果有1000條數據,我要通過關係型數據庫進行深度爲5的查詢,那將會產生1000的5次方個記錄,然而這僅僅是1000條數據,真正的大數據環境下,至少都是上百萬條的數據,顯然,關係型數據庫在這種複雜的對象映射關係中並不適合,所以NoSql的概念也已應運而生。
儘管NoSQL的名字已經被人們所接受,但這個並沒有準確反映出其代表的意義,反而給人們以錯誤的映像,認爲它只是對SQL而言的一個概念。相對而言,叫做”非關係型數據庫”會更合適一些,因爲 關係型/非關係範式纔是我們關注的point,而SQL只是關係型技術使用的一種語言。
非關係型數據庫主要有四類:
- 主鍵值存儲
- 列族存儲
- 面向文檔的數據庫
- 圖形數據庫
主鍵值存儲
主鍵值存儲代表了最簡單,但卻非常強大的處理大量併發訪問數據的方法。緩存是一種典型的主鍵值技術。主鍵值存儲允許使用非常簡單的結構存儲數據,這些數據常常在內存中,甚至在高併發環境下的高速訪問。
這些數據存儲在一個巨大的哈希表中,由主鍵進行訪問。數據取主鍵值對的形式,對其操作大都侷限於使用簡單的put(write)和get(read)操作。其值僅支持簡單的數據結構如文本或二進制內容,雖然一些較新的主鍵值存儲支持一組有限的複雜數據類型(如:Redis支持列表和映射作爲值)。
主鍵值存儲是最簡單的NOSQL技術。所有其他的NOSQL類別都建立在簡單性、高性能和可擴展性的主鍵值存儲技術上,以更好的適合一些特定的使用場所。
小結
主鍵值存儲:
典型應用案例
- 緩存
- 快速讀取訪問簡單域
大規模併發系統
最著名的技術
Redis
- Memcached
- Tokyo Cabinet
列族存儲
分佈式主鍵值模型縮放的很好,但是在這模型中,必須使用某些類型的數據結構。這就是列族存儲類如何進入到NOSQL領域中的。
列族存儲是將類似的值(或列)作爲一組一起存儲在同一列族中(例如,用戶數據或有關書籍的信息)。使用這種方法,從一個單一的主鍵值存儲發展到一組相關值的存儲。(可以把列族中存儲的數據看作爲一張映射圖,或者將主鍵值存儲到每一個值都是另外一張映射圖的地方)。列族都存在一個單一的文件中,以實現更好的讀取和寫入相關數據的性能。這種方法的主要目的是實現在大數據時的高性能和高可用性。這個領域的領先技術是Goole的BigTable和Cassandra,最初都是由Facebook開發的。
小結
列族存儲:
典型應用案例
- 大規模寫入
併發數據訪問(讀和寫)
最著名的技術
Cassandra
- Goole BigTable
- Apache HBase
面向文檔的數據庫
很多實際的問題需求看上去像是一個文件的數據結構。面向文檔的數據庫正好提供的這樣的需求,用以存儲簡單的,但確實高效的,無架構的文檔數據。文檔模型中使用的數據結構,可以使你添加自包含的文件和關聯關係到該文檔的數據中。
你可以將面向文檔數據庫,看作主鍵值存儲,這裏的值就是一個文件。這使得面向文檔數據庫更容易爲通用軟件問題建立數據模型,但這使得它的性能和可擴展性相比主鍵值和列族存儲稍微有些降低。內置於存儲系統的對象模型的遍歷通常是一個對所有情況很好的權衡,但不包括大量的併發使用情況。
小結
面向文檔數據庫:
典型應用案例
- 當域模型是一個自然文件
- 使用自然文件數據結構簡化開發
高可擴展系統(儘管在主鍵值存儲和列族存儲的低層次上)
最著名的技術
MongoDB
- CouchDB
圖形數據庫
圖形數據庫的設計是從以下出發的,即開發人員常常在他們的應用程序中建立圖形狀的數據結構,單仍然將數據以一個非自然的方式存儲,或者是在表格和關係數據庫的列中,或者是在其他的NOSQL系統。如:ACL列表,社交網絡或者任何類型的網絡問題都是自然的圖形問題。圖形數據模型是圖形數據庫的核心,最終能夠將代表圖形的數據作爲一個直接圖形存儲一個對象模型。
這個數據模型可以自然地表達許多非常複雜的軟件需求,圖形遍歷查詢的效率和性能是圖形數據庫的主要優勢。
小結
圖形數據庫:
典型應用案例
- 擁有互聯的數據
- 能夠自然的用節點和關係表達的域
- 社交網絡
- 推薦引擎
訪問控制列表
最著名的技術
Neo4j
- AllegroGraph
- OrientDB