MySQL建表规范
建表规范是数据库设计的基础,良好的表结构能提升查询性能、减少存储空间、降低维护成本。
适用场景:新项目建表、表结构评审、数据库设计文档编写。
核心要点
MySQL数据库建表规范,包括命名规范、数据类型选择、索引设计
强制规则
表达是与否概念的字段,必须使用
is_xxx方式命名,数据类型是unsigned tinyint(1表示是,0表示否)表名、字段名必须使用小写字母或数字,禁止数字开头,禁止两个下划线中间只出现数字
- 正例:
aliyun_admin、rdc_config、level3_name - 反例:
AliyunAdmin、rdcConfig、level_3_name - MySQL 在 Linux 下默认区分大小写
- 正例:
表名不使用复数名词,表名应表示实体内容而非数量
禁用保留字,如
desc、range、match、delayed等主键索引名为
pk_字段名;唯一索引名为uk_字段名;普通索引名为idx_字段名小数类型为
decimal,禁止使用float和double(存在精度损失)字符串长度几乎相等时使用
char定长字符串类型varchar长度不要超过 5000;超过此值定义为text,独立一张表表必备三字段:
id:必为主键,类型bigint unsigned,单表自增、步长为 1create_time:datetime 类型update_time:datetime 类型
推荐规则
表命名遵循"业务名称_表的作用",如
alipay_task、trade_config库名与应用名称尽量一致
修改字段含义或状态追加时,及时更新字段注释
字段允许适当冗余提高查询性能,但必须考虑数据一致性。冗余字段应遵循:
- 不是频繁修改的字段
- 不是唯一索引的字段
- 不是 varchar 超长字段,更不能是 text 字段
单表行数超过 500 万行或容量超过 2GB,才推荐分库分表
字段类型选择
| 对象 | 年龄区间 | 类型 | 字节 | 表示范围 |
|---|---|---|---|---|
| 人 | 150岁之内 | tinyint unsigned | 1 | 0-255 |
| 龟 | 数百岁 | smallint unsigned | 2 | 0-65535 |
| 恐龙化石 | 数千万年 | int unsigned | 4 | 0-约43亿 |
| 太阳 | 约50亿年 | bigint unsigned | 8 | 0-约10^19 |
建表语句示例
CREATE TABLE example_task (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
is_deleted TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除:0-否,1-是',
task_name VARCHAR(100) NOT NULL COMMENT '任务名称',
task_desc TEXT COMMENT '任务描述',
status DECIMAL(3,2) NOT NULL DEFAULT 0.00 COMMENT '任务进度',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
INDEX idx_name (task_name),
UNIQUE KEY uk_task_name (task_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务表';