数据库规范
大约 4 分钟规范
通用字段
字段名 | 字段类型 | JAVA类型 | 通用性 | - |
---|---|---|---|---|
created_by | varchar(32) | String | 是 | 创建人 |
created_time | datetime | LocalDateTime | 是 | 创建时间 |
updated_by | varchar(32) | String | 是 | 更新人 |
updated_time | datetime | LocalDateTime | 是 | 更新时间 |
del_flag | tinyint(2) | String | 是 | 数据标识(0正常,1删除) |
version | smallint(6) | Integer | - | 需要控制数据版本 |
tenant_id | varchar(64) | String | - | 需要租户 |
defaulted | tinyint(1) | String | - | 是否是默认数据 |
drafted | tinyint(1) | String | - | 是否是草稿数据 |
使用:
- 配合
gosci-mybatis-plus-starter
使用,可以实现created_by
、created_time
、updated_by
、updated_time
自动填充。 del_flag
字段配合@TableLogic
注解,可以实现逻辑删、查找过滤删除数据的功能。
表名和字段格式
- 表名小写,不超过30位,命名遵循
模块名_业务名_附加信息
- 表字段小写,不超过20位,驼峰方式命名
- 数据库字符集选择
utf8mb4
,可以兼容4字节的unicode,排序规则选择utf8mb4_general_ci
(默认排序规则) - 时间格式数据库为
datetime
,映射JAVA类属性字段为LocalDate
或者LocalDateTime
- 描述为是否的字段,数据库采用
tinyint(2)
类型,有符号可表示-128~127
,无符号可表示0~255
- 建议使用
UNSIGNED
存储非负数值,同样的字节数,存储的数值范围更大 - 比较小的数据用可使用
smallint
类型,占用两字节,取值范围为-32768~32767
- 存储精确浮点数必须使用
DECIMAL
替代FLOAT
和DOUBLE
- 禁止在数据库中使用
VARBINARY
、BLOB
存储图片、文件等,应使用oss存储并保存地址
通用状态
- 0,表示正常
- 1,表示删除、异常等状态
借鉴C++中函数的返回值状态,0表示正常退出,非0表示异常退出
索引规范
如何考虑在某个字段上是否建立索引
- 选择区分度高的列建立索引,例如性别就不适合(只有两个值,区分度低)
- 经常与别的表进行连接的表,在连接字段上应该建立索引
- 经常出现在where子句中的字段,特别是大表的字段,应该建立索引
- 频繁进行数据操作的表,不要建立太多索引,会引起B+树变化
- 删除无用索引,避免对执行计划造成影响
避免索引失效
以下情况可能引起索引失效,需要避免:
- 遵循最左匹配原则
- 范围查询右边的列,不走索引(
select * from user where name = 'kaka' and age > 11 and sex = 1
,name
和age
走索引,sex
失效) - 不要在索引上进行运算操作,计算、函数、类型转换都会引起失效
- 字符串不加单引号,造成索引失效。(两边类型不等)
- 以
%
开头的like模糊查询 - 如果mysql评估使用索引比全表扫描更慢,则不使用索引
- in走索引,not in索引失效
- is null,is not null 有时可能引起索引失效
开启索引验证
在项目的MybatisPlusConfig
中增加以下代码,可以开启索引验证:
interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor());
其他
- 禁止使用存储过程。存储过程难以调试困难和扩展,更没有移植性。【阿里巴巴java编码规范】
- 禁止使用触发器。触发器属于隐式调用,无形中增加了系统的复杂性,也容易被用户忽略。涉及到复杂逻辑时,触发器的级联可能会造成死锁。
- 禁止使用函数。业务逻辑和数据库不应该耦合在一起,并且会增加运维复杂性。
- 不建议使用视图。视图的优点是操作简单,可以向特定用户隐藏某些字段数据,可以简化一些复杂的查询操作,提高查询效率。但是也存在一些问题:
- 性能问题:视图是一个虚拟表,实际上并不存储数据,每次查询都需要重新计算视图结果。频繁使用视图会引起性能问题,特别是在大型数据库中。
- 无法索引:视图无法建立索引,这意味着在对视图进行查询时,数据库引擎需要扫描整个视图的结果集,而无法利用索引来提高查询效率。