MySQL数据库设计规范
数据库创建
- CREATE DATABASE test_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ENCRYPTION='N' ;
建表语句参考
CREATE TABLE `corp_user` (
`id` BIGINT NOT NULL COMMENT 'id(必须)',
`user_id` BIGINT NOT NULL COMMENT '员工id',
`user_status` VARCHAR(50) DEFAULT NULL COMMENT '员工状态',
`merchant_id` INT DEFAULT '0' COMMENT '商户号(选填字段)',
`plateform_type` VARCHAR(100) DEFAULT 'young_eagle' COMMENT '所属系统平台code,用于多平台支持(小鹰/本地呗/等等)(选填字段)',
`system_code` VARCHAR(100) DEFAULT 'op' COMMENT '所属系统系统code,用于多系统支持(op/mp)(选填字段)',
`revision` INT COMMENT '乐观锁(选填字段)' ,
`tenant_id` INT DEFAULT '0' COMMENT '租户号,用户多租户逻辑处理(选填字段)',
`remark` VARCHAR(1000) DEFAULT NULL COMMENT '备注(必须)',
`create_name` VARCHAR(100) DEFAULT NULL COMMENT '创建者(必须)',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(必须)',
`update_name` VARCHAR(100) DEFAULT NULL COMMENT '更新者(必须)',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间(必须)',
`is_deleted` TINYINT(1) DEFAULT '0' COMMENT '是否删除(必须,0:正常 1:刪除),逻辑删除,禁止用于其他状态列使用',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='商户员工表';
注意事项
- 表格
- 创建表语句需要包含库名注释,字段注释
- 表名前写上库名(包含create table、create index 、alter、insert、update、delete...),表、字段有注释、非特殊需要字段定义成not null,字符串类型可以定义成not null default ''
- 存储引擎选择InnoDB
- 主键
- 必须有主键,选择自增列(int/bigint unsigned)作为主键
- 如果无特殊需求,新表自增主键起始值(auto_increment)不要带在创建表脚本中
- 创建表语句 create_time、update_time、create_name、update_name、is_deleted 字段类型需规范,需要索引
- 日志类的表可以不加update_time、is_deleted 字段
- 字段
- 字段禁止使用enum、set类型。替换为采用tinyint/varchar类型+注释方式
- 表示时间的字段,禁止使用timestamp、int/bigint 类型表示时间一律采用datetime类型
- 采用datetime代替timestamp 5.6.4之前的版本建议采用TIMESTAMP,5.6.4之后建议采用DATETIME
- timestamp有时间范围限制,1970-01-01 00:00:00 UTC到2038-01-19 03:14:07UTC
- 采用decimal(m,n) 代替float、double类型
- 相同字段类型支持扩容(varchar(10) -> varchar(64);tinyint -> int →bigint)
- enum类型扩容,枚举值需要跟线上的顺序保持一致
- int(1) int(5) int(11)表示的范围是一样的,结合zerofill定义才有意义
- 状态、类型、性别等可以采用tinyint
- IP、手机号 可以采用bigint方式存储。相关函数 (ip→数值inet_aton() 数值→ip inet_ntoa())
- BLOB/CLOB/TEXT等大字段尽可能拆分出单独的表,采用主键关联
- 字段长度按需要分配
- 字段不要采用MySQL关键字(order、type、timestamp...)
- 整型范围 https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
- 存储空间使用 https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
- MySQL关键字https://dev.mysql.com/doc/refman/8.0/en/keywords.html
- 索引
- 逻辑关联ID需要加索引
- 普通索引:KEY
idx_hotel_id
(hotel_id
) - 普通联合索引:KEY
idx_dh_id
(create_date
,hotel_id
) - 前缀索引:字符串长度超过30,采用前缀索引,KEY
idx_app_id
(app_id
(6)) - 唯一索引:UNIQUE KEY
uniq_bo_id
(business
,order_id
)
- 禁止
- 禁止创建 触发器、存储过程、自定义函数
- 禁止创建表时采用外键(foreign key)
- 禁止字段缩容 如(varchar(64) -> varchar(10);bigint -> int;enum(3个值) -> enum(2个值) #原有值会变成空字符串(与sql_mode有关系))
- 禁止字段类型调整 如(enum -> varchar;数值类型 字符类型转换)
- 禁止删除字段,删除表,更改表名
- 禁止使用is_deleted列作为业务状态列使用,is_deleted=1等同于物理删除