https://segmentfault.com/a/1190000040352010

  • UUID 也可以当主键,自增 UUID 比自增主键性能更好,多占用的空间也可忽略不计
  • 金融字段除了 decimal,也可以试试 bigint,存储分为单位的数据
  • 对于固定选项值的字段,MySQL8 以前推荐使用枚举字段,MySQL8 以后使用check函数约束,不要使用 0,1,2 表示
  • 一张表的索引个数并没有限制不能超过5个,可以根据业务情况添加和删除
  • MySQL8 对子查询有了优化,可以放心使用

index索引

MySQL 单表的索引没有个数限制,业务查询有具体需要,创建即可,不要迷信个数限制
错误的设计规范:限制每张表上的索引数量,一张表的索引不能超过 5 个

主键

错误的设计规范:主键建议使用自增 ID 值,不要使用 UUID,MD5,HASH,字符串作为主键

金融字段

财务相关的金额类数据必须使用 decimal 类型

  • 由于 float 和 double 都是非精准的浮点数类型,而 decimal 是精准的浮点数类型。
  • 一般在设计用户余额,商品价格等金融类字段一般都是使用 decimal 类型,可以精确到分

但是,在海量互联网业务的设计标准中,并不推荐用 DECIMAL 类型,而是更推荐将 DECIMAL 转化为整型类型

  • 金融类型更推荐使用用分单位存储,而不是用元单位存储。如1元在数据库中用整型类型 100 存储
  • decimal 是通过二进制实现的一种编码方式,计算效率不如 bigint
  • 使用 bigint 的话,字段是定长字段,存储高效,而 decimal 根据定义的宽度决定,在数据设计中,定长存储性能更好
  • 使用 bigint 存储分为单位的金额,也可以存储千兆级别的金额,完全够用

避免使用 ENUM类型

遇到用户性别,商品是否上架,评论是否隐藏等字段的时候,都是简单的将字段设计为 tinyint,然后在字段里备注 0 为什么状态,1 为什么状态,缺点

  • 表达不清:这个表可能是其他同事设计的,每次都需要去看字段注释,有时候在编码的时候需要去数据库确认字段含义
  • 脏数据:虽然在应用层可以通过代码限制插入的数值,但是还是可以通过sql和可视化工具修改值

MySQL 8.0.16 以后的版本,可以直接使用check约束机制,不需要使用enum枚举字段类型

  • 如果选项值不固定的情况,随着业务发展可能会增加,才不推荐使用枚举字段