安全规范
(1)禁止在数据库中明文储存密码,手机号等用户敏感信息,需要加密后再进行存储。
(2)禁止开发同学直接导出涉及用户敏感信息给业务同学,如需要,则需要上级领导审批。
(3)涉及导出功能的操作,用户的敏感数据都需要进行脱敏或者加密。
(4)对链接数据的IP都要进行设置白名单,杜绝非法IP接入。
(5)线上链接数据库的用户名和密码要定期进行更换。
基础规范
(1)尽量不要在数据库做复杂运算,复杂运算需要移到应用里完成。
(2)拒绝大SQL,拒绝大事务,拒绝大批量,可转化到业务端完成。
(3)避免使用存储过程、触发器、函数等,容易造成业务逻辑与数据库耦合。
(4)数据库表和字段必须加入中文注释。
(5)不在数据库存储图片、文件等大数据。
(6)对于程序连接数据库账号,遵循权限最小原则。
(7)数据库设计时,需要问下自己是否对以后的扩展性进行了考虑。
(8)利用pt-query-digest定期分析slow query log并对其进行优化。
(9)使用内网域名而不是ip连接数据库。
(10)如果数据量或数据增长在前期规划时就较大,那么在设计评审时就应加入分表策略。
(11)要求所有研发SQL关键字全部是小写,每个词只允许有一个空格。
命名规范
(1)库名、表名、字段名要小写,下划线风格,不超过32个字符,必须见名知意,建议使用名词而不是动词,词义与业务、产品线等相关联,禁止拼音英文混用。
(2)普通索引命名格式:idx_表名_索引字段名(如果以首个字段名为索引有多个,可以加上第二个字段名,太长可以考虑缩写),唯一索引命名格式:uk_表名_索引字段名(索引名必须全部小写,长度太长可以利用缩写),主键索引命名:pk_ 字段名。
(3)库名、表名、字段名禁止使用MySQL保留字。
(4)临时库表名必须以tmp为前缀,并以日期为后缀。
(5)备份库表必须以bak为前缀,并以日期为后缀。
(6)用HASH进行散表,表名后缀使用16进制数,下标从0开始。
(7)按日期时间分表需符合YYYY[MM][DD][HH]格式
(8)散表如果使用md5(或者类似的hash算法)进行散表,表名后缀使用16进制,比如user_ff。
(9)使用CRC32求余(或者类似的算术算法)进行散表,表名后缀使用数字,数字必须从0开始并等宽,比如散100张表,后缀从00-99。
(10)使用时间散表,表名后缀必须使用特定格式,比如按日散表user_20110209、按月散表user_201102。
(11)表达是与否概念的字段,使用 is _ xxx 的方式进行命名。
库设计规范
(1)数据库使用InnoDB存储引擎。
(2)数据库和表的字符集统一使用UTF8。
(3)不同业务,使用不同的数据库,避免互相影响。
(4)所有线上业务库均必须搭建MHA高可用架构,避免单点问题。
表设计规范
(1)建表规范示例。
CREATE TABLE `student_info` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`stu_name` varchar(10) NOT NULL DEFAULT '' COMMENT '姓名',
`stu_score` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '总分',
`stu_num` int(11) NOT NULL COMMENT '学号',
`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`status` tinyint(4) DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_student_info_stu_num` (`stu_num`) USING BTREE,
KEY `idx_student_info_stu_name` (`stu_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生信息表';?
(2)禁止使用外键,如果有外键完整性约束,需要应用程序控制。
(3)每个Innodb 表必须有一个主键。
(4)单表列数目最好小于50。
(5)禁止使用分区表。
(6)拆分大字段和访问频率低的字段,分离冷热数据。
(7)采用合适的分库分表策略,例如千库十表、十库百表等(建议表大小控制在2G)。
(8)单表不超过50个int字段;不超过20个char字段,不超过2个text字段。
(9)表默认设置创建时间戳和更改时间戳字段。
(10)日志类型的表可以考虑按创建时间水平切割,定期归档历史数据。
(11)禁止使用order by rand()。
(12)可以结合使用hash、range、lookup table进行散表。
(13)每张表数据量建议控制在500w以下,超过500w可以使用历史数据归档或分库分表来实现(500万行并不是MySQL数据库的限制。过大对于修改表结构,备份,恢复都会有很大问题。MySQL没有对存储有限制,取决于存储设置和文件系统)。
(14)禁止在表中建立预留字段。