数据库建表规范

一、库名、表名规范

  1. 全部使用小写英文字母 + 下划线_,禁止大写、驼峰、中文、空格、特殊符号。
  2. 命名见名知意,名词为主,尽量简短不缩写(通用缩写除外:id、img、cfg)。
  3. 表名:业务模块_实体,例如 user_info、order_main、student_score。
  4. 禁止使用数据库关键字:order、user、desc、group,如必须使用加后缀,order_info。
  5. 同一业务库放同一模块表,不跨业务混表;测试库/正式库分开。
  6. 表名禁止复数:推荐 user,不推荐 users。

二、字段命名规范

  1. 同样小写+下划线,见名知意。
    • user_id、create_time、phone、real_name
  2. 主键统一命名:id(自增主键);外键命名:关联表_id,例 order_id。
  3. 布尔类型:推荐 is_xxx,is_deleted、is_enable,值0/1。
  4. 时间字段固定命名:
    • create_time 创建时间
    • update_time 更新时间
    • delete_time 软删除时间
  5. 禁止:中文列名、拼音命名、单字母无意义字段。

三、数据类型选择规范

优先够用、节省存储空间,避免过大类型

  1. 主键ID:
    • 普通业务:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
    • 小表数据量少:INT UNSIGNED
    • 分布式:可使用 VARCHAR(64) 存雪花ID
  2. 字符串
    • 短固定文本(手机号、编号):CHAR(n)
    • 可变短文本(名称、标题):VARCHAR(n),n按实际预估,不要盲目VARCHAR(1000)
    • 大段文本(文章、详情):TEXT,不要用VARCHAR存超长内容
    • 密码、敏感串:VARCHAR,禁止明文存储
  3. 数值
    • 状态、少量枚举:TINYINT(0~127)
    • 金额:使用DECIMAL,禁止float/double,例 DECIMAL(12,2)
  4. 时间
    • 推荐 DATETIME(范围大、不受时区影响),不推荐TIMESTAMP
    • 不要用字符串存时间
  5. 不使用 ENUM,枚举值放业务代码/字典表,方便扩展。

四、约束规范

  1. 主键:每张表必须有主键,优先自增id,主键不允许NULL。
  2. NULL原则:字段尽量NOT NULL,给默认值;只有确实允许为空才设NULL。
    • 状态默认0、字符串默认''、数字默认0、时间默认'0000-00-00 00:00:00'
  3. 索引规范
    • 主键自动建立聚簇索引
    • 高频查询字段建普通索引;联合索引遵循最左前缀原则
    • 外键:业务系统一般不建议数据库外键约束,由程序控制关联,避免锁和性能问题
    • 禁止在低基数字段(性别、状态)随意建索引;索引不是越多越好,会降低写入性能
  4. 唯一键:唯一业务字段(手机号、账号)加 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标记,不物理删除数据;保留审计追溯。

六、注释规范

  1. 库、表、所有字段必须写COMMENT注释,说明含义。
  2. 注释用中文,简洁清晰,不要冗余。
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 数据库

  1. 引擎:InnoDB(支持事务、行锁),禁止MyISAM。
  2. 字符集:utf8mb4(支持完整emoji,mysql原生utf8不支持4字节字符),排序规则 utf8mb4_general_ci / utf8mb4_unicode_ci。

八、其他开发规范

  1. 禁止在表中预留大量无用字段,字段按需新增;变更表结构要走评审。
  2. 禁止存储图片、文件二进制到数据库,只存文件URL路径。
  3. 状态码统一字典管理,字段注释写明全部取值含义:1启用,2禁用。
  4. 大表考虑分表;单表数据量建议控制,MySQL单表尽量不超千万。
  5. SQL脚本:建表语句写IF NOT EXISTS;删除表写IF EXISTS,防止脚本报错。
  6. 不使用数据库内置函数做业务逻辑,逻辑放应用层。

九、禁止

  • ❌ 表/字段中文命名
  • ❌ 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版本。