字段和表必须有注释
面向未来设计
比如自增主键,不能是 int,而应该是 bigint unsigned 。
禁止为整数声明显示长度
见 MySQL:整型数字 中的讨论。
统一幂等字段类型和大小
在做幂等时候,会使用一个外部ID字段
禁止 NULL
NULL 会破坏唯一性。见 MySQL:唯一索引与NULL。
默认值
默认值不是必须要指定的。
整数默认值设置为 0 。
字符串类型字段默认值为空字符串。
不要使用复杂/包装类型
例如时间字段直接使用 bigint unsigned 存秒级时间戳即可,不要使用 datetime、timestamp 等包装类型。
代码中增加时间戳工具类即可;使用 MySQL客户端运行 SQL 查看数据时,时间字段用 from_unixtime 函数转换成年月日即可。
时间戳字段使用 bigint unsigned
时间戳单位一般使用秒。
为什么不用 int ?
- int 最大值是 2147483647,对应 2038-01-19 11:14:07 。这个时间快到了。
- int unsigned 最大值是 4294967295,对应 2106-02-07 14:28:15 。
- 但是 Java 的 int 最大值是 2147483647 ,所以 Java 对应时间戳的类型应该是 Long。
- Java Long 一般对应 MySQL 中的 bigint 或者 bigint unsigned。
必须要有自增主键、创建时间、更新时间字段
状态字段默认值不要有业务含义
例如表中有一个 int 类型的 status 字段,默认为 0 。不要用 0 代表成功或失败。
状态设计方案一:0 初始化,1 成功,2 失败。 其他为非法值。
状态设计方案二:1 初始化,2 成功,3 失败。其他为非法值。
使用 utf8mb4 字符集
小心分库分表下的业务唯一性陷阱
分库分表字段必须在业务唯一性字段中,否则无法保证唯一性。
小心字符集的排序规则
每个字符集有多种排序规则。
utf8mb4 默认的排序规则中,'System'
、 'system'
、'system ' 是相等的。