大厂MySQL数据库规范文档
MySQL数据库规范
1.建表规约
1.【强制】表名采用统一采用小写,前缀+定义(+后缀),语义清晰、简短为宜,下划线分隔语义,尽量使用名词作为表名,禁止出现数字开头,禁止两个下划线中间只出现数字。表名不使用复数名词。
说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量
【参考】前缀:
- 用户体系请以user_ 作为前缀
- 机构体系请以company_作为前缀
- 日志体系请以log_作为前缀
- 系统表体系请以sys_作为前缀,如系统字典表sys_dict
- 车险相关请以car_作为前缀
- 产品信息请以product_作为前缀
- 临时表名须以tmp_作为前缀,并以 _日期为后缀
- 备份表须以bak_作为前缀,并以 _日期为后缀
【参考】后缀:
两个实体之间的关系请以_map作为后缀
正例:比如我们要设计一个存储用户邀请的表,user_invitation 就比 user_invite 更为合适。
反例:两个下划线中间只出现数字level_3_name。
【参考】敏感数据字段命名:
- 银行卡卡号 bank_account
- 姓名 user_name
- 身份证号 credential_no
- 港澳居民来往内地通行证号码credential_no
- 手机号 phone
- 固定电话号码 tel_phone
- 电子邮箱 email
- 家庭住址 family_address
- 收件地址 delivery_address
- 车牌号 licence_no
- 车架号(vin码) vin
- 发动机号 engine_no
- MAC地址 mac
- 设备号(imei) imei
2.【强制】建表说明
1). 表名必须有注释,字段名必须有注释。
2). 唯一索引名为uniq_字段名;普通索引名则为idx_字段名
3). 数据库字符集默认UTF8MB4
4). 存储引擎默认使用innodb
说明:uniq_ 即 unique, idx_ 即index的简称
正例:
CREATE TABLE `car_info` (`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主键',`car_ucid` CHAR (32) NOT NULL COMMENT '车辆标识码',`licence_no` VARCHAR (15) NOT NULL COMMENT '号牌号码',`licence_type` CHAR (2) NOT NULL DEFAULT '02' COMMENT '号牌种类',`vin` VARCHAR (17) NOT NULL COMMENT '车架号',`engine_no` VARCHAR (50) NOT NULL COMMENT '发动机号',`car_origin_type` TINYINT (4) DEFAULT 0 COMMENT '车辆产地类型 1:国产 2:进口 3:合资',`sys_ctime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`sys_utime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`is_delete` TINYINT (4) NOT NULL DEFAULT '0' COMMENT '删除标志位 0:未删除 1:删除',PRIMARY KEY (`id`),UNIQUE KEY `uniq_car_ucid` (`car_ucid`),KEY `idx_licence_vin` (`licence_no`, `vin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车辆信息';
3.【强制】禁用保留字,如desc、range、key、status、user、type、byte、name等,参考官方保留字。
https://dev.mysql.com/doc/refman/8.0/en/keywords.html
…
2.索引规约
1.【强制】业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。 说明:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了非常完善的校验和控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。
2.【强制】唯一索引必须设为not null。
3.【强制】每个表都需要主键,使用与业务无关的自增bigint/int类型作为主键
说明:因为在MySQL复制环境中,如果binlog format是row格式,则从库上的数据更新时是以主键为依据更新的,如果没有主键将会出现严重的主从延迟。
4.【强制】在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度。
…
3.SQL规约
1.【强制】不推荐面向C端应用使用聚合函数,如count、sum,涉及扫描行数过多,并发查询超过60就容易引发故障。以下为count优化方法,可根据业务特性,对方案进行选型。
2.【强制】不要使用count(列名)来替代count(),count()就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。 说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。
3.【强制】count(distinct col) 计算该列除NULL之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。
…
4.变更规约
1.【建议】各个项目各个版本迭代的的数据库变更语句,需保存在git上。具体git保存示例如下图:
图1 git保存示例
图2 git保存示例
注意:
- sql 文件的命名格式为:逻辑库名_执行顺序.sql 如:wechat_activity_1.sql
- ddl 和dml需要分开存储,其中ddl指变更语句,dml指 update/insert 等
- 不同的schema要放到不同的文件中;不同实例的SQL要放到不同的文件中
- 数据库变更任务每周二18:00之前提交到变更平台,白天不接受大表变更任务。
…
5.运维规约
1.【强制】项目上测试生产环境数据库变更,必须提供变更SQL,与代码一起统一更新至git处。
2.【强制】业务表内禁止使用mysiam引擎,统一规范使用innodb引擎。
3.【强制】应用账号给最小权限()select、insert、update),业务库默认回收delete权限,只允许软删除,如需delete权限,需走工单申请。
4.【强制】禁止非DBA对线上数据库进行写操作,如需修改生产数据,需走工单申请。
5.【强制】开发测试与线上环境隔离。
6.分库分表规约
名称只允许使用a-z、0-9及下划线的组合,不允许出现其他字符
1.【推荐】分库分表方案推荐
-
按时间分库:通过时间进行分库分表
-
单库按年分表
-
单库按月分表
-
单库按日分表
-
按用户id分库:通过 hash(user_id)取模进行分库分表
单库十表
十库十表
百库十表(慎用,分表过多)
十库百表(慎用,分表过多) -
按订单号分库:通过hash(order_id) 取模进行分库分表
单库十表
十库十表
百库十表
十库百表(慎用,分表过多)
2.【强制】数据库命名规约
- 数据库名称全部使用小写 不管如何分库,总的原则是同一系列的数据库名称长度相同,不允许出现名称长短不一的情况
- 如果按百库十表方案分库,则名称为标准库名+下划线+编号后缀,其中编号长度固定为2位,取值范围从00到99,如wechat_car_00、wechat_car_99…
3.【强制】表名命名规约
- 表名全部使用小写 年份固定格式为YYYY四位;月份固定为MM两位。
- 如果按照月份分表,则表名为标准表名+下划线+年月编号,其中年月格式为YYYYMM,固定6位长度,如order_info_201901、order_info_201912…
- 如果按照日分表,则表名为标准表名+下划线+年月日编号,其中年月格式为YYYYMMDD,固定8位长度,如msg_info_20190101、msg_info_20190101
- 如果按照时间分表,表创建到下一年年底,比如现在是2019年4月份,日期类的表应该创建到2020年底。
…
完整内容文档下载链接
内容太多,完整内容文档下载:
《腾讯数据库规范2025.zip》(包括(MySQL、Mongo规范以及数据库选型规范)