mysql建库建表规范
本规范旨在帮助开发人员逐步建立合理使用数据库的意识,对数据库相关的资源申请、业务规范使用等提供规范性的指导,从而为公司业务系统稳定、健康地运行提供保障。
[TOC]
对象命名规范
所有对象命名应该遵循下述原则:
- 凡是需要命名的对象,其标识符不能超过30个字符;
- 名称必须以英文字母开头,不得以 _(下划线) 作为起始和终止字母;
- 所有名称的字符范围为:a-z, 0-9 和_(下划线),禁用大写、特殊符号、保留字、汉字和空格;
- 采用英文单词或英文缩写作为名称,不使用无意义的字符或汉语拼音;
- 名称应该清晰明了,能够准确表达事物的含义,最好可读,遵循“见名知意”的原则;
新增数据库
数据库命名规范
- 数据库名称统一使用小写,采用下划线_分割,禁止以中划线-或小数点.分割,比如
platform-2.3; - 数据库以 xxx_ 开头,再加业务系统代号,再加上具体业务名称,比如支付网关:xxx_pay_gateway;
注:xxx 可以是公司的英文标识,请根据实际修改。
申请者提供信息
- 具体跑的什么业务,以便dba登记用途
- 上线后的压力情况,比如qps、最大并发如何
- 预计占用多大空间,每月增长速度。比如上线占用100G,每月增长10G
注:如果已有同类业务的mysql实例,则新库优先创建在已有实例上;
注:推荐一个业务线使用一个mysql实例,若mysql单实例超过20个数据库,则应拆分多个实例;
MySQL建库示例
CREATE DATABASE xxx_pay_gateway DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'user_pay_gateway'@'%' IDENTIFIED BY 'wSgjBrY5lqe!mbIu';
GRANT SELECT,INSERT,UPDATE ON xxx_pay_gateway.* TO 'user_pay_gateway'@'%';
FLUSH PRIVILEGES;
示例解析
- 强制:字符集utf8mb4,排序规则utf8mb4_unicode_ci
注:utf8最大支持3个字节的UTF-8字符(真正的UTF-8是每个字符最多四个字节),支持大部分汉字;而utf8mb4是utf8的超集,专门兼容4个字节的unicode,支持Emoji表情、很多不常用的汉字,以及任何新增的Unicode字符等;
- 默认权限:SELECT,INSERT,UPDATE。无DELETE权限,删数据请使用is_deleted逻辑删除
特例:若为开源项目,因为初始化过程需要创建相关资源,权限可以设为 ALL PRIVILEGES
- 密码复杂度:长度16位、包含大小写和特殊字符
新增数据表
数据表命名规范
- 以表的具体内容进行描述。如:用户基础信息的表名为 users
- 关联表可以使用两个表组合方式,比如 user_class
- 每个表/字段都要有注释,说明其含义,对于外键字段请说明参照哪个表
MySQL建表示例
USE xxx_pay_gateway;
CREATE TABLE IF NOT EXISTS users (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
user_id bigint(20) NOT NULL comment '用户id',
user_name varchar(10) NOT NULL comment '用户姓名',
insert_time timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '插入时间',
update_time timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
is_deleted tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除状态位,1删除0保留',
PRIMARY KEY pk_users(id),
KEY idx_insert_time(insert_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户基础表' /*# Owner: 张开发; Manager: 李经理 #*/ ;
示例解析
- 强制自增id为bigint(20),且为主键,业务不要使用
- 表中必须包含4个固定列:id, insert_time, update_time, is_deleted
- 若 is_deleted=1 则认为该行已删,不允许再变更
- 所有字段强制 NOT NULL+默认值,比如int默认0,varchar默认''
- 表和字段必须有comment注释
- 建新表必须填写创建人/负责人
- 禁止使用大字段,比如varchar(2000+)、text、image、blob,大字段建议存放到oss
- 如果对时间精度有要求,建表的时候请注意一下时间精度,比如 timestamp 与 timestamp(3)
新增索引
- 索引的命名可参考如下:
索引类型 | 命名规范 | 备注 |
---|---|---|
主键 | pk_表名 | 主键具有唯一性,以表名命名 |
普通索引 | idx_字段1_字段n | 不用加上表名,有点冗余 |
唯一索引 | udx_字段1_字段n | u表示unique,唯一 |
- 创建索引可参考如下:
ALTER TABLE users ADD INDEX idx_update_time(update_time);