MySQL 建表参考


#软件架构与思考#


字段和表必须有注释

面向未来设计

比如自增主键,不能是 int,而应该是 bigint unsigned 。

禁止为整数声明显示长度

MySQL:整型数字 中的讨论。

统一幂等字段类型和大小

在做幂等时候,会使用一个外部ID字段

禁止 NULL

NULL 会破坏唯一性。见 MySQL:唯一索引与NULL

默认值

默认值不是必须要指定的。

整数默认值设置为 0 。

字符串类型字段默认值为空字符串。

不要使用复杂/包装类型

例如时间字段直接使用 bigint unsigned 存秒级时间戳即可,不要使用 datetime、timestamp 等包装类型。

代码中增加时间戳工具类即可;使用 MySQL客户端运行 SQL 查看数据时,时间字段用 from_unixtime 函数转换成年月日即可。

时间戳字段使用 bigint unsigned

时间戳单位一般使用秒。

为什么不用 int ?

  1. int 最大值是 2147483647,对应 2038-01-19 11:14:07 。这个时间快到了。
  2. int unsigned 最大值是 4294967295,对应 2106-02-07 14:28:15 。
  3. 但是 Java 的 int 最大值是 2147483647 ,所以 Java 对应时间戳的类型应该是 Long。
  4. Java Long 一般对应 MySQL 中的 bigint 或者 bigint unsigned。

必须要有自增主键、创建时间、更新时间字段

状态字段默认值不要有业务含义

例如表中有一个 int 类型的 status 字段,默认为 0 。不要用 0 代表成功或失败。

状态设计方案一:0 初始化,1 成功,2 失败。 其他为非法值。

状态设计方案二:1 初始化,2 成功,3 失败。其他为非法值。

使用 utf8mb4 字符集

小心分库分表下的业务唯一性陷阱

分库分表字段必须在业务唯一性字段中,否则无法保证唯一性。

小心字符集的排序规则

每个字符集有多种排序规则。

utf8mb4 默认的排序规则中,'System''system'、'system    ' 是相等的。


( 本文完 )