NoSQL的一些非功能性的特性,比如扩展性、性能以及一致性的讨论,目前已经有很多。而对于NoSQL产品内部数据模型相关的知识一直比较欠缺,本文希望能够系统地对NoSQL数据模型进行一些探讨。
我们大致先将NoSQL数据模型划分为下面几类:Key-Value存储、类BigTable数据库、文档数据库,全文索引引擎以及图数据库。
下面通过一个简单有趣的示例图,简单描述各个不同数据模型的构造:
对照上面的图片,我们对几种数据模型进行简单的描述:
Key-Value模型是最简单,也是使用最方便的数据模型,它支持简单的key对value的键值存储和提取;
Key-Value模型的一个大问题是它通常是由HashTable实现的,所以无法进行范围查询,所以有序Key-Value模型就出现了,有序Key-Value支持范围查询;
虽然有序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