TOC

数据库设计规范

随手写的,以命名为主(原来想写的是命名规范,结果写超了纲)。

通用规则

  1. 采用简练、能够清楚描绘其意义的英语单词(避开数据库关键字、保留字)
  2. 如果使用简称,应该是常用的用法,最好在相关设计文档中说明,比如:约定用户 ID 统一使用 uid 表示,订单 ID 统一使用 oid 表示。
  3. 其他没有遵守规范的地方必须在文档中标明
  4. 由于 MySQL 的数据库和表直接对应到文件,所以需要考虑到 OS 的大小写敏感性问题(Windows 的文件系统就不区分大小写),所以所有命名都统一采用小写字母 + 下划线的命名风格(允许使用的字符:a-z0-9_)。

数据库

  1. 默认采用 utf8mb4 字符集,utf8mb4_general_ci 排序规则。
    部分地方限定 ASCII 字符,可以采用 ascii + ascii_general_ci 或者 latin1 + latin1_general_ci
  2. 读库与写库使用不同地址(IP + 端口),用户名,密码
    用户名中可以有所体现(数据库 + 用户名 + _r/_w),比如:crm_stuff_r 表示 CRM 库的一个只读用户,供内部员工使用。
  3. 环境:prod, test
    1. 可以考虑增加一套 dev 环境给开发人员使用
    2. 可以考虑增加一套 query 环境给内部人员查询使用,
      和线上写库物理隔离,可以考虑数据脱敏
    3. 应该有非线上环境的维护工具(自动重建)

数据表

  1. 单数
  2. 同一个子模块采用相同的前缀,就像 Django 中的设计一样。比如:
    auth_user, auth_role, bbs_post, bbs_comment
  3. 备份表:bak_原名_日期
  4. 尽可能使用字段的备注
  5. 分表分表:ec_order_000 ~ ec_order_255

字段

  1. MyISAM 和 InnoDB/TokuDB
  2. 每张表都有一个 id 作为主键
    • id int unsigned NOT NULL AUTO_INCREMENT 四字节,32 位
    • id bigint unsigned NOT NULL AUTO_INCREMENT 八字节,64 位
  3. has_xxx, is_xxx, xxx_num
  4. create_time, create_user, update_time, update_user
  5. 外键尽可能采用:表名_id, 可以采用不产生歧义的缩写,比如 user_id 对应 auth_userid 字段。
  6. Boolean 类型统一使用 bit 类型
  7. 其他有固定选项的字段考虑使用 enum 类型
  8. 时间使用 datetimetimestamp
  9. IPv4 可以采用 varcharint
  10. 需要用到小数的地方,如果对精度有要求尽可能采用 decimal 类型
  11. 如果项目规模达到一定程度,可以在每张表中加入乐观锁字段
  12. 部分表可以采用软删除处理: is_delete
    删除时,可以对相关行中的唯一键字段进行变更,比如用户表删除之后用户名字段的处理:用户名约定只能采用字母、数字、下划线,删除时改成 DEL:日期:随机串:原用户名

索引

  1. idx_xxx_yyy, uk_xxx_yyy, pk_xxx_yyy