2021-06-30

如何不改表结构动态扩展字段?

作者:李瑜宁

来源:https://juejin.cn/post/6844903640990220302

笔者的动态字段扩展解决方案主要针对 Mysql 5.7.8 以下版本,在 Mysql 5.7.8 已经新增 JSON Data Type,同样适用该方案,而且情况变得更加简单。

痛点

软件行业唯一不变的就是变化,比如功能上线之后,客户或 PM 需要对已有的功能增加一些合理的需求,完成这些工作必须通过添加字段解决,或者某些功能的实现需要通过增加字段来降低实现的复杂性等等。

这些问题都会改动线上的数据库表结构,一旦改动就会导致锁表,会使所有的写入操作一直等待,直到表锁关闭,特别是对于数据量大的热点表,添加一个字段可能会因为锁表时间过长而导致部分请求超时,这可能会对企业间接造成经济上的损失

解决方案

增加 json 格式的扩展字段。

下面配合一些代码来描述这个解决方案,读者便于去理解。

mysql 数据库脚本:

DROP TABLE IF EXISTS `cs_dustbin`;CREATE TABLE IF NOT EXISTS `cs_dustbin` ( `id` VARCHAR(45) NOT NULL COMMENT '主键自增id', `rfid_no` VARCHAR(20) NOT NULL COMMENT 'rfid 卡号', `state` INT(1) NOT NULL COMMENT '垃圾桶状态:0:已注销;1:未使用;2:待使用;3:已使用(绑定收集点);', `user_id` INT NOT NULL COMMENT '登记人,负责录入垃圾桶的人', `type` INT(1) NOT NULL DEFAULT 1 COMMENT '垃圾桶类型:1:餐厨垃圾桶', `street_code` INT(11) DEFAULT NULL COMMENT '所在镇街 code,根据状态,这里的含义可能是领用镇街、退还镇街。', `create_time` DATETIME NOT NULL DEFAULT now() COMMENT '创建时间', `update_time` DATETIME NOT NULL DEFAULT now() COMMENT '更新时间', `ext` VARCHAR(1000) NOT NULL DEFAULT '{}' COMMENT '扩展字段', ... PRIMARY KEY (`id`))ENGINE = InnoDBCOMMENT = '垃圾桶表';

Java 代码:

import com.alibaba.fastjson.JSON;import lombok.Data;import javax.validation.constraints.NotNull;import java.util.Date;import java.util.List;/** * 垃圾桶实体 * Created by Blink on 6/28/2018 AD. * * @author Blink */@Datapublic class Dustbin { private String id; /**  * rfid 卡号  */ @NotNull private String rfidNo; /**  * 垃圾桶状态:0:已注销;1:未使用;2:待使用;3:已使用(绑定收集点);  * 对应 Dustbin.StateEnum 类  */ @NotNull private Integer state; /**  * 录入垃圾桶的人员id  */ @NotNull private Long userId; /**  * 垃圾桶类型:1:餐厨垃圾桶  * DefaultValue: 1  */ @NotNull private Integer type; /**  * 所在镇街 code  * 根据状态,这里的含义可能是领用镇街、退还镇街  */ private Integer streetCode; /**  * 创建时间  * defaultValue : now()  */ @NotNull private Date createTime; /**  * 更新时间  */ @NotNull private Date updateTime; /**  * 扩展字段,详细数据查看 DustbinExt.java  * DefaultValue: {}  */ private String ext; ... public DustbinExt getExtObject() {  return JSON.parseObject(this.getExt(), DustbinExt.class); } public void setExtObject(DustbinExt ext) {  this.ext = JSON.toJSONString(ext); } /**  * 垃圾桶扩展属性  * Created by Blink on 6/28/2018 AD.  *  * @author Blink  */ @Data public static class DustbinExt {  /**   * 所在镇街   * 根据状态,这里的含义可能是领用镇街、退还镇街、绑定的镇街   */  private String street;  /**   * 客户(收集点)id,绑定收集点的时候需要填入   * 根据目前的需求(2018-06-29),当收集点解绑的时候   * 需要保存垃圾桶最新绑定收集点名称,所以在解绑垃圾桶的时候不会把这个信息删掉   * 只有当绑定收集点的时候才把他覆盖   */  private Long customerId;  /**   * 客户(收集点)名称,绑定收集点的时候需要填入   * 根据目前的需求(2018-06-29),当收集点解绑的时候   * 需要保存垃圾桶最新绑定收集点名称,所以在解绑垃圾桶的时候不会把这个信息删掉   * 只有当绑定收集点的时候才把他覆盖   */  private String customer;  /**   * 损坏部位   * 1:桶盖;2:桶口;3:桶身;4:桶轴;5:桶底;6:桶轮;   * 对应 DustbinDamagePartEnum 类   */  private List<Integer> parts; } ...}

mysql 脚本可以看到扩展字段的信息:

ext VARCHAR(1000) NOT NULL DEFAULT '{}' COMMENT '扩展字段'

可以看到这么一段 Java 代码:

.../** * 扩展字段,详细字段查看 DustbinExt 类 * DefaultValue: {} */private String ext;public DustbinExt getExtObject() { return JSON.parseObject(this.getExt(), DustbinExt.class);}public void setExtObject(DustbinExt ext) { this.ext = JSON.toJSONString(ext);}...

可以看到 ext 字段就是用来存储 json 格式的数据,它可以动态地增加任何字段,甚至是对象,不需要通......

原文转载:http://www.shaoqun.com/a/838154.html

跨境电商:https://www.ikjzd.com/

airwallex:https://www.ikjzd.com/w/1011

ola:https://www.ikjzd.com/w/2103

拍拍网:https://www.ikjzd.com/w/2205


作者:李瑜宁来源:https://juejin.cn/post/6844903640990220302笔者的动态字段扩展解决方案主要针对Mysql5.7.8以下版本,在Mysql5.7.8已经新增JSONDataType,同样适用该方案,而且情况变得更加简单。痛点软件行业唯一不变的就是变化,比如功能上线之后,客户或PM需要对已有的功能增加一些合理的需求,完成这些工作必须通过添加字段解决,或者某些功
新卖家必看!亚马逊FBA头程运输该怎么选?:https://www.ikjzd.com/articles/104084
选品实用参照:俄罗斯最全节日汇总!:https://www.ikjzd.com/articles/104086
亚马逊站内站外流量来源解析!:https://www.ikjzd.com/articles/104172
Facebook引流要如何做?Facebook引流的六大技巧!:https://www.ikjzd.com/articles/104173
口述:妹妹和我男友爱爱时故意呻吟口述爱爱妹妹:http://lady.shaoqun.com/a/25015.html
口述:少妇讲述被邻居做爱诱惑的经历(5/5):http://lady.shaoqun.com/m/a/82885.html
宝贝 你那里好像变大了 我多久没弄你了:http://lady.shaoqun.com/m/a/248427.html
少妇口述:老公不在 我和陌生男子激情做爱3次:http://www.30bags.com/m/a/249627.html
男人喜欢矮个子女人吗?生活会幸福吗?这三个人说出了他们的心声:http://lady.shaoqun.com/a/393607.html
《色戒》梁朝伟舔汤唯的牛奶据说是一把真正的刀:http://lady.shaoqun.com/a/393608.html
美国流氓律所碰瓷中国卖家商标侵权,被冻结3000万:保护好商标才能杜绝"钓鱼执法":https://www.ikjzd.com/articles/146251
IOSS不是强制,没有IOSS如何清关发货?:https://www.ikjzd.com/articles/146250

No comments:

Post a Comment