时间:2021-07-01 10:21:17 帮助过:24人阅读
你见,或者不见我
我就在那里
不悲不喜
你念,或者不念我
情就在那里
不来不去
----仓央嘉措
笔者认为,引用这首诗来表达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圈圈会针对它做专门的讨论)。
综上所述:如开篇那首诗,关系其实没有消失,而是分散到聚合单元里面去了。
如果您喜欢IT圈圈的文章,请长按二维码识别关注哦。
?
干货|NOSQL的"关系"去哪了
标签:文档 定义 zll 关系数据库 val 搜索 操作 god pad