MYSQL设计和开发规范
1. 整体描述
多人团队开发时,难免会出现每个人的编码和开发习惯不一样,导致整个项目的编码风格多种多样,不利于项目后期开发和维护,所以设计和编码规范就起到了约束的作用,达到虽然多人编码,但是看着像一个人开发的一样。
不过,编码规范也有利有弊,弄得过于繁琐,也不利于开发人员实现,所以,适当指定编码规范是很重要和必要的。
本文对MYSQL的设计和使用加以规范,参考了阿里的规范说明,并进行的简单修改。
2. 数据库设计规范
2.1 表名命名规则
- 表名表示实体内容,不是实体数量,禁止使用复数;
- 表名以业务的包名开头,每个单词用_隔开。
2.2 是否字段
- 表达是否概念的字段,必须使用is_xxx的形式命名;
- 数据类型定义为 char(1);
- 1表示是,0表示否。
2.3 字母与数字
- 表名,字段名禁止出现大写;
- 禁止数字开头,禁止两个下划线中间只有数字。
2.4 禁止使用保留字
- 常见的例如:desc,range,match,delayed…
2.5 可变字符串规范
- 如果字符串长度较长,且内容长度差异较大,使用varchar;
- 如果字符串长度大部分超过5000,使用text,独立出一张表单独存储。
2.6 字段设计
- 必须具备id字段,类型为bigint,可以自增,也可以雪花ID,不具备业务含义;
- 必须具备status字段:类型为char(1),默认为0;
- 必须具备del_flag字段:类型为char(1) ,默认为0;
- 必须具备create_by字段,类型为varchar(64);
- 必须具备create_time字段:类型为datetime;
- 必须具备update_by字段,类型为varchar(64);
- 必须具备update_time字段:类型为datetime;
- 必须具备remark字段:类型为varchar(500);
- 执行insert操作时,将create_time和update_time都设置为当前时间,create_by和update_by都设置为当前操作人;
- 执行update操作时,update_time设置为当前时间,update_by设置为当前操作人。
3. 数据库索引规范
3.1 命名规则
- 正常索引,以:【idx_表名_字段名】进行命名,例如:在vpr_obj_part表的obj_id字段创建索引,索引名称应为:idx_vprobjpart_objid;
- 唯一索引,以:【unq_表名_字段名】进行命名,例如:在car_camera表的ip字段创建唯一索引,索引名称应为:unq_devcamera_ip。
3.2 唯一索引规范
- 理论上,业务上具备唯一特性的字段,应该创建唯一索引,例如:摄像头的ip。
3.3 join规范
- 禁止join数据量过多的表,一般业务数据表都是数据量比较多的;
- 需要join的字段,数据类型必须绝对一致;
- 被关联的字段要有索引。
3.4 varchar规范
- 没有必要对过长的varchar全字段建立索引;
- varchar字段上的索引必须指定索引长度。
3.5 模糊搜索规范
- 尽量不要使用左模糊或者全模糊查询。
4. 数据库SQL语句规范
4.1 语句复杂度
- SQL语句主要以增删改查,排序,计数等为主,不要在SQL语句里实现过于复杂的业务逻辑,业务逻辑用java代码实现。
4.2 count规范
- 不要使用count(column)或者count(1),请使用count(*);
- 如果要计算排除NULL值的不重复行计数,请使用count(distinct column)。
4.3 null规范
- 如果一列全是NULL,sum(column)返回的是NULL,因此在使用sum时,应用程序务必考虑NPE问题;
- 使用ISNULL(column)判断列是否为空,不要使用column is null 或者column is not null。
4.4 别名规范
- SQL中对于列的查询与修改,如果涉及多个表,必须使用表名(或者别名)对列进行限定。
4.5 外键规范
- 禁止使用外键。
4.6 存储过程规范
- 禁止使用存储过程。
4.7 视图规范
- 禁止使用视图。