干货|NOSQL的"关系"去哪了

你见,或者不见我

我就在那里

不悲不喜

你念,或者不念我

情就在那里

不来不去

 

----仓央嘉措

 

 

笔者认为,引用这首诗来表达NoSQL的关系最合适不过了。

 

 

我们所说的NOSQL,源于2009年6月11日在旧金山举行的一场技术聚会。发起者Johan认为要起个名字,简单、易记,适合做twitter 话题,谷歌搜索命中高。于是NOSQL诞生了。

 

NOSQL一词以野火燎原之势迅速流行起来。但是关于他的定义却是非常不明确的,它泛指那些最近诞生的”非关系型“数据库,比如Cassandra、MongoDB、Neo4J和Riak等。

 

既然Nosql是“非关系型”数据库,NoSql的“关系”去哪了?

 

我们先来了解一下,什么是关系型数据库。

 

关系数据库基于关系模型(relational model)的数据库。

 

关系模型把数据组织成关系(relation)和元组(tuples)。元组是有键值对(name-value pair)组成的集合,而“关系”是由“元组”组成的集合。

 

元组和关系,就是我们常说的”行“(row)和”表"(table)。我们用SQL语句操作返回的数据都是“关系”。如下图:

 

 

Nosql最大的变化,就是抛弃了“关系”模型。广泛使用的下面四种模型。

 

键值(key-value)、文档(document)、列族(column-family)和图(graph)。

 

“关系”模型用元组组织数据,元组的组合还是元组(row),但是元组不能包含其他元组所组成的列表 ,他们必须组合成元组的列表返回。

 

但是Nosql没有这个限制,它把数据组织成聚合单元(agrregate unit)。

 

换句话说,它把“关系”放到到了聚合单元里面。而且关系多样化、更细分了。

 

我们来看四种“非关系”模型:

 

  • 键值(key-value)---这种聚合类型的“关系”对数据库是透明的,数据库只知道他有一个key和一大块(big blob)数据。 这种聚合数据,只能让数据使用的程序分析里面的“关系”,或者用数据库 工具(比如solr)来在这种聚合结构中搜索。

     

  • 文档(document)---聚合单元的结构和数据类型对数据库是已知的。数据库支持使用一些函数对聚合进行搜索。

     

  • 列族(column-family) ---列族最有影响力的来自google的Big table。列族是两级聚合结构(tow-level aggregate structure)。首先是行级聚合,定义数据结构(key-value),然后是列族级聚合(仍然是Key-Value)。举个Cassandra简单的例子,定义一个用户表并插入数据

 

 

CREATE TABLE users-91b56770-bf40-11df-969c-b2b36bca998e (column_name varchar, column_value varchar) UNIQUE column_name PRIMARY KEY column_name;

INSERT INTO users-91b56770-bf40-11df-969c-b2b36bca998e VALUES ('username', 'joe'), ('password', 'weak'), ('email', 'joe@example.com');

 

  • 图(graph) ---图数据库不是面向聚合的,它的“关系”不仅没有消失,而且成了一等公民,支持多对多的关系。由于它没有消失关系,而是加强关系。本文不做过多讨论(后续IT圈圈会针对它做专门的讨论)。

 

 

综上所述:如开篇那首诗,关系其实没有消失,而是分散到聚合单元里面去了。

 

 

 

posted @ 2017-06-23 14:00  IT圈圈  阅读(328)  评论(0编辑  收藏  举报

皮皮虾美剧