数据库开发规范

数据库设计规范

1.1 所有数据库对象名必须使用小写字母并用下划线分割
1.2 所有数据库对象名禁止使用数据库保留关键字
1.3 所有数据库对象名必须见名识意
1.4 所有数据库对象名长度不超过32个字符
1.5 临时表以_t结尾后缀
1.6 备份表以_b结尾后缀
1.7 历史表以_h结尾后缀
1.8 关系表以_r结尾后缀
1.9 所有存储相同数据的列名和列类型必须一致(id除外,主键统一为id,外键为domain_id,列类型必须一致)
1.10 所有表必须使用innodb引擎
1.11 数据库表统一使用utf-8字符集 (数据库需支付utf8mb4
1.12 Mysqlvarchar类型长度和字母汉字无关。(10个长度就能存储10个汉字)。
1.13 所有数据库对象必须有comment,必须维护数据库字典。
1.14 业务单表尽量控制在500w以内,从业务角度考虑分表。
1.15 慎用分区(如果要用分区需采用物理分区)。
1.16 数据库表设计尽量做到冷热数据分离

1.16.1 (这个在产品设计或交接评审时需要和产品沟通)
1.16.2  减少磁盘io
1.16.3  增加热数据的命中率
1.16.4  避免sending大量无用数据
1.17  经常一起使用的数据列放进一张表
1.18 禁止在表中建预留字段
1.18.1  字段类型无法预知
1.18.2  字段含义无法预知
1.18.3  。。。
1.19 禁止在数据库中存储图片、二进制等内容(如果要存,也需要讨论后分出扩展表存储)
1.20 单表索引限制在五个以内
1.21 禁止给表中的每一列都添加单独的索引
1.22 每张表必须建立主键
1.23 禁止多列主键
1.24 禁止字符串主键、建议自增或者生成集群下有序主键(尤其uuid,待定)
1.25 表命名以模块或服务开头(security_user
1.26  
1.27 子系统或模块名_表名(子系统或模块其实就是数据库)
1.28 子系统或模块名_v_视图名
1.29 子系统或模块名_p_过程名
1.30 子系统或模块名_f_函数名
1.31 子系统或模块名_idx_函数名
1.32 三范式
1.32.1 必须有主键、列不可拆分(原子性 字段不可再分,否则就不是关系数据库;
1.32.2 有主键、非主键字段必须依赖全部主键(唯一性 一个表只说明一个事物;
1.32.3 非主键字段相互之间没有依赖关系(每列都与主键有直接关系,不存在传递依赖; 
1.32.4  
1.32.5 触发器、视图、函数、过程应慎用或禁用。

1.32.6 控制单表的数据量


数据库字段设计规范

1.1 尽量选择业务数据需要的最小数据类型
1.2 对于非负的数据采用无符号的整形进行存储
1.3 Varcharn)中的n是字符数不是字节数
1.4  使用utf8存储varchar255)、需要765字节
1.5 过大的长度会消耗更多的内存
1.6 避免使用enum或者禁止使用enum set类型字段
1.7 尽可能把所有列定义为not null
1.7.1  索引null列需要额外的存储空间
1.8  比较和计算null列需要特殊的处理逻辑
1.9  null的列尽可能设置default
1.10 避免使用where is null 或者 where is not null  从业务或者设计上避免
1.11 建议不要用字符串存储日期类型 
1.12 无法用日期函数进行计算和比较
1.12.1 字符串会占用更多的空间和内存
1.12.2 timestamp占用4字节1970-2038
1.12.3 超出timestampdatetime存储
1.12.4 建议使用datetime类型
1.13 财务相关或精度要求高的列必须使用decimal、部分小数可采用倍数后存储整型
1.14 避免使用blobtext类型(如需要一定设计在扩展表中)
1.15 减小数据表的宽度
1.15.1 从业务角度区分冷热数据、对冷热数据进行分分表存储
1.15.2 从业务角度区分数据、对数据进行垂直拆分分表存储
1.16 对固定长度的列用char类型等固定列类型
1.17 禁止使用特定数据库方言、包括函数以及方言语法(分页除外 不要较真。分页在pagehelper中针对特定方言进行处理)
1.18 外部同步来的数据或者外部交换数据必须设计外部idout_xxx_id
1.19 单表字段数尽量限制在20以内


索引设计规范

1.1 索引分类
1.1.1 主键索引
1.1.2 唯一索引
1.1.3 单列索引
1.1.4 多列索引
1.2 索引建议的列(where从句、order bygroup bydistinct、多表join的关联on中的列)
1.3 区分度高的列放在联合索引中的最左侧
1.4 尽量把数据长度小的列放在联合索引的最左侧
1.5 使用最频繁的列放在联合索引中的最左侧
1.6 避免建立重复索引和冗余索引(比如主键id、唯一索引、普通索引)
1.7  Primary keyid)、indexid)、unique indexid
1.8  Indexabc)、indexab)、indexa

1.9 对于频繁的查询优先使用覆盖索引

  索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的数据就叫做覆盖索引

1.10  避免innodb 表进行索引的二次查找
1.11  可以把随机io 变为顺序 io 加快查询效率
1.12 避免使用外键
1.12.1  外键用于保证数据的参考完整性、这个在业务逻辑中保证
1.12.2  外键会降低关联表的写入更新性能
1.13 合理排列索引的顺序
1.14  限制索引的数量 5
1.15  索引尽可能建在短字段上、避免在长字符串上建立索引。

注意多列索引的字段顺序。


数据库语句开发规范

1.1 避免数据的隐式转换。
1.2  Select * from id = ‘1111’; //id为自增int
1.3 避免使用%HHH%查询条件
1.4 一条sql只能利用到符合索引中的一列进行范围查询
1.5 使用left join或者not exist优化not in 查询
1.6 禁止跨库查询
1.7 禁止select *  
1.8  消耗内存和cpu以及网络贷款
1.9  无法使用覆盖索引
1.9.1  减少表结构变化带来的影响
1.10 禁止无字段的insert操作
1.11 避免使用子查询,可以把子查询优化为join操作
1.11.1  子查询结果集无法使用索引
1.11.2  子查询会产生临时表
1.12 避免join太多的表
1.12.1  Join一个表会占用一部分内存
1.12.2  产生临时表、影响查询效率
1.12.3  原则上不超过五个
1.13 减少同数据库的操作次数
1.14  尽量进行批处理
1.15  合并多个相同的操作可以提高效率。
1.16 使用in优化or
1.17  In的值不要超过500.
1.18  In可以利用到索引
1.19 严禁在sql中出现随机数据随机函数
1.20 Where语句中禁止对列进行函数操作
1.21 注意unionunion all的区别
1.22  Union会对结果集进行二次取重、union all不会
1.23 避免负逻辑 != <>not in
1.24 sql拆分为小sql
1.25  
1.26 Order by group by 中如果有null值将无法用到sql优化器
1.27 禁止无onjoin 
1.28 on后慎用or
1.29 多表连接必须对每个表进行别名,建议所有查询的表上都进行别名
1.30 尽量不用右链接
1.31 禁止在=左边进行函数操作或者计算
1.32 禁止在索引列上进行函数操作或计算
1.33 索引列尽量排列在where条件的最后、以区别度高底进行排列、区分度越高越靠右
1.34 尽可能进行批量insertupdate,批量更新借助when语句在mybatis中进行foreach组合。
1.35 清空表用truncate语句。
1.36 限制返回结果条数。

避免大sql大事务。


猜你喜欢

转载自blog.csdn.net/u014203449/article/details/80167183