一套完整的 MySQL 数据库设计规范
·
一、表结构规范
1. 每个表必须有主键
id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID'
推荐:
-
类型:
bigint -
名称:
id -
主键:
PRIMARY KEY -
禁止外键关联
原因:
-
避免无主键表导致 InnoDB 隐式主键
-
提升索引效率
2. 审计字段统一
必须包含:
create_user bigint DEFAULT NULL COMMENT '创建人',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_user bigint DEFAULT NULL COMMENT '修改人',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
规范:
-
必须放在
id后面 -
后续新增字段统一追加到最后
结构示例:
id
create_user
create_time
update_user
update_time
业务字段...
3. 字符集统一
数据库 / 表统一:
CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci
原因:
-
支持 emoji
-
避免乱码
4. 存储引擎统一
ENGINE=InnoDB
原因:
-
支持事务
-
支持行锁
5. 表必须有表注释
COMMENT='用户信息表'
二、字段设计规范
1. 字段必须有注释
username varchar(50) NOT NULL DEFAULT '' COMMENT '用户名'
禁止:
username varchar(50)
2. varchar 字段禁止 NULL
统一:
varchar NOT NULL DEFAULT ''
示例:
nickname varchar(50) NOT NULL DEFAULT '' COMMENT '昵称'
原因:
-
避免 NULL 逻辑判断复杂
-
提高查询效率
3. 数值字段默认值
推荐:
int NOT NULL DEFAULT 0
decimal(10,2) NOT NULL DEFAULT 0.00
示例:
price decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '价格'
4. 排序字段统一命名
sort_no
示例:
sort_no int NOT NULL DEFAULT 0 COMMENT '排序号'
5. 状态字段统一
推荐:
status
示例:
status tinyint NOT NULL DEFAULT 1 COMMENT '状态 1正常 0禁用'
6. 逻辑删除字段
推荐:
is_deleted
示例:
is_deleted tinyint NOT NULL DEFAULT 0 COMMENT '是否删除 0否 1是'
7. 布尔字段命名
推荐:
is_xxx
has_xxx
示例:
is_enabled
is_deleted
has_children
8. 时间字段类型
统一使用:
datetime
不推荐:
timestamp
原因:
-
timestamp 范围小
-
时区问题
三、命名规范
1. 表名
规则:
模块名前四个字符_实体
示例:
system:syst_user_info
trade:trad_order_info
product:prod_category
禁止:
UserInfo
userInfo
2. 字段名
统一:
snake_case
示例:
user_name
create_time
order_status
禁止:
userName
UserName
3. 索引命名
规则:
idx_字段
示例:
idx_user_id
idx_create_time
联合索引:
idx_userid_status
唯一索引:
uk_email
四、索引设计规范
1. 高频查询字段必须加索引
例如:
user_id
order_id
create_time
2. 单表索引数量
建议:
<= 5 个
原因:
-
写入性能下降
3. 避免冗余索引
例如:
idx_userid
idx_userid_status
idx_userid 可以删除。
4. 避免在字段上做函数
错误:
DATE(create_time) = '2026-03-12'
正确:
create_time >= '2026-03-12'
五、SQL 规范
1. 禁止 select *
必须:
select id,username
原因:
-
减少 IO
-
防止字段变更影响程序
2. delete / update 必须带条件
禁止:
delete from user
必须:
delete from user where id=1
3. limit 必须存在
防止:
limit 10000
4. 大分页优化
避免:
limit 100000,10
推荐:
where id > last_id
六、数据量规范
单表建议:
<= 500 万
超过:
-
分表
-
分库
七、字段类型规范
推荐:
| 类型 | 使用场景 |
|---|---|
| bigint | id |
| int | 数值 |
| tinyint | 状态 |
| varchar | 文本 |
| decimal | 金额 |
| datetime | 时间 |
避免:
text
longtext
blob
除非必要。
八、金额规范
必须:
decimal(10,2)
禁止:
float
double
原因:
-
精度问题
九、扩展字段规范
如果有扩展字段:
ext_json json COMMENT '扩展字段'
避免:
ext1 ext2 ext3
推荐的标准表结构模板
CREATE TABLE user_info (
id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
create_user bigint DEFAULT NULL COMMENT '创建人',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_user bigint DEFAULT NULL COMMENT '修改人',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
username varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
nickname varchar(50) NOT NULL DEFAULT '' COMMENT '昵称',
status tinyint NOT NULL DEFAULT 1 COMMENT '状态 1正常 0禁用',
sort_no int NOT NULL DEFAULT 0 COMMENT '排序号',
is_deleted tinyint NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (id),
KEY idx_username (username)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci
COMMENT='用户信息表';
再补充 3 个 很多公司忽略但很重要的规范
1. 禁止使用保留关键字
例如:
order
group
desc
2. 禁止使用过长 varchar
推荐:
varchar(50)
varchar(100)
varchar(255)
避免:
varchar(2000)
3. 表字段数量
建议:
<= 30 个
太多说明:
-
表设计不合理
-
应拆表
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)