MySQL数据库设计规范
参考阿里巴巴MySQL数据库设计规范,详细信息可查看《阿里巴巴Java开发手册》第五章。
一、建表规约
-
表达是否概念的字段,必须使用
is_xxx
的方式命名,数据类型必须为unsigned tinyint(1)
;例如:是否是删除状态应该使用
is_delete
; -
数据库名、表名、字段名只能使用
小写字母(a-z)、划线(_) 、阿拉伯数字(0-9)组成,禁止使用
中文、大写字母、特殊符号、mysql关键字`命名。例如:正例 user_name0,反例 userName0
附《MySQL》关键字大全:
https://dev.mysql.com/doc/refman/5.7/en/keywords.html
-
表名应以
模块名_表作用
命名;例如:系统权限表 sys_permission,车辆保险表 card_insurance,支付配置表 pay_config
-
主键索引(primary key)的索引名为
pk_字段名
,唯一索引(unique key)的索引名为uk_字段名
,普通索引(index)的索引名为
idx_字段名
。 -
存储小数使用
decimal
,如果精度超过限制的,可把整数和小数分开存储。例如:我们存储 124.123,数据类型定义为:decimal(16,3)
-
固定长度
的应使用 char(n),n表示存储的字符数。提示:char里不要存储汉字,一般用于存储手机号码,电话号码,身份证之类的长度相对比较固定的数据。
-
varchar 为可变长度的字符串,存储长度
不要超过5000
字符,超过的应定义为text,并且独立存储。常用varchar长度参考:
姓名:varchar(75) 民族:varchar(16) 政治面貌:varchar(16) 企业名称:varchar(64) 地址:varchar(255) 记录备注:varchar(255)
-
存储金额可以转化为分存储,存储类型
10位以内使用int(11)
,超过10位以上使用bigint(21)
;提示:bigint(21) 占用空间8Bytes,int(11) 占用空间4Bytes
-
表中必须包含4个字段
id,gmt_create,gmt_modified,is_delete
字段;提示:其中id为primary key、unsigned、bigint,gmt_create为记录创建时间,gmt_modified记录修改时间,is_delete 记录是否逻辑删除;gmt_create、gmt_modified均为datetime类型。
二、索引规约
-
具有唯一特性的字段,必须建唯一索引(墨菲定理:坏可能一定会发生)。
-
join禁止超过3个表,需要join字段类型必须绝对一致,多表关联查询,被关联的字段需要有索引。
-
在 varchar 上建立索引时,必须
指定索引的长度
。语法: CREATE INDEX index_name ON table_name (column_name(length), clolumn_name(length)…); 计算区分度:column_name如果设置length为5时,区分度为计算如下, select count(distinct left(column_name, 5))/count(*) from table_name;
-
在建索引时
区分度最高
的在最左边。例如:在t表中,a、b、c字段的区分度从大到小为 b>a>c ,那么建索引的顺序为 b_a_c;需要注意的是,如果出现等号非等号的混合判断,等号的列必须放在索引的前列,如:where a>? and b=?,即使a的区分度在高b也要在索引的前列。
三、SQL语句规约
-
不要使用 count(column_name)、count(num)来代替count(*),
count(*)是SQL92标准统计行数
的语法。 -
count(column_name)时,如果column_name中
包含NULL值
的,会被忽略
; -
sum(column_name)如果column_name列中全是NULL,则返回NULL,为了防止查询出NULL值可使用
IF
判断来设置默认值select IF(ISNULL(column_name),0,sum(column_name)) as count_num from table_name
-
必须使用
ISNULL(column_name)
来判断是否为NULL值,是则返回1,否则返回0 ;例如:查询business_bill表里arrears_amount值为null的记录
select * from business_bill where ISNULL(arrears_amount)=1;
-
禁止使用
视图、存储过程、触发器,因为难以调试和扩展。 -
在删除和修改数据之前,必须
先查询
出数据,防止数据误删。 -
在使用in操作符时,in括号里面的数量
小于1000
。
四、ORM映射
-
在mybatis中,
禁止使用 * 号
作为查询列表,要写出查询的字段。 -
xml文件中参数不要使用
${}
,防止sql注入
。 -
修改记录时必须
修改gmt_modified
为当前时间。 -
在使用事务@Transactional时,要考虑各方面的事务回滚,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等操作。