库表字段约束规范
字段名约束
is_xxx
字段应设置为unsigned tinyint
类型。- MySQL 命名不区分大小写,字段名必须使用小写字母。
- 字段名应使用下划线分割,字段一旦定义,不能轻易修改。
表名约束
- 不能使用 SQL 关键字作为表名。
- 表名不能使用复数形式。
索引命名约束
- 主键通常以
pk_xxx
开头。 - 唯一键通常以
uk_xxx
开头。 - 普通索引通常以
idx_xxx
开头。
字段类型约束
小数类型禁止使用
float
和double
,以防丢失精度。- 数据非常小的情况下,可以使用
char
类型(定长),而非varchar
(变长)。 - 对于非常长的文本,直接使用
text
类型。
- 数据非常小的情况下,可以使用
表定义规范
表中必须定义以下字段:
id
、create_time
、update_time
。id
必须为主键,类型应为无符号自增的bigint
类型,不能定义为int
,除非是分布式 ID。create_time
和update_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 映射失败。
- Java 编译器自动生成的
@Transactional 使用约束
- 不要滥用
@Transactional
注解,过度使用可能会影响数据库的 QPS(每秒查询次数)。