大纲:
范式要求
建库规约
建表规约
建字段规约
索引规约
SQL语句
一、范式要求
严格遵循数据库三范式:
第一范式(1NF):字段值具有原子性,不能再分(所有关系型数据库系统都满足第一范式);
例如:姓名字段,其中姓和名是一个整体,如果区分姓和名那么必须设立两个独立字段;
第二范式(2NF):一个表必须有主键,即每⾏数据都能被唯一的区分;
备注:必须先满足第一范式;
第三范式(3NF):一个表中不能包涵其他相关表中非关键字段的信息,即数据表不能有沉余字段;
备注:必须先满足第二范式;
二、建库规约
1、字符集使用【UTF-8】
2、命名规范
命名可使用:英文字母(全大写)、数字; 禁止使用MySQL保留字、特殊字符、关键字等,如:name,time ,datetime,password等;
命名简洁明确(长度不超过30个字符);
例:PANGU、EASY7
三、建表规约
1、字符集使用【UTF-8】
字符规则:utf8mb4 -- UTF-8 Unicode
排序规则:utf8mb4_unicode_ci
2、表存储引擎使用 InnoDB 引擎,支持事务控制
3、命名规范
● 命名可使用:英文字母(全大写)、数字、下划线; 禁止使用MySQL保留字、特殊字符、关键字等,如:name,time ,datetime,password等;
● 命名简洁明确、见名知义,长度不超过32个字符,多个单词用下划线'_'分隔;
● 通用表命名规则:TAB_功能点,例:TAB_USER、TAB_DEVICE
● 各行业表命名规则:TAB_模块标识_功能点;
● 公共插件的数据字典设计去掉行业属性,
例:TAB_JCW_PERSON(X)
TAB_PERSON (√)
4、表设计中禁止使用:触发器、自定义函数、存储过程;
5、表设计中必须有主键,不推荐使用联合主键;
6、建表需要添加备注,备注格式:产品-模块-表说明;
7、备份库、备份表必须以【BAK_】为前缀并以日期为后缀;
8、临时库表必须以【TMP_】为前缀并以日期为后缀;
9、每个表必须有如下字段:
S_ID varchar 100 一位空字符串【 】 默认主键
S_CREATE_USER varchar 50 当前登录⽤户ID 创建人(用户ID)
S_UPDATE_USER varchar 50 当前登录⽤户ID 更新人(用户ID)
DT_CREATE_TIME datetime 0 系统当前时间(代码中传递值) 创建时间(年月日 时分秒)
DT_UPDATE_TIME datetime 0 系统当前时间(代码中传递值) 更新时间(年月日 时分秒)(数据创建时,DT_UPDATE_TIME = DT_CREATE_TIME 按照)
注:
1、创建时间、更新时间、创建人、更新人,在盘古封装的操作数据库模块中,会自动填充数据,调用接口时不用进行传参
2、新开发功能,使用物理删除(原逻辑删除【I_DEL_FLG】随版本迭代修改,改为物理删除)
四、建字段规约
1、命名规范:
1、命名可使用:英文字母(全大写)、数字、下划线;禁止使用 MySQL 保留字、特殊字符、关键字等,如:name,time ,datetime,password 等;
2、命名简洁明确,多个单词用下划线【_】分隔;
3、按字段类型使用对应前缀,具体参考【7】;例:S_ID、I_TYPE、DT_CREATE_TIME
2、字符串统一使用 varchar,id 类、uuid 类字段长度 50;
3、禁止使用 blob 类型字段;
4、所有字段,必须有【默认值】,不允许出现 NULL;
5、所有字段,必须有【描述信息】;
6、逻辑型中数值 0 表示为“假”,数值 1 表示为“真”
7、字段前缀要求:
字符串和文本 S_ varchar、text 空字符串(不允许null)
1、长度4000以下使用varchar、长度4000以上使用text
数字 I_ tinyint、int
0或-100
1、tinyint值范围:有符号范围是-128到127,无符号范围是0到255
2、int 值范围:0-43亿
3、考虑降低默认值带来业务处理中冲突概率
日期(年月日) D_ date
考虑不带时区
时间(年月日时分秒) DT_ datetime
考虑不带时区
五、索引规约
1、命名规范
1、命名可使用:英文字母(全大写)、数字、下划线,命名简洁明确,多个单词⽤下划线【_】分隔;禁止使用 MySQL 保留字、特殊字符、关键字等,如:name,time ,datetime,password 等;
2、主键索引前缀:PK_,命名规范:PK_表名_字段名;(例:PK_TAB_USER_S_ID)
3、其他索引前缀:IDX_,命名规范:IDX_表名_字段名;(例:IDX_TAB_DEVICE_I_DEVICE_TYPE、IDX_TAB_USER_S_ID)
2、索引类型选择【BETREE】索引;
3、创建索引的时候请符合以下原则,提升索引的使用效率:
1、使用唯一索引。考虑某列中值的分布,索引的列的基数越大,索引效果越好。
2、杜绝过度索引,会降低写操作的性能。推荐单表索引数不要超过 4 个。
4、推荐超过三个表禁止 join,需要 join 的字段,数据类型保持绝对一致;多表关联查询时,保证被关联的字段需要有索引;
5、如果有 order by 的场景,请注意利用索引的有序性。避免出现 file_sort 的情况,影响查询性能;
6、建组合索引的时候,区分度最大的在最左边;
7、如果字段需做模糊查询之外的条件查询,需建索引;
六、SQL语句规约
1、所有关键字必须大写,如:INSERT、UPDATE、DELETE、SELECT 及其子句,IF……ELSE、CASE、DECLARE 等;
2、不要使用 COUNT(列名) 或 COUNT(常量)来替代 COUNT(*),COUNT(*) 是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关
3、禁止使用 SELECT * 必须用 SELECT 字段列表查询;
4、禁止使用不含字段列表的 INSERT 语句;
5、禁止使用 ORDER BY RAND() 进行随机排序 ;
6、使用 ISNULL() 来判断是否为 NULL 值
说明:NULL 与任何值的直接比较都为 NULL。
1、NULL <> NULL 的返回结果是 NULL,而不是 false。
2、NULL = NULL 的返回结果是 NULL,而不是 true。
3、NULL <> 1 的返回结果是NULL,而不是 true。
7、禁止使用存储过程,存储过程难以调试和扩展,更没有移植性
8、禁止使用数据库函数,避免切换数据库产生兼容性问题