参考阿里巴巴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字段类型必须绝对一致,多表关联查询,被关联的字段需要有索引。
在 vrchar 上建立索引时,必须 指定索引的长度。
语法: 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也要在索引的前列。
不要使用 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。
在mybatis中,禁止使用 号*作为查询列表,要写出查询的字段。
xml文件中参数不要使用${},防止sql注入。
- 修改记录时必须修改gmt_modified为当前时间。
在使用事务@Transactional时,要考虑各方面的事务回滚,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等操作。