简介
希望通过一套SOP,提高MySQL建表效率,降低出错的可能性。使用填表+AI的形式,可以省去编写MySQL建表脚本的过程。
SOP
MySQL建表
| 表属性 |
值 |
| 表名 |
user |
| 引擎 |
InnoDB |
| 字符集 |
utf8 |
| 表注释 |
用户表 |
| 字段名 |
数据类型 |
是否允许为空 |
默认值 |
注释 |
| id |
unsigned bigint |
NOT NULL |
AUTO_INCREMENT |
主键 |
| user_name |
varchar(50) |
NOT NULL |
DEFAULT '' |
用户名 |
| user_rank |
unsigned int |
NOT NULL |
DEFAULT '0' |
用户等级 |
| gmt_create |
date_time |
NOT NULL |
CURRENT_TIMESTAMP |
创建时间 |
| gmt_modified |
date_time |
NOT NULL |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
| 字段名 |
索引名 |
索引类型 |
是否为联合索引 |
| user_rank |
idx_user_user_rank |
普通索引 |
否 |
将以上三张表丢给AI,即可生成如下建表脚本
CREATE TABLE `user` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
`user_rank` int unsigned NOT NULL DEFAULT '0' COMMENT '用户等级',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_user_rank` (`user_rank`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
建表规约
引擎统一使用InnoDB或与旧表相同
字符集统一使用utf8或与旧表相同
所有字段都应为NOT NULL
所有字段都应有默认值
字符类型字段使用varchar
数字类型字段参考下表
| 对象 |
年龄区间 |
类型 |
字节 |
| 人 |
150岁之内 |
unsigned tinyint |
1 |
| 龟 |
数百岁 |
unsigned smallint |
2 |
| 恐龙化石 |
数千万岁 |
unsigned int |
4 |
| 太阳 |
约50亿年 |
unsigned bigint |
8 |
所有表应至少包含id、gmt_create、gmt_modified三个字段
notes/MySQL/MySQL数据库开发的三十六条军规.md at master · guanguans/notes (github.com)
p3c/p3c-gitbook/MySQL数据库/建表规约.md at master · alibaba/p3c (github.com)
MySQL 时区全解,datetime 和 timestamp 区别,GMT、UTC、CST、东八区分别指什么? | 老郭种树 (guozh.net)
应用
资源表
资源检索系统中,图片、视频等资源以url的形式存储在数据库中,并拥有类型、格式等属性。
| 表属性 |
值 |
| 表名 |
resource |
| 引擎 |
InnoDB |
| 字符集 |
utf8 |
| 表注释 |
资源表 |
| 字段名 |
数据类型 |
是否允许为空 |
默认值 |
注释 |
| id |
unsigned bigint |
NOT NULL |
AUTO_INCREMENT |
主键 |
| name |
VARCHAR(100) |
NOT NULL |
DEFAULT '' |
名称 |
| url |
VARCHAR(6000) |
NOT NULL |
DEFAULT '' |
URL |
| type |
unsigned tinyint |
NOT NULL |
DEFAULT '0' |
类型。0表示文字、1表示图片、2表示视频 |
| format |
unsigned smallint |
NOT NULL |
DEFAULT '0' |
格式。 |
| length |
unsigned int |
NOT NULL |
DEFAULT '0' |
长度单位:像素 |
| width |
unsigned int |
NOT NULL |
DEFAULT '0' |
宽度。单位:像素 |
| size |
unsigned bigint |
NOT NULL |
DEFAULT '0' |
大小。单位:kb |
| duration |
unsigned bigint |
NOT NULL |
DEFAULT '0' |
持续时间。单位:ms |
| user_id |
unsigned bigint |
NOT NULL |
DEFAULT '0' |
用户id |
| status |
unsigned tinyint |
NOT NULL |
DEFAULT '0' |
状态 |
| gmt_create |
date_time |
NOT NULL |
CURRENT_TIMESTAMP |
创建时间 |
| gmt_modified |
date_time |
NOT NULL |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
| 字段名 |
索引名 |
索引类型 |
是否为联合索引 |
| user_id |
idx_resource_user_id |
普通索引 |
否 |
单元表
一个单元下拥有多个资源
| 表属性 |
值 |
| 表名 |
unit |
| 引擎 |
InnoDB |
| 字符集 |
utf8 |
| 表注释 |
单元表 |
| 字段名 |
数据类型 |
是否允许为空 |
默认值 |
注释 |
| id |
unsigned bigint |
NOT NULL |
AUTO_INCREMENT |
主键 |
| name |
varchar(100) |
NOT NULL |
DEFAULT '' |
名称 |
| status |
unsigned tinyint |
NOT NULL |
DEFAULT '0' |
状态 |
| gmt_create |
date_time |
NOT NULL |
CURRENT_TIMESTAMP |
创建时间 |
| gmt_modified |
date_time |
NOT NULL |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
单元资源表
单元表与资源表间的关系表
| 表属性 |
值 |
| 表名 |
unit_resouce |
| 引擎 |
InnoDB |
| 字符集 |
utf8 |
| 表注释 |
单元资源表 |
| 字段名 |
数据类型 |
是否允许为空 |
默认值 |
注释 |
| id |
unsigned bigint |
NOT NULL |
AUTO_INCREMENT |
主键 |
| unit_id |
unsigned bigint |
NOT NULL |
DEFAULT '0' |
单元id |
| resource_id |
unsigned bigint |
NOT NULL |
DEFAULT '0' |
资源id |
| status |
unsigned tinyint |
NOT NULL |
DEFAULT '0' |
状态 |
| gmt_create |
date_time |
NOT NULL |
CURRENT_TIMESTAMP |
创建时间 |
| gmt_modified |
date_time |
NOT NULL |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
| 字段名 |
索引名 |
索引类型 |
是否为联合索引 |
| unit_id |
idx_unit_resouce_unit_id |
普通索引 |
否 |
地区表
一个单元有地区特性
| 表属性 |
值 |
| 表名 |
unit_district |
| 引擎 |
InnoDB |
| 字符集 |
utf8 |
| 表注释 |
单元地区表 |
| 字段名 |
数据类型 |
是否允许为空 |
默认值 |
注释 |
| id |
unsigned bigint |
NOT NULL |
AUTO_INCREMENT |
主键 |
| unit_id |
unsigned bigint |
NOT NULL |
DEFAULT '0' |
单元id |
| province |
varchar(100) |
NOT NULL |
DEFAULT '' |
省份 |
| city |
varchar(100) |
NOT NULL |
DEFAULT '' |
城市 |
| status |
unsigned tinyint |
NOT NULL |
DEFAULT '0' |
状态 |
| gmt_create |
date_time |
NOT NULL |
CURRENT_TIMESTAMP |
创建时间 |
| gmt_modified |
date_time |
NOT NULL |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
| 字段名 |
索引名 |
索引类型 |
是否为联合索引 |
| unit_id |
idx_unit_district_unit_id |
普通索引 |
否 |
关键词
一个单元有关键词特性
| 表属性 |
值 |
| 表名 |
unit_keyword |
| 引擎 |
InnoDB |
| 字符集 |
utf8 |
| 表注释 |
单元关键词表 |
| 字段名 |
数据类型 |
是否允许为空 |
默认值 |
注释 |
| id |
unsigned bigint |
NOT NULL |
AUTO_INCREMENT |
主键 |
| unit_id |
unsigned bigint |
NOT NULL |
DEFAULT '0' |
单元id |
| keyword |
varchar(100) |
NOT NULL |
DEFAULT '' |
关键词 |
| status |
unsigned tinyint |
NOT NULL |
DEFAULT '0' |
状态 |
| gmt_create |
date_time |
NOT NULL |
CURRENT_TIMESTAMP |
创建时间 |
| gmt_modified |
date_time |
NOT NULL |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
| 字段名 |
索引名 |
索引类型 |
是否为联合索引 |
| unit_id |
idx_unit_keyword_unit_id |
普通索引 |
否 |