设计规约
表与索引规约
参考阿里的 p3c 规范。
命名
数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写;因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。
表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于 DO 类名也是单数形式,不使用复数名词,符合表达习惯。单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
字段
表必备三字段:id, gmt_create, gmt_modified。其中 id 必为主键,类型为 unsigned bigint、单表时自增、步长为 1。gmt_create, gmt_modified 的类型均为 datetime 类型,前者现在时表示主动创建,后者过去分词表示被动更新。
任何字段如果为非负数,必须是 unsigned。小数类型为 decimal,禁止使用 float 和 double。float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。
表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否)。但是 POJO 类的布尔属性不能加 is,要求在 resultMap 中进行字段与属性之间的映射。
索引
主键索引名为 pk_
字段名;唯一索引名为 uk_
字段名;普通索引名则为 idx_
字段名。业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达 90%以上,可以使用count(distinct left(列名, 索引长度))/count(*)
的区分度来确定。
外键
1、要设置外键的字段不能为主键
2、改建所参考的字段必须为主键
3、两个字段必须具有相同的数据类型和约束
满足这三个条件一般在创建外键的时候就不会报错,而这里报错了 cannot add foreign key constraint 大多数是因为第三个条件不满足。