公司用的 MySQL 团队开发规范,太详细了,建议收藏( 二 )


3、后缀(_i,_u,_d),表示触发条件的触发方式(insert,update或delete) 。
4、命名应使用小写 。
1 DROP TRIGGER IF EXISTS trig_attach_log_d;2 CREATE TRIGGER trig_attach_log_d AFTER DELETE ON t_dept FOR EACH ROW; 
约束命名规范1、唯一约束:uk_表名称_字段名 。uk是UNIQUE KEY的缩写 。比如给一个部门的部门名称加上唯一约束,来保证不重名,如下:ALTER TABLE t_dept ADD CONSTRAINT un_name UNIQUE(name);
2、外键约束:fk_表名,后面紧跟该外键所在的表名和对应的主表名(不含t_) 。子表名和父表名用下划线(_)分隔 。如下:ALTER TABLE t_user ADD CONSTRAINT fk_user_dept FOREIGN KEY(depno) REFERENCES t_dept (id);
3、非空约束:如无特殊需要,建议所有字段默认非空(not ),不同数据类型必须给出默认值(default) 。
1 `id` int(11) NOT ,2 `name` varchar(30) DEFAULT '',3 `deptId` int(11) DEFAULT 0,4 `salary` float DEFAULT ,4、出于性能考虑,如无特殊需要,建议不使用外键 。参照完整性由代码控制 。这个也是我们普遍的做法,从程序角度进行完整性控制,但是如果不注意,也会产生脏数据 。
5、命名应使用小写 。
 
用户命名规范1、 生产使用的用户命名格式为 code_应用
2、 只读用户命名规则为 read_应用
 
数据库对象设计规范存储引擎的选择1、如无特殊需求,必须使用innodb存储引擎 。
可以通过 show variables like 'default_storage_engine' 来查看当前默认引擎 。主要有MyISAM 和 InnoDB,从5.5版本开始默认使用 InnoDB 引擎 。
基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持 。MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能 。
 
字符集的选择1、如无特殊要求,必须使用utf8或utf8mb4 。
在国内,选择对中文和各语言支持都非常完善的utf8格式是最好的方式,MySQL在5.5之后增加utf8mb4编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode 。
所以utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换 。当然,为了节省空间,一般情况下使用utf8也就够了 。
可以使用如下脚本来查看数据库的编码格式
1 SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';2 -- 或3 SHOW VARIABLES Like '%char%'; 
表设计规范1、不同应用间所对应的数据库表之间的关联应尽可能减少,不允许使用外键对表之间进行关联,确保组件对应的表之间的独立性,为系统或表结构的重构提供可能性 。目前业内的做法一般 由程序控制参照完整性 。
2、表设计的角度不应该针对整个系统进行数据库设计,而应该根据系统架构中组件划分,针对每个组件所处理的业务进行数据库设计 。
3、表必须要有PK,主键的优势是唯一标识、有效引用、高效检索,所以一般情况下尽量有主键字段 。
4、一个字段只表示一个含义 。
5、表不应该有重复列 。
6、禁止使用复杂数据类型(数组,自定义等),Json类型的使用视情况而定 。
7、需要join的字段(连接键),数据类型必须保持绝对一致,避免隐式转换 。比如关联的字段都是int类型 。
8、设计应至少满足第三范式,尽量减少数据冗余 。一些特殊场景允许反范式化设计,但在项目评审时需要对冗余字段的设计给出解释 。
9、TEXT字段作为大体量文本存储,必须放在独立的表中 , 用PK与主表关联 。如无特殊需要,禁止使用TEXT、BLOB字段 。
10、需要定期删除(或者转移)过期数据的表,通过分表解决,我们的做法是按照2/8法则将操作频率较低的历史数据迁移到历史表中,按照时间或者则曾Id做切割点 。
11、单表字段数不要太多,建议最多不要大于50个 。过度的宽表对性能也是很大的影响 。
12、MySQL在处理大表时,性能就开始明显降低,所以建议单表物理大小限制在16GB,表中数据行数控制在2000W内 。
业内的规则是超过2000W性能开始明显降低 。但是这个值是灵活的,你可以根据实际情况进行测试来判断,比如阿里的标准就是500W,百度的确是2000W 。实际上是否宽表,单行数据所占用的空间都有起到作用的 。
13、如果数据量或数据增长在前期规划时就较大,那么在设计评审时就应加入分表策略,后续会有专门的文章来分析数据拆分的做法:垂直拆分(垂直分库和垂直分表)、水平拆分(分库分表和库内分表);


推荐阅读