设计规约

表与索引规约

参考阿里的 p3c 规范。

命名

数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。MySQLWindows下不区分大小写,但在Linux下默认是区分大小写;因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。

表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于DO类名也是单数形式,不使用复数名词,符合表达习惯。单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。

字段

表必备三字段:id, gmt_create, gmt_modified。其中id必为主键,类型为unsigned bigint、单表时自增、步长为1gmt_create, gmt_modified的类型均为datetime类型,前者现在时表示主动创建,后者过去分词表示被动更新。

任何字段如果为非负数,必须是unsigned。小数类型为decimal,禁止使用floatdoublefloatdouble在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过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大多数是因为第三个条件不满足。

下一页