适用范围
本文仅适用于 mysql 数据库
原则
- 数据库只做存储使用, 计算 / 业务逻辑放到应用层
- 尽量遵循三范式
高级功能
- 禁止使用触发器 / 存储过程 / 函数 / 视图
触发器非常影响插入 / 更新 / 删除 的效率, 触发器的功能可由应用层来实现
一旦放开存储过程/函数的限制, 不能保证人们会用存储过程/函数来做什么, 极有可能在存储过程/函数里进行大量的运算, 或者将业务逻辑写入; 另外, 大多数缓存在应用层实现, 存储过程/函数就无法复用缓存
触发器 / 存储过程 / 函数 / 视图 没有版本管理
字段
通用字段
- 主键id: 尽量使用单一逻辑主键, 实体使用单一逻辑主键, 关联关系可使用复合主键; 坚决不使用业务主键, 只使用逻辑主键
- 实体一般拥有业务唯一标识 no
- 创建时间 create_time
- 更新时间 update_time
数据类型
字符串类型
- 定长字符串: char(n)
- 不定长字符串: varchar(n)
- 长文本 text
整数类型
无符号 unsigned
类型 | 范围(有符号) | 范围(无符号) |
---|---|---|
tinyint | (-128,127) | (0,255) |
smallint | (-32 768,32 767) | (0,65 535) |
mediumint | (-8 388 608,8 388 607) | (0,16 777 215) |
int | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) |
bigint | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) |
小数类型
decimal(m, d)
布尔类型
boolean
boolean 其实是 tinyint(1)
日期类型
datetime(3)
使用 datetime(3) 来精确到毫秒
约束
非空约束
字符串类型必须加非空约束, 若可空, 请加默认约束, 并默认值为空字符串
布尔类型 / 数字类型 / 日期类型尽量使用非空约束
默认约束
尽量少用
外键约束
不使用, 由应用层保证
check 约束
不使用, 由应用层保证
唯一约束
可使用
命名规则
采用下划线命名法, 英文字母全小写
字段命名
逻辑主键约定为 id
业务唯一标识约定为 no
创建时间约定为 create_time
更新时间约定为 update_time
外键约定为 {table_name}_id
引用数据字典约定为 {数据字典类型编码}_key
索引命名
- 主键: pk_{column1}{column2}…
- 唯一索引: uk_{column1}{column2}…
文档
表注释
{表中文名称}, {说明}
字段
主键
主键
业务唯一标识
业务唯一标识, {说明}
外键
外键, {table_name}.id
数据字典
数据字典, 类型编码: {xx}