NOSQL数据结构
NoSQL的⼀些⾮功能性的特性,⽐如扩展性、性能以及⼀致性的讨论,⽬前已经有很多。⽽对于NoSQL产品内部数据模型相关的知识⼀直⽐较⽋缺,本⽂就希望能够系统地对NoSQL数据模型进⾏⼀些探讨。
我们⼤致先将NoSQL数据模型划分为下⾯⼏类:Key-Value存储、类BigTable数据库、⽂档数据库,全⽂索引引擎以及图数据库。
下⾯先上⼀个简单有趣的⽰例图,简单描述各个不同数据模型的构造:
对照上⾯的图⽚,我们对⼏种数据模型进⾏简单的描述:
Key-Value模型是最简单,也是最⽅便使⽤的数据模型,它⽀持简单的key对value的键值存储和提取
Key-Value模型的⼀个⼤问题是它通常是由HashTable实现的,所以⽆法进⾏范围查询,所以有序Key-Value模型就出现了,有序Key-Value可以⽀持范围查询
redis是nosql数据库吗虽然有序Key-Value模型能够解决范围查询和问题,但是其Value值依然是⽆结构的⼆进制码或纯字符串,通常我们只能在应⽤层去解析相应的结构。⽽类BigTable的数据模型,能够⽀持结构化的数据,包括列,列簇,时间戳以及版本控制等元数据的存储。
⽽⽂档型存储相对到类BigTable存储⼜有两个⼤的提升。⼀是其Value值⽀持复杂的结构定义,⼆是⽀持数据库索引的定义。
全⽂索引模型与⽂档型存储的主要区别在于⽂档型存储的索引主要是按照字段名来组织的,⽽全⽂索引模型是按字段的具体值来组织的。
图数据库模型也可以看作是从Key-Value模型发展出来的⼀个分⽀,不同的是它的数据之间有着⼴泛的关联,并且这种模型⽀持⼀些图结构的算法。
对于NoSQL与关系型的差别,简单总结如下:
NoSQL数据库的数据模型通常与实际需求更贴近。通常使⽤关系型数据库时,需要关⼼的问题是“数据库能提供哪些功能”,⽽NoSQL模型关⼼得更多的是“可以解决哪些问题”
使⽤NoSQL数据模型,通常需要你对存储的内部结构和实现算法有⼀定的了解。
使⽤NoSQL数据库,通常要⾃⼰处理数据结构解析和数据的冗余复制问题。
对于关系型数据库来说,对数据分级存储的处理并不强。但是对图数据库,或者说其它的NoSQL数据库来说,对数据的分级处理都是预先考虑的。
⽬前简单将NoSQL⼏个分类的代表产品列举如下:
Key-Value 存储: Oracle Coherence, Redis, Kyoto Cabinet
类BigTable存储: Apache HBase, Apache Cassandra
⽂档数据库: MongoDB, CouchDB
全⽂索引: Apache Lucene, Apache Solr
图数据库: neo4j, FlockDB