一、库名、表名规范
- 全部使用小写英文字母 + 下划线
_,禁止大写、驼峰、中文、空格、特殊符号。 - 命名见名知意,名词为主,尽量简短不缩写(通用缩写除外:id、img、cfg)。
- 表名:业务模块_实体,例如
user_info、order_main、student_score。 - 禁止使用数据库关键字:
order、user、desc、group,如必须使用加后缀,order_info。 - 同一业务库放同一模块表,不跨业务混表;测试库/正式库分开。
- 表名禁止复数:推荐
user,不推荐users。
二、字段命名规范
- 同样小写+下划线,见名知意。
user_id、create_time、phone、real_name
- 主键统一命名:
id(自增主键);外键命名:关联表_id,例order_id。 - 布尔类型:推荐
is_xxx,is_deleted、is_enable,值0/1。 - 时间字段固定命名:
create_time创建时间update_time更新时间delete_time软删除时间
- 禁止:中文列名、拼音命名、单字母无意义字段。
三、数据类型选择规范
优先够用、节省存储空间,避免过大类型
- 主键ID:
- 普通业务:
BIGINT UNSIGNED NOT NULL AUTO_INCREMENT - 小表数据量少:
INT UNSIGNED - 分布式:可使用
VARCHAR(64)存雪花ID
- 普通业务:
- 字符串
- 短固定文本(手机号、编号):
CHAR(n) - 可变短文本(名称、标题):
VARCHAR(n),n按实际预估,不要盲目VARCHAR(1000) - 大段文本(文章、详情):
TEXT,不要用VARCHAR存超长内容 - 密码、敏感串:
VARCHAR,禁止明文存储
- 短固定文本(手机号、编号):
- 数值
- 状态、少量枚举:
TINYINT(0~127) - 金额:使用DECIMAL,禁止float/double,例
DECIMAL(12,2)
- 状态、少量枚举:
- 时间
- 推荐
DATETIME(范围大、不受时区影响),不推荐TIMESTAMP - 不要用字符串存时间
- 推荐
- 不使用
ENUM,枚举值放业务代码/字典表,方便扩展。
四、约束规范
- 主键:每张表必须有主键,优先自增id,主键不允许NULL。
- NULL原则:字段尽量
NOT NULL,给默认值;只有确实允许为空才设NULL。- 状态默认0、字符串默认''、数字默认0、时间默认
'0000-00-00 00:00:00'
- 状态默认0、字符串默认''、数字默认0、时间默认
- 索引规范
- 主键自动建立聚簇索引
- 高频查询字段建普通索引;联合索引遵循最左前缀原则
- 外键:业务系统一般不建议数据库外键约束,由程序控制关联,避免锁和性能问题
- 禁止在低基数字段(性别、状态)随意建索引;索引不是越多越好,会降低写入性能
- 唯一键:唯一业务字段(手机号、账号)加
UNIQUE KEY
五、通用预留字段(业务表必加)
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
create_time DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '软删除 0未删除 1已删除',
软删除:用
is_deleted标记,不物理删除数据;保留审计追溯。
六、注释规范
- 库、表、所有字段必须写COMMENT注释,说明含义。
- 注释用中文,简洁清晰,不要冗余。
CREATE TABLE `user_info` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`real_name` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '真实姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
七、引擎与字符集
MySQL 数据库
- 引擎:InnoDB(支持事务、行锁),禁止MyISAM。
- 字符集:
utf8mb4(支持完整emoji,mysql原生utf8不支持4字节字符),排序规则utf8mb4_general_ci/utf8mb4_unicode_ci。
八、其他开发规范
- 禁止在表中预留大量无用字段,字段按需新增;变更表结构要走评审。
- 禁止存储图片、文件二进制到数据库,只存文件URL路径。
- 状态码统一字典管理,字段注释写明全部取值含义:
1启用,2禁用。 - 大表考虑分表;单表数据量建议控制,MySQL单表尽量不超千万。
- SQL脚本:建表语句写IF NOT EXISTS;删除表写IF EXISTS,防止脚本报错。
- 不使用数据库内置函数做业务逻辑,逻辑放应用层。
九、禁止
- ❌ 表/字段中文命名
- ❌ float/double存金额
- ❌ 无主键表
- ❌ 大量字段允许NULL且无默认值
- ❌ MyISAM引擎
- ❌ utf8字符集(mysql的utf8≠完整utf-8)
- ❌ 索引滥用
- ❌ 数据库层面大量使用触发器、存储过程
示例模板
CREATE TABLE IF NOT EXISTS `student_info` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`student_no` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '学号',
`student_name` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '学生姓名',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
`create_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除标记 0正常 1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_student_no` (`student_no`),
KEY `idx_is_deleted` (`is_deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';
如果你需要,我可以精简成一页版用于教案或者输出适合写进开发文档的markdown版本。