【转载】啥,又要为表增加一列属性?

【转载】啥,又要为表增加一列属性?

需求缘起

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

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两个属性,那么数据为:

bdcb9f422306d9b7dca335b0c27ba86b

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

7c00f3e005bca4d2925562e98770fb11

优点

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

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

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

不足

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

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

改进

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

 

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

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

user(uid, key, value)

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

0bf88fb3b89d3cbe46b48ec2dc01bed1

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

c798d3706a8fc604b62086ed10baf4b2

优点

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

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

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

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

不足

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

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

总结

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

==【完】==

 

【转自】58沈剑 架构师之路

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119368.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【实习之T100开发】T100 基础架构、命名原则

    【实习之T100开发】T100 基础架构、命名原则T100设计器随时补充知识点!执行程序的方法T100基础架构基本环境变量基本执行Shell一些作业编号记录随时补充知识点!sz文件名即可从Linux服务器下载文件到本机。。以a开头的是标准模组,以c开头的是客制模组。执行程序的方法假设你现在已经通过Xshell或某种工具连上公司的Linux服务器方法一:在Xshell命令行:r.r作业单号即可例如:r,raimi100方法二:利用menu指令调出T100系统首页,这个界面又有两种方法执行程序①

    2022年8月30日
    3
  • LeakCanary 中文使用说明

    LeakCanary 中文使用说明

    2022年3月8日
    88
  • Ubuntu10.04 下安装RabbitVCS

    Ubuntu10.04 下安装RabbitVCS安装RabbitVCS的方法步骤如下:1、sudoadd-apt-repositoryppa:rabbitvcs/ppa#将rabbitvcs的添加到源里面。(次操作会提示是否要添加到源里面,点击ENTER添加,ctrl+c不添加)2、sudoapt-keyadv–keyserverkeyserver.ubuntu.com–recv-keys34EF…

    2022年7月18日
    11
  • Yii 多語言

    Yii 多語言

    2021年8月20日
    48
  • Vue上传文件到springboot

    Vue上传文件到springboot<el-uploadclass=”upload-demo”ref=”upload”accept=”image/png,image/jpg,image/jpeg”:file-list=”fileLists”:on-preview=”handlePreview”…

    2022年10月16日
    3
  • 设置ntp服务器同步时间_安卓设置ntp服务器地址

    设置ntp服务器同步时间_安卓设置ntp服务器地址有时服务器需要调整时区并调整时间,需要用到的命令:ntpdate一般Linux系统都默认安装了NTP服务,如果没有安装的话,也可以直接使用yum安装,yum安装命令为:yuminstall-yntpdate首先修改一下时区为上海时区:cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime然后选择国家授时中心的服务器地址:ntpdate210…

    2022年5月3日
    309

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号