基础规范:

禁止显式指定字符集,数据库字符集默认使用utf8mb4,兼容utf8,并支持存储emoji表情等四字节内容,排序规则是utf8mb4_general_ci

禁止在线上生产环境做数据库压力测试

禁止从测试、开发环境、本机直连线上生产数据库

禁止在数据库中存储明文密码

禁止在数据库中存储图片、文件等大数据(通常存储于文件服务器,数据库只存储文件地址信息)

禁止将业务日志实时保存到数据库,建议保存到日志文件,对于统计后的结果再存放到mysql中

禁止线上核心业务使用mysql存储过程、视图、触发器、Event、InnoDB外键约束、函数等,这些容易将业务逻辑和db耦合在一起

建议数据库设计时,要对以后扩展进行考虑

建议业务部门的推广活动,请提前通知dba进行服务和访问评估

库、表:

要求数据库名称:zy_xxx

要求库名、表名、字段名只能使用小写英文字母、数字、下划线,以英文字母开头,不要以数字或下划线开头,并且不能多个下划线连用,避免产生混淆

建议对相关功能的业务表使用相同前缀,如job_xxx(前缀通常为库名或依赖主实体对象);

要求临时表(RD、QA或DBA同学用于数据临时处理的表),统一使用”temp_时间(例:20220101)”为前缀;备份表统一使用”_bak+时间(例:20220101)”为前缀

要求使用innodb存储引擎,数据库表默认存储引擎为InnoDB,所有环境禁止使用MyISAM、Memory等其他存储引擎

要求库名、表名、字段名禁止使用MySQL保留字,如status、date、like、desc、return等

建议控制表字段数,单表建议不超过50个纯INT/20个VARCHAR(20)字段等同存储体积的字段数,上限控制在20~50

要求字段命名需要表示其实际含义的英文单词或简写,单词之间可用下划线 _ 进行连接,并含有comment注释

建议字段名尽量不超过30个字符

要求表字段使用not null,并且设置默认值

建议控制单表数据量的大小,建议控制在500万以内(过大会造成修改表结构,备份,恢复都会有很大的问题)

建议避免使用TEXT、BLOB数据类型(建议把BLOB或是TEXT列分离到单独的扩展表中)

要求同财务相关的金额类数据必须使用decimal类型

要求每个表必须存在时间列

create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

索引:

要求索引名字符合前缀规则,普通索引命名以”idx字段名(或简写)”,唯一索引需要以”uniq字段名(或简写)”开头

要求存在主键,推荐使用独立于业务的AUTO_INCREMENT列或全局ID生成器的做主键,禁止使用多字段做联合主键,并且类型统一为bigint类型(id bigint unsigned not null auto_increment)

要求不使用UUID/MD5/HASH等函数生成的无规则值做主键,效率极差

建议单张表中索引数量不超过5个,单个索引中的字段数不超过5个,特殊要求可联系DBA沟通确认

建议如果对字符串使用前缀索引,前缀索引长度不超过20个字符

要求理解组合索引最左前缀原则,避免冗余索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c),建议按照字段选择性高低排列联合索引的字段顺序

建议线上慎用FORCE INDEX,使用前需要和DBA沟通,并得到DBA的测试允许