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

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

需求缘起

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

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沈剑 架构师之路

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • intellij idea 全局搜索_idea设置全局搜索

    intellij idea 全局搜索_idea设置全局搜索IntelliJIDEA使用教程(总目录篇)我们用Eclipse或者IntelliJIDEA编程,有时候需要将整个项目的某个字符串替换成其他的。全局搜索我会,我还给调成ctrl+g了呢,但是遇到要全局(整个项目)替换字符串。哎哟,我有点蒙了。这不换了编辑器吗。我用的是eclipse的keymap而且电脑又不是mac。那么问题来啦。怎么找快捷键呢。如下;额,顺便说下…

  • nginx转发服务器_jquery跨域请求

    nginx转发服务器_jquery跨域请求场景描述:A服务器映射了外网IP;B服务器为内网服务器,A和B能互通;外网IP不能访问B上的服务;方案:使用nginx在A服务器上做个代理转发,将B服务器上的服务代理到A服务器上,这样外网IP就可以通过代理的地址访问B上的资源。配置比较简单,如下所示:server{listen8089;//A服务器定义端口需映射到外网IPserver_name172.10.20.6;//A服务器代理地址…

    2022年10月18日
  • ASP.NET_正则表达式_匹配HTML中的一行或多行

    ASP.NET_正则表达式_匹配HTML中的一行或多行

    2021年11月16日
  • 10.17「建议收藏」

    10.17「建议收藏」10.17

  • python表白代码大全_python好玩又简单的代码

    python表白代码大全_python好玩又简单的代码想要别出心裁给女朋友准备一个惊喜,就用我们所学过的python代码来写一个表白程序。下面我给大家介绍几个。第一树上心形表白:importturtleimportrandomdeflove(x,y):#在(x,y)处画爱心lalalalv=turtle.Turtle()lv.hideturtle()lv.up()lv.goto(x,y)#定位到(x,y)defcurvemove():#画圆弧foriinr

  • ASP.NET跳转网页的三种方法的比较(转+修)

    ASP.NET跳转网页的三种方法的比较(转+修)方法1response.redirect这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但他可以跳转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录保护。但速度慢是其最大缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端。需要注意的是跳转后内部空间保存的所…

发表回复

您的电子邮箱地址不会被公开。

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