数据库设计(MySQL)避坑指南曾经吃过的亏

1、主键设计的坑

a、MySQL是索引组织表,所以一定要显示指定主键

没有显示指定主键,MySQL部份功能会受限,比如组复制
没有显示主键,当表要做关联查询时会比较难受
没有显示主键,如果也没有指定唯一键,那么可能会造成删除异常,修改异常

b、不要使用业务字段当主键

如果使用业务字段当主键,当业务发现变化了,原有的主键字段不符合了,需要增加或减少字段对于已上线的系统来说都是毁灭性的,特别是当时间长这个表变成大表后,后面要变更主键可能必须停业务才能操作

c、不要使用组合主键

不建议使用组合主键,每个主键都是二级索引的叶子,如果使用组合主键,极大增加了存储需求

d、不用UUID

理由和C一样

f、自增ID

当有主从表(父子表)时,从表关联主表依赖主表自增产生的ID,那就必须在主表插入后还要查询一次。使业务开发更复杂

建议

使用业务生成雪花ID做为主键,或数据库单独拿一个表来生成自增ID

2、函数设计的坑

开发函数时记得带上DETERMINISTIC 关键字 声明为确定性函数
当没有带 DETERMINISTIC 的坑 参见我的文档 确定性函数

3、字段设计的坑

a、时间类型声明为datetime 而非TIMESTAMP 类型

2038不远了,不要再埋坑,而且从5.6版本后MySQL优化了datetime占用的存储空间
详见我的文档 MySQL数据类型存储空间占用–日期型

b、varchar类型声明 注意长度

当修改字符宽度有两个情况不能online ddl
1、减少宽度
2、跨越255这个坎
看下面列子

drop table stt; create table stt ( id int not null, str1 char(10) not null, str2 varchar(60) not null, str3 varchar(70) not null, primary key(id) ) engine = InnoDB default charset = utf8mb4 ROW_FORMAT=COMPACT ;