• MySQL数据库规约


    一、账号密码规约

    1. 【强制】root账号:每个业务对应一个密码,密码复杂度大于18位必须为自动生成,包含数字、大小写字母、特殊字符组成
         注:所有人禁用root账号
    2. 【强制】程序账号:用户名按照库名命名,密码位随机生成密码(无特殊需求,权限为增删改查),如有跨库查询需求请使用下划线连接两个库名,库名过长请使用简称。
      参考如下:
        正例: 场景a库,b
      无跨库需求:账号为a或者b
      有跨库需求:账号为a_b
    3. 【强制】研发有需求登录线上数据库分析问题,请使用个人账号(权限:只读),禁止使用程序账号,个人账号需以个人名称拼音命名。
        例子:zhanghuashan

    注:以上账号权限均为最小化权限原则

    二、建表规约 

    1.【强制】表名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。

    2.【强制】字段名必须使用小写字母,禁止使用拼音;数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。

    3.【强制】禁用保留字,如 desc、range、table、add等,请参考 MySQL 官方保留字。 

    链接地址:https://dev.mysql.com/doc/refman/5.7/en/keywords.html

    4.【强制】表必备三字段:id, cretae_time,update_time

    Id为主键无符号(unsigned)自增,create_time,update_time 需设置默认时间,并指定为datetime类型

    5.【强制】所有表和字段都需要添加注释

    6.【强制】小数类型为 decimal,禁止使用 float 和 double。 

    7.【强制】如果存储的字符串长度几乎相等,使用 char 定长字符串类型。 

    8.【强制】varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。 

    9.【强制】临时表和备份表必须定期清理(备份归档)

    10.【强制】所有的字符集均采用utf8mb4 

    、索引规约 

    1.【强制】主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。

    说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。

    2.【强制】超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询时,保证被关联的字段需要有索引 

    说明:即使两张表join也要注意表索引、SQL 性能。 

    3.【强制】在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度

    说明:索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达 90%以上,可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。

    4.【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决

    5.【强制】避免建立冗余索引和重复索引

    说明:会增加优化器生成执行计划的时间、占用额外的磁盘空间

    6.【强制】建组合索引的时候,区分度最高的在最左边。 

    正例:如果 where a=? and b=?,a 列的几乎接近于唯一值,那么只需要单建 idx_a 索引即可。 

    说明:存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如:where c>? and d=? 那么即使 c 的区分度更高,也必须把 d 放在索引的最前列,即建立组合索引 idx_d_c。 

    7.【强制】防止因字段类型不同造成的隐式转换,导致索引失效。

    四、SQL 语句规约

    1. 【强制】不要使用 count(列名)或 count(主键)来替代 count(*),count(*)是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。 

    说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。 

    2.【强制】不得使用外键与级联,一切外键概念必须在应用层解决

    说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。 

    3.【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。 

    4.【强制】对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定,必须以小表作为驱动表,使得小表驱动大表。

    正例:select t1.name from table_first as t1 , table_second as t2 where t1.id=t2.id

    5.【强制】大数据量的超过10万行的变更(update/delete/insert),请分批多次进行操作

    6.【强制】where条件后面禁止队列进行函数转换和计算

    7.【强制】使用不等于(!= 或者 <>),无法使用索引

    8.【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。

    五、行为规约

    1.【强制】对单表的多次alter操作必须合并为一次操作

    2.【强制】重大项目的数据库方案选型和设计必须提前通知DBA参与

    3.【强制】对特别重要的库表,提前与DBA沟通确定维护和备份优先级

    4.【强制】不在业务高峰期批量更新、查询数据库

    5.【强制】批量导入、导出数据须提前通知DBA,请求协助观察

    6.【强制】数据库DDL及重要SQL及早提及DBA评审

    7.强制】提及线上DDL需求,所有SQL语句须有备注说明

    六、推荐规范

    http://cf.ishumei.com/pages/viewpage.action?pageId=408584718

  • 相关阅读:
    ADT上跑java application
    GIT 用RSA加密方式来记住密码
    android中listView下有Button按钮始终在最底部
    Android学习:导入工程时报错The import android cannot be resolved
    Preference的使用
    MySQL查询时,查询结果如何按照where in数组排序
    MySQL创建民族表的SQL语句
    PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现
    使用file_get_contents()和curl()抓取网络资源的效率对比
    常用正则表达式整理(持续更新中)
  • 原文地址:https://www.cnblogs.com/MLing/p/16092380.html
Copyright © 2020-2023  润新知