数据库设计三大规范 数据库设计规范


数据库设计三大规范 数据库设计规范

文章插图
数据库设计规范(数据库设计三规范)原波波论运维2019-10-12 00:01:00
摘要与Oracle、SQL Server等数据库相比,MySQL数据库在内核方面有其优势和不足 。我们在使用MySQL数据库时,需要遵循一定的规范,扬长避短 。在github上偶然看到一个很大的MySQL数据库设计规范,顺便分享到这里 。
https://github . com/jly 8866/archer/blob/master/src/docs/MySQL _ db _ design _ guide . MD
写的东西都很实用,建议收藏看看 。
1.数据库设计以下所有规范将按照【高风险】、【强制】和【推荐】三个等级进行标注,合规优先级由高到低 。对于不符合[高风险]和[强制性]级别的设计,DBA将强制他们召回进行修改 。
1.库名
【强制】库的名称必须控制在32个字符以内,相关模块的表名要尽可能的表现出联接关系,比如user表和user_login表 。
【强制】库名格式:业务系统名_子系统名,同一模块中使用的表名尽量使用统一前缀 。
【必填】一般子库名的命名格式为库名_编号,编号从0开始递增 。例如,按时间排列的wenda_001子数据库的名称格式为“库名_时间” 。
[强制]创建数据库时,必须明确指定字符集,字符集只能是utf8或utf8mb4 。创建数据库SQL的例子:创建数据库db1默认字符集utf8 。
2.表结构
【强制】表名和列名必须控制在32个字符以内,表名只能使用字母、数字和下划线,均为小写 。
【强制】表名要求模块名相关性强,如教师系统前缀为“sz”,通道系统前缀为“qd” 。
[Force]创建表格时,必须明确指定字符集为utf8或utf8mb4 。
[强制]创建表时,必须显式指定表存储引擎类型 。如果没有特殊要求,永远是InnoDB 。当需要使用InnoDB/MyISAM/Memory以外的存储引擎时,必须经过DBA的批准,才能在生产环境中使用 。Innodb table是业内使用最广泛的MySQL存储引擎,因为它支持关系数据库的重要特性,如事务、行锁、停机恢复、MVCC等 。这是大多数其他存储引擎所不具备的,所以InnoDB是首选 。
[强制]创建表时必须有注释 。
【建议】创建表时,关于主键:(1)强制主键为id,类型为int或bigint,且为auto _ increment 。(2)标识表中每行主题的字段不应设置为主键 。建议设置其他字段,如user_id、order_id等 。,并建立唯一的关键索引(参考cdb.teacher表设计) 。如果设置为主键,随机插入主键值,会导致innodb中的页面拆分和大量的随机I/O,降低性能 。
【建议】核心表(如用户表、资金相关表)必须有行数据的create_time字段和last update_time字段,以便于查问题 。
[建议]表中所有字段必须不为空,业务可以根据需要定义默认值 。因为使用NULL值会导致一些问题,比如每行会占用额外的存储空,数据迁移容易出错,聚合函数的计算结果有偏差 。
【建议】建议将表格中的blob、text等大字段垂直拆分到其他表格中,仅在需要读取这些对象时选择 。
【建议】反范式设计:冗余一个在其他表中经常需要join查询的字段 。例如,user_name属性在user_account、user_login_log和其他表中是冗余的,以减少连接查询 。
[强制]中间表用于保存中间结果集,名称必须以tmp_开头 。Backup table用于备份或捕获源表的快照,其名称必须以bak_开头 。定期清理中间表和备份表 。
【强制】对于超过100W行的大表,alter table必须经过DBA的批准,并在业务低峰期执行 。因为alter table会产生表锁,所以在此期间阻止对表的所有写入可能会对业务产生很大影响 。
3.列数据类型优化
[建议]表中自增列(auto_increment属性)推荐使用bigint类型 。因为无符号int的存储范围是-2147483648~2147483647(约21亿),溢出会导致错误 。
【建议】对于业务中选择性不大的status、type type等字段,建议使用tinytint或smallint节省存储空 。
【建议】业务中IP地址字段推荐int类型,不推荐char(15) 。因为int只占4个字节,所以可以用下面的函数相互转换,而char(15)至少占15个字节 。一旦表数据行数达到1亿,就应该使用1.1G千兆字节的存储空 。SQL:select inet _ aton(' 192 . 168 . 2 . 12 ');选择inet _ ntoa(3232236044);PHP:IP 2 long(' 192 . 168 . 2 . 12 ');long 2 IP(3530427185);
[建议]不建议使用enum,set 。因为它们浪费空,而且枚举值写死了,不方便更改 。建议使用Tinyint或smallint 。
【建议】不推荐blob、text等类型 。都是浪费硬盘和内存之间的空间空 。加载表数据时,大字段会被读入内存,从而浪费内存空,影响系统性能 。建议与PM和RD沟通是否真的需要这么大的场地 。在Innodb中,当一行记录超过8098个字节时,将选择记录中最长的字段,其768个字节将放在原始页中,其余的字段将放在溢出页中 。不幸的是,在紧凑行格式中,原始页和溢出页都将被加载 。


推荐阅读