痛点软件行业唯一不变的就是变化。比如功能上线后,客户或PM需要对现有功能增加一些合理的需求。要完成这些任务,必须通过增加字段来解决,或者有些功能需要通过增加字段来实现,以降低实现复杂度等,这些问题都会改变在线数据库的表结构。一旦更改会导致表被锁定,所有的写操作都会等到表锁关闭。尤其是对于数据量较大的热表,添加一个字段可能会因为表锁定时间过长导致部分请求超时,可能间接给企业造成经济损失。解决方法是增加一个json格式的扩展字段。下面结合部分代码描述解决方案,方便读者理解。另外,MySQL系列面试题和答案都整理好了。微信搜索Java技术栈,后台发送:面试,网上可以看。mysql数据库脚本:DROPTABLEIFEXISTS`cs_dustbin`;CREATETABLEIFNOTEXISTS`cs_dustbin`(`id`VARCHAR(45)NOTNULLCOMMENT'主键自增id',`rfid_no`VARCHAR(20)NOTNULLCOMMENT'rfid卡号',`state`INT(1)NOTNULLCOMMENT'垃圾桶状态:0:注销;1:未使用;2:待用;3:已用(绑定收集点);',`user_id`INTNOTNULLCOMMENT'注册人,负责进入垃圾桶的人',`type`INT(1)NOTNULLDEFAULT1COMMENT'Trashtype:1:kitchentrashcan',`street_code`INT(11)DEFAULTNULLCOMMENT'位于城镇街道代码,视状态而定,这里的意思可能是使用镇街或返回镇街。',`create_time`DATETIMENOTNULLDEFAULTnow()COMMENT'创建时间',`update_time`DATETIMENOTNULLDEFAULTnow()COMMENT'更新时间',`ext`VARCHAR(1000)NOTNULLDEFAULT'{}'COMMENT'扩展字段',...PRIMARYKEY(`id`))ENGINE=InnoDBCOMMENT='垃圾桶表';Java代码:importcom.alibaba.fastjson.JSON;importlombok.Data;importjavax.validation.constraints.NotNull;importjava.util.Date;importjava.util.List;/***垃圾桶实体*CreatedbyBlinkon6/28/2018AD.**@authorBlink*/@DatapublicclassDustbin{privateStringid;/***rfid卡号*/@NotNullprivateStringrfidNo;/***垃圾桶状态:0:注销;1:未使用;2:待用;3:Used(绑定采集点);*对应Dustbin.StateEnum类*/@NotNullprivateIntegerstate;/***进入垃圾桶的人id*/@NotNullprivateLonguserId;/***garbageBuckettype:1:厨房垃圾桶*DefaultValue:1*/@NotNullprivateIntegertype;/***townstreetcode*根据状态,这里的意思可能是使用townstreet或者返回townstreet*/privateIntegerstreetCode;/***创建时间*defaultValue:now()*/@NotNullprivateDatecreateTime;/***更新时间*/@NotNullprivateDateupdateTime;/***扩展字段,见DustbinExt.java*DefaultValue:{}*/privateStringext;...publicDustbinExtgetExtObject(){returnJSON.parseObject(this.getExt(),DustbinExt.class);}publicvoidsetExtObject(DustbinExtext){this.ext=JSON.toJSONString(ext);}/***垃圾桶扩展属性*CreatedbyBlinkon6/28/2018AD.**@authorBlink*/@DatapublicstaticclassDustbinExt{/***所在的town*根据州的不同,这里的意思可能是使用townstreet,返回townstreet,或者绑定townstreet*/privateStringstreet;/***客户(采集点)id,绑定采集点时需要填写*根据当前需求(2018-06-29),采集点解绑时需要保存最新绑定的采集点名称垃圾桶的号码,所以在解绑垃圾桶的时候,不要删除*只有收集点绑定覆盖的时候*/privateLongcustomerId;/***客户(收集点)名称,需要填写在绑定收点时*根据当前需求(2018-06-29),解绑收点时*需要保存最新的垃圾桶绑定的收集点名称,所以垃圾桶未绑定时不会删除此信息*只有在绑定收集点时才覆盖他*/privateStringcustomer;/***损坏部分*1:桶盖;2:斗嘴;3:斗体;4:斗轴;5:桶底;6:斗轮;privateList
