1 命名规范
命名采用英文单词或业务缩写,可使用字母/数字/下划线三种,建议见名知义,从名称上基本可以看出对象的使用,禁止拼音或中文命名数据对象。
对象名称字符可以多个单词组合,单词过长可采用缩写,命名对象的字符长度不能超过30个,单词间根据情况加下划线分割,例如:v_rds_user。
表/视图/索引等对象的命名格式: 前缀类型_对象名。_
- 数据库命名
应用名称_dev 开发库;示例:order_dev_
应用名称_test 测试库;示例:order_test _
如有多套环境,则在数据库名后加数字,示例: rds_dev_01
- 数据表命名
t_业务名称_表的作用;示例:t_user_role,t_order_detail,t_project_task
临时表:tmp_业务名称_表的作用
- 视图命名
v_业务名称_表的作用;示例:v_mps_user,v_ct_order
- 索引命名
idx_表名_字段名;示例:idx_t_user_user_code
- 字段命名
从字段可以看出字段作用及存储的值,如user_dept应该改为user_dept_code
2 数据库开发规范
- 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性;
- 使用 IN 或 NOT IN 子句时,特别是当子句中有多个值且表数据较多时,速度会明显下降。推荐采用连接查询或外连接查询来提高性能;或者使用EXISTS 替代 IN;若实在避免不了,需要仔细评估 IN 后边的集合元素数量,控制在1000个之内;
- 对于数据库中表记录的查询和变更,只要涉及多个表,必须在列名前加表的别名(或表名)进行限定;**
- 禁止使用select *,只获取必要字段,减少cpu/io/内存/带宽的消耗;
- insert必须指定字段,禁止使用insert into T values()。指定字段插入,在表结构变更时,能保证对应用程序无影响;
- 禁止负向查询 (where 子句中使用!=或<>操作符),以及%开头的模糊查询,会导致不能命中索引,全表扫描;
- 禁止大表JOIN和子查询;
- 禁止在where条件列使用函数或者表达式, 导致不能命中索引,全表扫描;
- 每张表必须增加两个字段创建时间(created_at),最后一次修改时间(updated_at),建议添加两个字段创建人(created_by),变更人(updated_by);
- 推荐使用CHINER工具进行数据库设计;
- 建议日志库与业务库分离。
3 建表规范
-
表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是tinyint(1表示是,0表示否); 正例:表达逻辑删除的字段名is_deleted,1表示删除,0表示未删除
-
表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑;
说明:MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。
正例:rdc_config,level3_name
反例:rdcConfig,level_3_name
-
表名不使用复数名词; 说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量。
-
主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名; 说明:pk_ 即primary key;uk_ 即 unique key;idx_ 即index的简称。
-
小数类型为decimal,禁止使用float和double;
说明:在存储的时候,float 和 double 都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。
-
如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数并分开存储。如果存储的字符串长度几乎相等,使用char定长字符串类型;
-
varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率;
-
必须为表、字段等添加注释。如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释;
-
单表的字段数量不要超过60个;
-
多表中的相同列,必须保证列名一致,数据类型一致;
-
每个表必须设置唯一主键,可以使用分布式全局ID(如基于Snowflake算法生成的ID)作为主键,避免使用UUID以及长字符类型字段作为主键,尽可能避免联合主键;
-
禁止将有业务属性的字段直接作为主键使用;
-
单表索引数量尽量控制在5个以内,Order by、distinct、group by后的字段尽量建立索引;update、delete语句的where尽量使用有索引的字段或主键
-
建议选择合适的数据类型,有助于节约数据库表空间、节约索引存储,更重要的是提升检索速度。
数据类型 | 使用说明 |
---|---|
char | 能够避免数据变长的场景选择,如编码字段 |
varchar | 变长的数据选择,根据业务情况设置字段长度; |
int/tinyint | 如果用该类型存储状态值,尽量设置为非空;避免NULL这种容易产生歧义的值; |
number/decimal | 存储多位小数的精确的数值时优先选择这种类型; |
blob/image | 存储文件内容,尽可能规避这种用法,如果必须用数据库存储,则建议与业务库分离; |
(medium/long)text | (长)文本字段,避免出现在查询子句中,避免对该类型字段建立索引,涉及长文本检索可考虑ES或程序内配合缓存实现 |