库表字段约束规范

字段名约束

  • is_xxx 字段应设置为 unsigned tinyint 类型。
  • MySQL 命名不区分大小写,字段名必须使用小写字母。
  • 字段名应使用下划线分割,字段一旦定义,不能轻易修改。

表名约束

  • 不能使用 SQL 关键字作为表名。
  • 表名不能使用复数形式。

索引命名约束

  • 主键通常以 pk_xxx 开头。
  • 唯一键通常以 uk_xxx 开头。
  • 普通索引通常以 idx_xxx 开头。

字段类型约束

  • 小数类型禁止使用 floatdouble,以防丢失精度。

    • 数据非常小的情况下,可以使用 char 类型(定长),而非 varchar(变长)。
    • 对于非常长的文本,直接使用 text 类型。

表定义规范

  • 表中必须定义以下字段:idcreate_timeupdate_time

    • id 必须为主键,类型应为无符号自增的 bigint 类型,不能定义为 int,除非是分布式 ID。
    • create_timeupdate_time 字段类型应为 datetime
  • 每个表的数据行数不超过 500 万行,如果数据量非常大,建议进行分表。

索引规范

索引约束

  • 有唯一特性的字段应设置唯一索引。
  • 在实际开发中,不建议进行超过两个表的查询。
  • 多表查询时,关联字段应有索引。
  • 页面上的搜索避免使用左模糊(LIKE '%xxx')或全模糊查询(LIKE '%xxx%'),因为这会导致索引失效。可以考虑将搜索交给搜索引擎来处理。
  • 对于 varchar 类型的字段,建立索引时要根据字段的长度进行考虑,不一定所有 varchar 字段都需要建立索引。

SQL 开发约束

  • 不要使用 COUNT(xxx, xxx) 来代替 COUNT(*),因为在存在 NULL 的情况下,COUNT(xxx, xxx) 无法正确统计。
  • 避免使用外键和级联操作,所有的外键关系和级联处理应在应用层解决。
  • 不要使用存储过程。
  • 在进行删除或更新操作时,务必先进行查询,确保数据存在后再进行操作。
  • 尽量避免使用子查询中的 IN 操作,能够避免时尽量避免。

其他约束

  • 使用 ORM 框架时,避免使用 SELECT *。应该明确列出需要查询的字段,以提高性能。
  • POJO 类的 boolean 类型字段不能加 is 前缀,数据库中的字段应加 is_ 前缀。这是 Java Bean 规范(Introspector)的问题:

    • Java 编译器自动生成的 getter 方法会导致问题,例如:public boolean isIsActive(); 是错误的。
    • 通过框架(如 MyBatis、Spring、Jackson)时可能会出现找不到 getIsActive()isActive() 的问题,导致序列化、反射或 ORM 映射失败。

@Transactional 使用约束

  • 不要滥用 @Transactional 注解,过度使用可能会影响数据库的 QPS(每秒查询次数)。