啥,又要为表增加一列属性?

需求缘起

产品第一版:用户有用户名、密码、昵称等三个属性,对应表设计:

user(uid, name, passwd, nick)

第二版,产品经理增加了年龄,性别两个属性,表结构可能要变成:

user(uid, name, passwd, nick, age, sex)

假设数据量和并发量比较大,怎么变?

(1)alter table add column?不太可行,锁表时间长

(2)新表+触发器?如果数据量太大,新表不一定装得下,何况触发器对数据库性能的影响比较高

(3)让dba来搞?新表,迁移数据,一致性校验,rename?dba真苦逼

今天分享2个列扩展性设计上几个小技巧,只占大伙1分钟(下班太晚的话,只能写一分钟系列=_=)

方案一:版本号+通用列

以上面的用户表为例,假设只有uid和name上有查询需求,表可以设计为

user(uid, name, version, ext)

(1)uid和name有查询需求,必须设计为单独的列并建立索引

(2)version是版本号字段,它对ext进行了版本解释

(3)ext采用可扩展的字符串协议载体,承载被查询的属性

例如,最开始上线的时候,版本为0,此时只有passwd和nick两个属性,那么数据为:

当产品经理需要扩展属性时,新数据将版本变为1,此时新增了age和sex两个数据,数据变为:

优点

(1)可以随时动态扩展属性

(2)新旧两种数据可以同时存在

(3)迁移数据方便,写个小程序将旧版本ext的改为新版本的ext,并修改version

不足

(1)ext里的字段无法建立索引

(2)ext里的key值有大量冗余,建议key短一些

改进

(1)如果ext里的属性有索引需求,可能Nosql的如MongoDB会更适合

方案二:通过扩展行的方式来扩展属性

以上面的用户表为例,可以设计为

user(uid, key, value)

初期有name, passwd, nick三个属性,那么数据为:

未来扩展了age和sex两个属性,数据变为:

优点

(1)可以随时动态扩展属性

(2)新旧两种数据可以同时存在

(3)迁移数据方便,写个小程序可以将新增的属性加上

(4)各个属性上都可以查询

不足

(1)key值有大量冗余,建议key短一些

(2)本来一条记录很多属性,会变成多条记录,行数会增加很多

总结

可以通过“version+ext”或者“key+value”的方式来满足产品新增列的需求,希望没有浪费你这一分钟,有收获就好。

原文发布于微信公众号 - 架构师之路(road5858)

原文发表时间:2016-12-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏EAWorld

代码实战:从单体式应用到微服务的低风险演变

作者:Christian Posta 译者:海松 原题:Low-risk Monolith to Microservice Evolution Part I...

3335
来自专栏向治洪

Android OnLowMemory和OnTrimMemory

1.OnLowMemory 是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系...

1826
来自专栏不想当开发的产品不是好测试

mysql-proxy 简介

# 背景 今天同事分享的主题就是mysql-proxy,于是下来自己了解下,不求精通,只求知道这个玩意 # 简介 mysql-proxy是mysql官方提供的m...

3175
来自专栏杨建荣的学习笔记

数据库收缩数据文件的尝试(三)(r11笔记第22天)

不知道大家在数据库运维中是否会有这样的困扰,一个数据文件里没有多少数据,但是数据文件的大小却调不下来,尝试使用resize来调整屡屡失败。如果一个数据文件里...

33312
来自专栏菩提树下的杨过

推荐[搜索引擎架构]的几篇文章

1.基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计 http://blog.s135.com/post/360/ 2.百度、新浪、Mixi...

1955
来自专栏北京马哥教育

利用tcpcopy引流做模拟在线测试

一、工具介绍 Tcpcopy是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早...

2644
来自专栏杨建荣的学习笔记

oracle的TAF浅析 (r6笔记第37天)

在使用rac的时候,有几个很闪亮的使用特性,一个就是load balance,这块毋庸置疑,确实做了很大的改进,从10g版本开始的多个vip地址的load b...

2625
来自专栏乐沙弥的世界

Oracle RAC OCR 与健忘症

    OCR就好比Windows的一个注册表,存储了所有与集群,RAC数据库相关的配置信息。而且是公用的配置,也就是说多个节点共享相同的配置信息。因此该配置应...

945
来自专栏CSDN技术头条

饿了么Influxdb实践之路

作者 | 刘平 文章来源GitChat,CSDN独家合作发布,查看交流实录:http://gitbook.cn/books/59428f6f7e850f039...

6546
来自专栏我是攻城师

Hive使用ORC格式存储离线表

36710

扫码关注云+社区