NoSQL 数据库要提供非常高效、强大的海量数据存储与处理工具,其存储方式灵活。NoSQL 的数据模型是基于高性能的需求提出的。根据数据的存储模型和特点,NoSQL 数据库有很多类,按存储方式分为列存储数据库、键值对数据库、文档数据库、图形数据库等。
(1)列存储(Column Family)方式:在数据表的定义中只定义列族,存储时按照列族分块存储,用来应对分布式存储的海量数据。键仍然存在,特点是指向了多个列。列族中的列可以随应用变化,方便灵活。与关系数据库的按行存储不同,列存储数据库不管数据类型,按列将同一列的数据存储在一起;可以存储结构化和半结构化数据;对数据进行压缩;针对某一列或者某几列的查询有非常大的 I/O 优势。典型的例子有 HBase、Cassandra和Hypertable等。
(2)键值对(Key-Value)存储方式:用一个哈希表存储数据,表中有一个特定的键和一个指向特定数据的指针。该模型简单、易部署。键值对数据库,存储的数据由键(Key)和值(Value)两部分组成,通过键快速查询到其值,值的格式可以根据具体应用来确定。典型的例子有Redis、Tokyo Cabinet / Tyrant Berkeley DB、MemcacheDB等数据库。
(3)文档(Document)存储方式:概念来自于 Lotus Notes 办公软件,该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储。文档存储时允许文档的嵌套和引用,文档的查询效率更高。文档存储数据库存储的内容是文档型的,可以用格式化文件(类似JSON、XML等)的格式存储,可对某些字段建立索引,实现关系数据库的某些功能。典型的例子有MongoDB、CouchDB等。
(4)图形(Graph)存储方式:数据库中的数据以图形(结点和边)的方式进行存储,使用灵活的图形模型,能够扩展到多个服务器上。在图形存储数据库中,数据以有向加权图的方式进行存储。社交关系、推荐系统、关系图谱的存储以图形存储方式为最佳。这些数据使用传统关系数据库来存储的话性能低下,而且设计使用不方便。典型的例子是Neo4j等。
NoSQL 数据库没有标准的查询语言(SQL),进行数据库查询需要制定数据模型。许多NoSQL数据库都提供操作的应用程序接口API,包括提供各种程序设计语言如C、Java等的驱动、自己的Shell语言和相关的程序开发包等接口。NoSQL的优点是高可扩展性、分布式计算、低成本、架构的灵活性,半结构化数据、没有复杂的关系。其缺点是没有标准化、有限的查询功能(到目前为止)、最终一致不直观等。NoSQL数据库种类繁多,共同的特点都是去掉关系数据库的关系型特性,数据之间无关系,在架构的层面上带来了可扩展的能力。
不同的应用需要的数据存储格式也不同,可以针对不同的应用场景来开发:对象存储数据库是通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据;XML 数据库的数据存储格式是XML格式,它提供数据存储,支持XQuery和XPath的查询语法等。