MySQL数据库设计规范

参考阿里巴巴MySQL数据库设计规范,详细信息可查看《阿里巴巴Java开发手册》第五章。

1、建表规约

  1. 表达是否概念的字段,必须使用 is_xxx 的方式命名,数据类型必须为unsigned tinyint(1)html

    例如:是不是删除状态应该使用 is_deletemysql

  2. 数据库名、表名、字段名只能使用 小写字母(a-z)、划线(_) 、阿拉伯数字(0-9)组成,禁止使用中文、大写字母、特殊符号、mysql关键字`命名。sql

    例如:正例 user_name0,反例 userName0数据库

    附《MySQL》关键字大全缓存

    https://dev.mysql.com/doc/refman/5.7/en/keywords.html
  3. 表名应以 模块名_表做用 命名;mybatis

    例如:系统权限表 sys_permission,车辆保险表 card_insurance,支付配置表 pay_config数据库设计

  4. 主键索引(primary key)的索引名为 pk_字段名,惟一索引(unique key)的索引名为 uk_字段名搜索引擎

    普通索引(index)的索引名为 idx_字段名设计

  5. 存储小数使用decimal,若是精度超过限制的,可把整数和小数分开存储。调试

    例如:咱们存储 124.123,数据类型定义为:decimal(16,3)

  6. 固定长度的应使用 char(n),n表示存储的字符数。

    提示:char里不要存储汉字,通常用于存储手机号码,电话号码,身份证之类的长度相对比较固定的数据。

  7. varchar 为可变长度的字符串,存储长度不要超过5000字符,超过的应定义为text,而且独立存储。

    经常使用varchar长度参考

    姓名:varchar(75)
    民族:varchar(16)
    政治面貌:varchar(16)
    企业名称:varchar(64)
    地址:varchar(255)
    记录备注:varchar(255)
  8. 存储金额能够转化为分存储,存储类型 10位之内使用int(11),超过 10位以上使用bigint(21)

    提示:bigint(21) 占用空间8Bytes,int(11) 占用空间4Bytes

  9. 表中必须包含4个字段 id,gmt_create,gmt_modified,is_delete 字段;

    提示:其中id为primary key、unsigned、bigint,gmt_create为记录建立时间,gmt_modified记录修改时间,is_delete 记录是否逻辑删除;gmt_create、gmt_modified均为datetime类型。

2、索引规约

  1. 具备惟一特性的字段,必须建惟一索引(墨菲定理:坏可能必定会发生)。

  2. join禁止超过3个表,须要join字段类型必须绝对一致,多表关联查询,被关联的字段须要有索引。

  3. 在 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;
  4. 在建索引时区分度最高的在最左边。

    例如:在t表中,a、b、c字段的区分度从大到小为 b>a>c ,那么建索引的顺序为 b_a_c;须要注意的是,若是出现等号非等号的混合判断,等号的列必须放在索引的前列,如:where a>? and b=?,即便a的区分度在高b也要在索引的前列。

3、SQL语句规约

  1. 不要使用 count(column_name)、count(num)来代替count(*),count(*)是SQL92标准统计行数的语法。

  2. count(column_name)时,若是column_name中包含NULL值的,会被忽略

  3. sum(column_name)若是column_name列中全是NULL,则返回NULL,为了防止查询出NULL值可以使用IF判断来设置默认值

    select IF(ISNULL(column_name),0,sum(column_name)) as count_num from table_name
  4. 必须使用ISNULL(column_name)来判断是否为NULL值,是则返回1,不然返回0 ;

    例如:查询business_bill表里arrears_amount值为null的记录

    select * from business_bill where ISNULL(arrears_amount)=1;
  5. 禁止使用视图、存储过程、触发器,由于难以调试和扩展。

  6. 在删除和修改数据以前,必须先查询出数据,防止数据误删。

  7. 在使用in操做符时,in括号里面的数量小于1000

4、ORM映射

  1. 在mybatis中,禁止使用 * 号做为查询列表,要写出查询的字段。

  2. xml文件中参数不要使用${} ,防止sql注入

  3. 修改记录时必须修改gmt_modified为当前时间。
  4. 在使用事务@Transactional时,要考虑各方面的事务回滚,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等操做。

相关文章
相关标签/搜索