数据库存储模型-数据存储
按照存儲模型來說分為以下4類。
- 鍵值存儲
- 列式存儲
- 文檔存儲
- 圖形存儲
鍵值模型
鍵值數據模型的主要思想來自于哈希表:在哈希表中有一個特定的key和一個value指針,指向特定的數據。鍵值模型對于海量數據存儲系統來說,最大的優勢在于數據模型簡單,易于實現,非常適合通過key對數據進行查詢和修改等操作。但是若對整個海量數據存儲系統需要更側重于批量數據的查詢,更新操作,鍵值數據模型則在效率上處于明顯的不足。同樣的,鍵值存儲不支持特別復雜邏輯的數據操作。
1)Redis
Redis在本質上是一個鍵值模型的內存數據庫,整個數據庫加載在內存中進行數據操作,并定期通過異步操作把數據庫數據寫回到硬盤上進行保存。因為是純內存操作,Redis的性能非常出色,每秒可以處理超過10萬次讀寫操作。Redis的出色之處不僅僅是性能,其最大特色是支持諸如鏈表和集合這樣的復雜數據結構,而且還支持對鏈表進行各種操作。
主要缺點是:數據庫容量受到物理內存的限制,不能簡單地用作大量數據的高性能讀寫,而且他沒有原生的可擴展機制,不具有可擴展能力,要依賴于客戶端來實現分布式讀寫。因此,Redis適合的場景主要局限在較小數據量的高性能操作和運算上。
redis數據結構底層原理可以參考:redis底層原理
2)Dynamo
Dynamo是Amazon提出的一個分布式鍵值存儲系統,它具有高度可用,可升級的分布式數據存儲中心。Dynamo是一個動態自適配的分布式系統。存儲節點可以簡單地從Dynamo上添加和刪除,而不需要任何人工的劃分和重新分配。
作為一個商業應用,Dynamo并沒有公開技術文檔和源代碼。了解更多可以參考:Amazon Dynamo系統架構
列式存儲
列式存儲主要使用類似于表這樣的傳統數據模型,但是它并不支持類似表連接這樣的多表操作,它的主要特點是在存儲數據時,主要圍繞著列,而不像傳統的關系型db那樣根據行進行存儲。也就是說,屬于同一列的數據盡可能的存儲在硬盤同一頁中,而不是將屬于同一行的數據存放在一起,這樣將會節省大量的I/O操作。
大多數列式數據庫都支持”列族“這個特性,所謂列族即將多個列并為一個組。總之,這種數據模型的優點是比較適合數據分析和數據倉庫這類需要迅速查找且數據量大的應用。
1)BigTable
Bigtable是一個為管理大規模結構化數據而設計的分布式存儲系統,可以擴展到PB級數據和上千臺服務器。
本質上說,Bigtable是一個鍵值(key-value)映射。按作者的說法,Bigtable是一個稀疏的,分布式的,持久化的,多維的排序映射。
來看看多維、排序、映射。Bigtable的鍵有三維,分別是行鍵(row key)、列鍵(column key)和時間戳(timestamp),行鍵和列鍵都是字節串,時間戳是64位整型;而值是一個字節串。可以用 (row:string, column:string, time:int64)→string 來表示一條鍵值對記錄。
例子:
table{ // ... "aaaaa" : { //一行 "A:foo" : { //一列 15 : "y", //一個版本 4 : "m" }, "A:bar" : { //一列 15 : "d", }, "B:" : { //一列 6 : "w" 3 : "o" 1 : "w" } }, // ... }查詢時,如果只給出行列,那么返回的是最新版本的數據;如果給出了行列時間戳,那么返回的是時間小于或等于時間戳的數據。比如,我們查詢”aaaaa”/”A:foo”,返回的值是”y”;查詢”aaaaa”/”A:foo”/10,返回的結果就是”m”;查詢”aaaaa”/”A:foo”/2,返回的結果是空。
2)Cassandra與Hbase
Cassandra項目是Facebook于2008年開發出來的。Hbase全稱為Hadoop Database,是一個構建在Apache Hadoop上的 列式數據庫。Hbase有很好的擴展性,被認為是Bigtable的一個克隆,可以存儲數以億計的行。
Cassandra和Hbase的數據模型都借鑒自google的bigtable:每一行數據的各項被存儲在不同的列中,這些列的集合稱為列族。而每一列中每一個數據都包含一個時間戳屬性,這樣列中的同一個數據項的多個版本都能保存下來。
文檔存儲
文檔存儲的目標是在鍵值存儲方式(提供高性能和高伸縮性)和傳統的關系數據系統(豐富的功能)之間架起一個橋梁,集兩者的優勢于一身。其數據主要以JSON或者類JSON格式的文檔來進行存儲,是有語義的。文檔型數據庫可以看做是鍵值數據庫的升級版,允許在存儲的值中再嵌套鍵值,且文檔存儲模型一般可以對其值創建索引方便上層應用,而這一點是普通鍵值數據庫無法支持的。
1)MongoDB
MongoDB是一種可擴展,高性能,開源的面相文檔的數據庫,采用c++開發。它介于關系數據庫和非關系數據庫之間。MongoDB支持的數據結構非常松散,是類似JSON的BJSON格式,因此可以存儲比較復雜的數據類型。其最大特點是支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言。
它只要解決的是海量數據的訪問效率問題,當數據量達到50G以上時,他的數據庫訪問速度是MySQL的10倍以上。
了解更多看可以查看:圖解MongoDB原理
2)CouchDB
CouchDB是Apache組織發布的一款NoSQL開源數據庫項目,是面向文檔數據類型的Nosql,它由Enlang編寫而成,使用JSON格式保存數據。他的數據結構很簡單,字段只有三個:文檔ID,文檔版本號和內容。
它的優勢在于:他的數據存儲格式是JSON,而JSON作為一種文本數據可以廣泛用于多種語言模塊之間的數據傳遞,便于學習。
圖形存儲
采用圖結構存儲數據可以應用圖論算法進行各種復雜的算法,如最短路徑,集中度測量等。
1)Neo4J
它是一個嵌入式,基于磁盤的,支持完整實物的JAVA持久化引擎。它采用圖結構而不是表結構存儲數據。Neo4J可以支持大規模可擴展性,在一臺機器上可以處理數10億節點,關系或者屬性的圖形結構,也可以擴展到多臺機器并行運行。
圖形數據庫善于處理大量復雜,互連結,低結構的數據。這些數據變化迅速,需要頻繁的查詢。它重要解決傳統關系數據庫在查詢時需要進行大量表連接而出現性能衰退的問題。
了解更多可以查看:neo4j-底層存儲結構分析
2)GraphDB
GraphDB是2007年Sones公司開發的一款企業圖形數據存儲系統。它使用c#開發。GraphDB的一大優勢是善于處理一類特定的問題:數據集包含了大量的關系,處理這些數據時需要快速高效的遍歷這些關系。
總結
以上是生活随笔為你收集整理的数据库存储模型-数据存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单机存储系统
- 下一篇: 数据库事务和并发控制