跳至主要內容

数据库规范

杨轩-国实信息大约 4 分钟规范

通用字段

字段名字段类型JAVA类型通用性-
created_byvarchar(32)String创建人
created_timedatetimeLocalDateTime创建时间
updated_byvarchar(32)String更新人
updated_timedatetimeLocalDateTime更新时间
del_flagtinyint(2)String数据标识(0正常,1删除)
versionsmallint(6)Integer-需要控制数据版本
tenant_idvarchar(64)String-需要租户
defaultedtinyint(1)String-是否是默认数据
draftedtinyint(1)String-是否是草稿数据

使用:

  • 配合gosci-mybatis-plus-starter使用,可以实现created_bycreated_timeupdated_byupdated_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替代FLOATDOUBLE
  • 禁止在数据库中使用VARBINARYBLOB存储图片、文件等,应使用oss存储并保存地址

通用状态

  • 0,表示正常
  • 1,表示删除、异常等状态

借鉴C++中函数的返回值状态,0表示正常退出,非0表示异常退出

索引规范

如何考虑在某个字段上是否建立索引

  • 选择区分度高的列建立索引,例如性别就不适合(只有两个值,区分度低)
  • 经常与别的表进行连接的表,在连接字段上应该建立索引
  • 经常出现在where子句中的字段,特别是大表的字段,应该建立索引
  • 频繁进行数据操作的表,不要建立太多索引,会引起B+树变化
  • 删除无用索引,避免对执行计划造成影响

避免索引失效

以下情况可能引起索引失效,需要避免:

  • 遵循最左匹配原则
  • 范围查询右边的列,不走索引(select * from user where name = 'kaka' and age > 11 and sex = 1nameage走索引,sex失效)
  • 不要在索引上进行运算操作,计算、函数、类型转换都会引起失效
  • 字符串不加单引号,造成索引失效。(两边类型不等)
  • %开头的like模糊查询
  • 如果mysql评估使用索引比全表扫描更慢,则不使用索引
  • in走索引,not in索引失效
  • is null,is not null 有时可能引起索引失效

开启索引验证

在项目的MybatisPlusConfig中增加以下代码,可以开启索引验证:

interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor());

其他

  • 禁止使用存储过程。存储过程难以调试困难和扩展,更没有移植性。【阿里巴巴java编码规范】
  • 禁止使用触发器。触发器属于隐式调用,无形中增加了系统的复杂性,也容易被用户忽略。涉及到复杂逻辑时,触发器的级联可能会造成死锁。
  • 禁止使用函数。业务逻辑和数据库不应该耦合在一起,并且会增加运维复杂性。
  • 不建议使用视图。视图的优点是操作简单,可以向特定用户隐藏某些字段数据,可以简化一些复杂的查询操作,提高查询效率。但是也存在一些问题:
    • 性能问题:视图是一个虚拟表,实际上并不存储数据,每次查询都需要重新计算视图结果。频繁使用视图会引起性能问题,特别是在大型数据库中。
    • 无法索引:视图无法建立索引,这意味着在对视图进行查询时,数据库引擎需要扫描整个视图的结果集,而无法利用索引来提高查询效率。