文章目录

  • ​​配置注意​​
  • ​​命名注意​​
  • ​​表中 column 定义​​
  • ​​索引​​
  • ​​表结构​​

配置注意

  • 项目中一般就是使用 utf8mb4

命名注意

  • 表和 column 小写
  • 一个 column 名字如果多个单词下划线连接
  • 表名前最好带上业务前缀,比方说订单相关的业务,其中有很多种表,有支付表,支付细节表,那么就可以有 order_pay 和 order_pay_detail,商品相关的业务,则可能有 product_sku 和 product_spu 表等
  • 一般这些开发时候都很固定的形式写法了
    用户名:user_name

表中 column 定义

  • 枚举类型可以使用 tinyint 为 1 个字节
  • 金额字段可以选择 decimal 类型
  • 时间建议用 datetime
  • 如果有人在建表时候,里头有几十个甚至上百个字段,这样是不太合适的,应该把这个“大”表拆成多张“小”表
  • 尽可能字段能确定 not null,需要加上 not null 属性,因为不定义后续可能不太好加索引(null 使得索引失效,且存储 null 的话一般需要额外空间)
  • 不仅建议要加上 not null(如果能明确的话),同时对于加了 not null 的字段也不要吝啬给一个 default value,因为试想场景后续你加了这个 not null 的字段不加默认值会导致老数据的这个新字段为 null 了
  • 对于金钱相关严重看重小数精确度的,需要使用 decimal,decimal(n, m),n 表示小数的整数+小数点后位数总长度,m 表示小数位数长度
  • 常见于用户的评论字段,不建议用 text 因为会浪费存储空间,建议使用 varchar()
  • 对于状态字段建议使用独立数字表示
  • 建议尽量不要建立外键,保证每个表的独立性

索引

  • 需要频繁查询的字段,或者是某个表的外键(当然为了性能考虑,没有加上外键索引),最好加上普通索引,为了查询更高效
  • 当然索引也不能建立太多,因为会影响写数据的效率,因为构建索引也需要时间,并且索引也会占用额外的存储空间,建议单表索引不超过 5 个

表结构

  • 建议静态表和动态表分离,比如一些存储固定不变的资源(城市-地名-国家),静态表使用缓存机制
  • 在有 1 对 1 的表关系或者 1 对 n 的表关系中,可以考虑在其中在创建一个关系表,用各表的 id 建立起来这个关系表,这样也不会有重复数据,而且关系易于理清
  • 可以增加一个 status 字段来表示是否删除这行数据,一般前端要删除时候把这个字段设置位 false,这样 mysql 仅仅是 update 不是真正删除数据,gorm.Model 自带软删除能力,且 gorm.Model 软删除后正常查询也能自动过滤掉 deleted_at