随手写的,以命名为主(原来想写的是命名规范,结果写超了纲)。
通用规则
- 原则上只使用小写字母、数字、下划线,并且字母开头。长度尽可能短(不做强制要求)。
- 采用简练、能够清楚描绘其意义的英语单词(避开数据库关键字、保留字)。
- 如果使用简称,应该是常用的用法,最好在相关设计文档中说明,比如:约定用户 ID 统一使用
uid
表示,订单 ID 统一使用oid
表示。 - 其他没有遵守规范的地方必须在文档中标明。
- 由于 MySQL 的数据库和表直接对应到文件,所以需要考虑到 OS 的大小写敏感性问题(Windows 的文件系统就不区分大小写),所以所有命名都统一采用小写字母 + 下划线的命名风格(允许使用的字符:
a-z0-9_
)。 - 数据库文档生成工具: JSON,Markdown, HTML, DOC, PDF
- 所有表和字段都应该有备注
数据库
- 默认采用
utf8mb4
字符集,utf8mb4_general_ci
排序规则。
部分地方限定 ASCII 字符,可以采用ascii
+ascii_general_ci
或者latin1
+latin1_general_ci
。 - 读库与写库使用不同地址(IP + 端口),帐号,密码
- 不同用途使用不同的帐号(可以加 IP 限制)。
- 帐号名称中可以有所体现(数据库 + 用途 +
_r
/_w
),比如:crm_w
表示 CRM 项目对 CRM 仓库的读帐号,主要用途。crm_stuff_r
表示 CRM 库的一个读帐号,供内部员工使用。crm_backend_w
表示管理后台项目对 CRM 仓库的写帐号。
- 管理后台上有账户权限的展示
- 代码扫描工具,应该检查访问权限,SQL 语句
- 帐号名称中可以有所体现(数据库 + 用途 +
- 环境:prod, test, dev, query
- prod: 生产环境
- test: 测试环境,测试人员功能测试使用
- dev: 开发环境,开发人员自测使用
- query: 和 prod 同步,但是不在 prod 集群中,用于内部查询
- 管理后台上应该有非线上环境的维护工具(自动重建,快速部署)
test 和 dev 环境可以根据要求自动生成测试数据。
- 数据脱敏问题
数据表
- 统一采用英语单词的单数形式
- 同一个子模块采用相同的前缀,比如:
auth_user
,auth_role
,bbs_post
,bbs_comment
- 备份表:
bak_原名_日期
- 临时表:
tmp_名称_日期
- 分表分表:
ec_order_000
~ec_order_255
字段
xxx_id
xxx_no
xxx_num
xxx_count
is_xxx
has_xxx
id
name
content
status
remark
create_time
create_user
update_time
update_user
gmt_create
gmt_modified
is_delete
version
- MyISAM 和 InnoDB/TokuDB
- 每张表都有一个
id
作为主键id int unsigned NOT NULL AUTO_INCREMENT
四字节,32 位id bigint unsigned NOT NULL AUTO_INCREMENT
八字节,64 位
has_xxx
,is_xxx
,xxx_num
create_time
,create_user
,update_time
,update_user
- 外键(不是 MySQL 的 FK 约束)尽可能采用:
表名_id
, 可以采用不产生歧义的缩写,比如user_id
对应auth_user
的id
字段。 - 尽最大可能 NOT NULL
- Boolean 类型统一使用
bit
类型 - 其他有固定选项的字段考虑使用
enum
类型 - 时间使用
datetime
或timestamp
- IPv4 可以采用
varchar
或int
- 需要用到小数的地方,如果对精度有要求尽可能采用 decimal 类型
- 如果项目规模达到一定程度,可以在每张表中加入乐观锁字段
- 部分表可以采用软删除处理:
is_delete
删除时,可以对相关行中的唯一键字段进行变更,比如用户表删除之后用户名字段的处理:用户名约定只能采用字母、数字、下划线,删除时改成DEL:日期:随机串:原用户名
。
索引
idx_xxx_yyy
,uk_xxx_yyy
,pk_xxx_yyy
- 不要滥用索引,避免太多索引拖累写操作