最近从同事那里听来了一个对我来说是新的名词“NoSQL”,在此之前我并没有听过这个,所以谷百了一下,结果还是云里雾里,可能是因为我对名词解释不太敏感,网上搜索出来的结果还是没有弄明白“NoSQL”具体定义。在我理解的“NoSQL”定义里我看到了,表需要高扩展性,数据以键值对表方式存放等,从这些只字片语中隐约觉得怎么那么像我以前做过的一个项目?
大概4-5年前我曾经做过一个项目,当时的需求是要求表必须有高扩展性,因为表的字段会随时的增加减少。现有的关系数据库里建立起来的固定字段结构表肯定是无法满足要求,因为它如果要添加或者删除某个字段都需要大动干戈,而且很可能会破坏原有的结构。于是在设计时,就将表的字段旋转90度垂直来存放。举例说明:现在有一张表tab1,当中有c1,c2,c3三个字段和一个主键字段。如果我们在关系数据库中建立一个固定结构的表很简单就是直接创建一个包含4个字段的表即可,但是为了满足高扩展需求,我们讲这个表结构旋转90度后垂直存储。这样的话就需要3张表,1张用来存储表名,1张用来存储字段名,一张用来存储数据,以之前的例子为例我们新增一条记录结构如下:
主键表
表名 流水号
tb1 tb1_1
表名表
主键 表名
1 tb1
字段表
主键 表名 字段名
1 tb1 c1
2 tb1 c2
3 tb1 c3
数据表
表名 字段名 流水号 值
tb1 c1 tb1_1 aaa
tb1 c2 tb1_1 bbb
tb1 c3 tb1_1 ccc
这样表的扩展性就变的很好,如果你需要添加一个字段,只需要向表字段表中添加即可,不用修改表结构。
现在回到“NoSQL”上,从我理解的定义上看其实这样设计也满足绝大部分“NoSQL”定义中所要满足的要求(除了Cache技术可能要独立实现),它满足了“NoSQL”里要的高扩展性,也满足“NoSQL”里的键值对要求(数据表中“表名+字段名+流水号”可以成为指定唯一值的键)。而且其实它也能满足分布式部署的要求,应为数据是垂直存放的,你可以打断任意位置的数据放到另一台服务器上,查询时可以两台分别查一半以提高查询效率分散IO消耗。
其实我觉得“NoSQL”是个感念或者说是个标准,没有谁说这个东西一定就是“NoSQL”的实现,这个一定就不是,我们不需要拘泥于某些结构上的约束。