数据库存储模型-数据存储

按照存储模型来说分为以下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的一大优势是善于处理一类特定的问题:数据集包含了大量的关系,处理这些数据时需要快速高效的遍历这些关系。

猜你喜欢

转载自blog.csdn.net/qq_33394088/article/details/80075364