垂直表设计

        最近从同事那里听来了一个对我来说是新的名词“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”的实现,这个一定就不是,我们不需要拘泥于某些结构上的约束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值