说明:如果该项目同时只有一个人开发,直接修改就可以了。
场景一
- 不符合命名规范
譬如: 【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。 说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。 正例:aliyun_admin,rdc_config,level3_name 反例:AliyunAdmin,rdcConfig,level_3_name
重构过程中出现的问题:
团队中其它feature分支上的接口会报错。
数据库字段名被改了,但DAO层并没有进行相应的变更。在select或insert时,因为字段不存在而报错。
经典实践:
以将aliyun_rdc表中字段rdcConfig,修改为rdc_config为例。
(1)重命名有两个方案:
- aliyun_rdc表中新增一个字段rdc_config。【上线成功后,需要做数据迁移】
- aliyun_rdc表中将字段rdcConfig修改为rdc_config。再新增字段rdcConfig。
说明:新字段在测试环境不能设置为 NOT NULL。其它同学的分支上没有这个字段,如果是NOT NULL,则insert时会报错。 ps:如果这个项目只有一个人开发,直接修改就可以了。
(2)MyBatis Generator (MBG)重新生成DO时,使用ignoreColumn标签,剔除掉将要删除的字段。 譬如:
(3)上线脚本中,字段rdc_config要设置成NOT NULL。
说明:
不建议列上允许为空。最好限制not null
,并设置一个默认值,比如0
和''
空字符串等,如果是datetime类型,可以设置成'1970-01-01 00:00:00'
这样的特殊值。
对MySQL来说,null
是一个特殊的值,Conceptually, NULL means “a missing unknown value” and it is treated somewhat differently from other values
。比如:不能使用=,<,>
这样的运算符,对null
做算术运算的结果都是null
,count
时不会包括null
行等,null
比空字符串需要更多的存储空间等。
场景二
- 与业务场景不匹配【基础类库中】 【基础类库:譬如微服务中项目A,项目B 都依赖的 xx-domain库】
重构过程中出现的问题:
团队中依赖此基础类库的其它feature分支,会编译不过。
基础类库中类名被重命名,其它同学的feature分支上没有这个变更,则会编译不过。
经典实践1:
升级基础类库的版本号。 由于所有基础类库的版本都是使用parent项目的version,那么所有依赖基础类库的版本号都要升级。【升级版本号的工作量会随着项目的数量而增加】
经典实践2:
1、不升级基础类库的版本号。在基础类库中使用新的类名新建一个类,属性及行为与老的类一致。 2、在自己的feature分支上,全部替换为新建的类。 防改漏的小技巧: (1)先升级一个小版本号 (2)在基础库中将老的类删除 (3)在自己的feature分支上使用新版本的基础类库
(4)根据编译报错来完成替换。 (5)替换完成后,在自己的feature分支上将基础库的版本号回退 3、上线成功后,在基础类库中将老的类删除并提交。