数据结构设计与开发规范

表设计规范

  • 对象名称必须使用小写,多单词统一使用下划线分割

  • 所有的表设计统一命名规范,主表用t_e_开头,关系表用t_con_开头,统计表用t_as_开头,例如
    plan_project换成t_e_plan_project,这样能见名知意理解作用。

  • 临时表必须以tmp_开头、以日期结尾,备份表必须以bak_开头、以日期结尾

  • 数据库和数据表统一使用UTF8MB4字符编码

  • 所有的表和字段必须添加注释

  • 表列保证在20个列以下,这样提高内存命中率,减少磁盘IO。

  • 主键id建议采用雪花算法,不要使用非自增的uuid。

  • 给表的外键的字段增加索引。

  • 这些表的字段大小长度按实际业务长度设计。

  • 尽量控制表行数在500万以内

  • 每一张InnoDB表都必须含有一个主键

    InnoDB 是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引,但是表的存储顺序只能有一种 InnoDB是按照主键索引的顺序来组织表的。不要使用可能会更新的列作为主键,同时尽量不要使用UUIDMD5HASH等无序的字符串作为主键。在没有特别的情况下,要使用自增的整型或发号器作为主键。

字段设计规范

  • 优先设置占存储空间最小的类型和长度

  • 使用 DATETIME存储时间

  • 尽可能避免使用TEXTBLOBENUM数据类型

    MySQL 内存临时表不支持TEXTBLOB这样的大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行,毋庸置疑会降低查询的效率。

  • 尽可能将所有的数据列定义为NOT NULL类型

    NULL列比较特殊,需要额外的空间来保存,同时会造成索引失效。

  • 金额、分数相关的数据必须使用DECIMAL数据类型

  • 表与表关联的键名保持一致或以关联表名的缩写为前缀

  • 固定长度的字符串字段务必使用CHAR

  • 使用UNSIGNEG存储非负整数

  • 禁止敏感数据以明文形式存储

    确保信息的安全性,比如密码、隐秘数据等。

索引设计规范

  • 索引的命名以idx_开头,索引长度超过16个字符。

  • 禁止在索引列进行数学运算和函数运算

  • 避免冗余和重复索引

    在一张用户表里面,将用户id设置成主键的同时再设置成唯一索引,那就是重复索引,如果创建了索引(a,b),再设置a索引,则a为冗余索引,这两种错误的操作都会降低读写的性能。

  • 符合索引将区分度高的置前

    将区分度高的索引置前可以缩短查询的范围,以至提高查询的效率,特别是在JOIN连表查询,提高效率特别明显。

  • MySQL对索引字段长度是有限制的,TEXTBLOB类型只能使用前缀索引。

SQL使用规范

  • 危险的SQL语句必须带上索引作为条件

  • 严禁使用SELECT *查询字段

  • 查询语句务必带上索引以提高查询效率

  • 必须避免数据类型隐式转换

  • 禁止使用带有数据值却不带有字段键名的INSERT操作

  • 尽可能使用JOIN替代子查询操作

  • 避免使用JOIN关联过多的表,关联太多的情况,需要表重新设计。

    一般情况下,建议JOIN的表不要超过5个,JOIN多表查询比较耗时时间,关联的表越多越耗时间,防止执行超时或死锁。

  • 合并操作、减少数据库的交互

  • 禁止使用ORDER BY RAND()随机排序语句

  • 禁止在WHERE语句中进行计算

  • 大批量写操作尽可能合理地分批次处理

    大批量的操作应当合理平均分批次处理,防止死锁影响业务,同时尽量将跑批这种大操作至于凌晨操作。

  • 不在数据库做运算,务必将运算置于业务层

  • 禁止使用索引做运算

  • 使用事务尽量简单化,同时控制事务执行的时间

    时间长会导致长时间锁表,造成死锁,进而影响业务。

  • IN语句参数的个数尽量控制在1000以内

  • 注意LIMIT分页查询效率,LIMIT越大效率越低

    # S1
    SELECT `username` FROM `user` LIMIT 10000,20;
    # S2
    SELECT `username` FROM `user` WHERE id>10000 LIMIT 20;
    
  • 禁止使用LIKE添加%前缀进行模糊查询

  • 禁止一条语句同时对多个表进行写操作

你可能感兴趣的:(数据结构设计与开发规范)