文章目录
- 配置注意
- 命名注意
- 表中 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