以下规范是根据视频与自己的日常数据库设计整理出来的,如果说的不对,请见谅。
数据库命名规范
所有的数据库对象(表名)名称必须使用小写字母并用下划线分割。mysql数 据库识别大小写字母。
所有数据库对象名称禁止使用mysql保留关键字。
数据库对象的命名必须做到见名明义,最大不超过32字符。
所有的临时表必须以tmp为前缀并以日期为后缀
所有的备份库,备份表以bak为前缀并以日期为后缀
所有存储相同数据的列名与列类型必须一致
数据库基本设计规范(存储引擎选择)
所有表必须使用Innodb存储引擎(如何不存在特殊清楚情况的话,5.6以后的默认引擎,支持事务)
字符集统一使用UTF8(必须字符集转换产生乱码,造成损失数据)
汉字UTF8字符集占用3个字节
所有的表和字段都需要添加注释(从一开始进行数据字典的维护)
尽量控制单表数据量的大小,建议控制在500万行以内(500万不是Mysql的限制,可以用历史数据归档)
谨慎使用MySql分区表(在物理上表现多个文件,在逻辑上表现为一个表,建议使用物理分表的方式管理大数据)
建议使用冷热数据分离,减小表的宽度(经常一起使用的列放在一个表中)
禁止在表中建立预留字段(预留字段的命名很难做到见名明义,预留字段无法确认存储的数据类型)
对预留字段类型的修改,会对表进行锁定。
禁止在数据库中存储图片,文件等二进制数据
数据库索引设计规范
索引对数据的查询性能来说是非常重要。
限制每张表的索引数量,建议单张表索引不应超过5个(可增加查询效率,降低增加与删除的效率)
每个Innodb表必须有一个主键。(不能使用更新频繁的列作为主键)
不使用UUID,MD5,HASH,字符串列作为主键
主键建议选择使用自增ID值。
对于频繁的查询优先考虑使用覆盖索引
尽量避免使用外建(外建可用于保证数据的参照完整性,但建议在业务端实现。外建影响父表盒子表的写操作从而降低性能)
-
- 数据库字段设计规范
优先选择符合存储需要的最小的数据类型(将字符串转化为数字类型存储【INET_ATON,INET_NTOA】)
避免使用TEXT BLOB数据类型
避免使用ENUM数据类型
尽可能把所有列定义为NOT NULL
使用TIMESTAMP 或 DATETIME存储时间
同财务相关的金额类的数据,必须使用decimal类型(Decimal为精准浮点数,不会丢失精度)
数据库SQL开发规范
在程序中国使用预编译语句进行数据库操作(避免Sql注入,只传递参数,提高处理效率)
避免数据类型的隐士转换(导致索引失败)
合理利用表上已存在的索引(避免使用双%号的查询条件)
数据库设计时,应该对以后的扩展做考虑。
程序连接不同数据库使用不同的账号,禁止跨库查询(降低业务耦合度)
禁止使用select * (消耗过多的CPU和IO以及网络带宽资源,无法使用覆盖索引)
禁止使用不含字段列表的INSERT语句
避免使用子查询,可以把子查询优化为Join操作
避免使用JOIN关联太多的表(建议不超过5个)
减少同数据库的交互次数
where从句中禁止对列进行函数转换和计算
拆分复杂的大SQl为多个小SQL
数据库操作行为规范(主要是面对运维人员)
超100万的行的批量写操作,要分批多次进行操作(大批量的写操作会导致严重的主从延迟)
禁止为程序使用的账号赋予super权限
对于程序连接数据库账号,遵循权限最小原则