关于NoSQL

November 14, 2013

传统关系型数据库,将数据以表结构的方式存储起来.并且所有的数据是基于 ACID1 原则.这种方式存储数据有很明显的缺点.首先,为了保证一致性,基于 ACID1 类型的数据库都是使用事物来保持数据的一致性.也就是说同时只能有一个 client 提交数据.然后,以表结构存储的数据库架构是死的,一个表的列基本上是固定的.如果变化的话会带来很多问题.
比如:
1.我有一种数据,这些数据都是一些 Excle 表格.每个表格的列都不相同.但实际上他们都是一种数据.该如何存储?
2.一个表有 10 列,我想再加一个字段,但这个字段并不是所有数据都需要的.
3.问题同上,如果加 20 个字段呢?再新建一个表?新建的表如何与现有的表关联?

最后关联性数据库还有个不利于分布的弱点,如果数据分布在 N 台分布式的机器上,数据库该如何管理?

为了弥补这些缺点, NoSQL 类数据库诞生了.首先 NoSQL 类数据库有以下特点:
schema-less: 数据没有字段的概念,并且数据仓库(关联型数据库的 table )可以随时变化字段.
Strong Consistency: 保证数据最终的一致性.
High Availability: 保证所有请求数据的客户端都能得到一份数据的 copy.
Partition-tolerance: 数据可以不限于分布在同一台机器上.

一般 NoSQL 类数据库存储数据的模型有 4 种方式:

Key-Value: 类似于 jsonkey-value 的方式进行数据存储

BigTable: 多维度的 key-value 结构,并且存储方式是分布式,稀疏的2,严格排序的. Google 很多产品都在用,具有高压缩,高性能,易于查询的特点.

Documents: 多个 key-value 结构的数据合为一条数据,每一条数据称为为一个 docment. 并且每个 docmentkey-value 个数和 key 都可以不同.并且在搜索时,可以以 value 做为关键字来搜索.

Graph: 以网状方式将数据存储在一个 dataset 中.适合存储有关联的数据.

从以上的特性可以看出, NoSQL 类数据库是一种将数据以 OO(Object Oriented) 方式存储起来.适合做社交网络的关联分析,尤其是 Graph 模型的 NoSQL 类数据库.同时 NoSQL 类数据库的分布式特点在海量数据和海量并发上有着传统关联型数据库无可比拟的优势.

参考资料

NoSQL at wikipedia
Graph Databases, NoSQL and Neo4j
MongoDB


  1. 即原子性(atomicity),一致性(consistency),持久性(durability),隔离性(isolation). [return]
  2. 这里的稀疏指的并不是存储方式的稀疏,它指的是(map 结构中的 key-Value 可以是多维的.参考链接 [return]