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

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

需求缘起

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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VS2019+OpenCV安装与配置教程

    VS2019+OpenCV安装与配置教程目录VS2019的下载安装OpenCV的下载安装OpenCV的配置配置系统变量给VS中的工程一键配置OpenCV测试配置的效果最近要用到很多OpenCV的库,所以开始学了点OpenCV,本文记录VS和OpenCV的安装、配置过程。配置OpenCV使用配置文件的方法,配置完一次就可以给其他工程使用,非常方便。VS2019的下载安装这里有VisualStudio2019的详细教程,社区版是免费使用的,登录一下微软账户就行。OpenCV的下载安装OpenCV下载链接。我装的是4.3、Window

    2022年6月24日
    48
  • 常见电机分类和驱动原理动画[通俗易懂]

    常见电机分类和驱动原理动画[通俗易懂]常见电机分类和驱动原理动画文章目录常见电机分类和驱动原理动画基本分类直流有刷电机直流无刷电机(BLDC)步进电机(Steppermotor)舵机(steeringengine)伺服电机(servomotor)基本分类直流有刷电机电机的基本原理就是电磁感应:旋转磁场带动转子转动。电动机是由定子和转子组成,一个产生旋转磁场,一个为磁极,电机的转子(轴承)就转起来了。这便实现了电能->磁能->机械能的转换直流无刷电机(BLDC)BLDC的定子(stator)是通电的线圈,而

    2022年6月10日
    42
  • 基于Ubuntu 的 Parrot ARDrone 2.0的SDK安装以及ardrone_autonomy和tum_ardrone的安装和使用

    基于Ubuntu 的 Parrot ARDrone 2.0的SDK安装以及ardrone_autonomy和tum_ardrone的安装和使用经过了一个多星期的摸索,现在开始慢慢理解ParrotARDrone2.0的使用。现在总结一下遇到的问题,希望用这款无人机的人能够得到一些帮助,毕竟不能总是做一个伸手党。ParrotARDrone2.0是法国的一家无人机的厂商生产的无人机的产品,是parrotardrone1.0的进阶版,摸索的这一个星期我感受到现在对ardrone2.0的支持还是挺棒的。有很多资料,遇到问题

    2022年8月15日
    7
  • OPC服务器简介和入门介绍

    OPC服务器简介和入门介绍 什么是OPC? OPC代表OLE(对象链接和嵌入)过程控制。OPC是最流行的数据连接标准,用于在控制器,设备,应用程序和其他基于服务器的系统之间进行通信,而无需进入数据传输的自定义驱动程序。 工厂自动化系统或过程由来自不同供应商或供应商的不同协议的不同控制器和设备组成。这些控制器和设备对于与业务或管理系统进行通信至关重要。因此,OPC创建了一个环境来访问来自这些供应商的实时工厂数据…

    2022年6月20日
    44
  • 用curl抓取网站数据,仿造IP、防屏蔽终极强悍解决方式

    用curl抓取网站数据,仿造IP、防屏蔽终极强悍解决方式原文链接:http://blog.csdn.net/linglongwunv/article/details/8116359最近在做一些抓取其它网站数据的工作,当然别人不会乖乖免费给你抓数据的,有各

    2022年6月30日
    30
  • ssh用法及命令

    ssh用法及命令http://blog.csdn.net/pipisorry/article/details/52269785什么是SSH?简单说,SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者…

    2022年4月30日
    46

发表回复

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

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