校验规则分类:格式校验、范围校验、存在性校验、唯一性校验、业务逻辑校验

数据校验这件事,说白了就是给数据进门设几道关卡。我做了十几年数据治理,见过太多系统因为校验规则没设计好,上线后数据一团糟。今天咱们就把这五类规则掰开揉碎讲清楚。

你想想看,一个数据从录入到存储,要经过多少道检查?我习惯把这五类规则看作一个漏斗——从最基础的格式检查,到最复杂的业务逻辑验证,层层过滤。

核心观点:校验规则不是越多越好,而是要在正确的位置放正确的规则。少一道可能漏脏数据,多一道可能影响性能。

1. 格式校验

格式校验是最基础的检查。它只关心数据长什么样,不关心数据有没有意义。

举个例子,手机号字段。你要求用户输入11位数字,结果人家填了"138-1234-5678"或者"13812345678abc"。格式校验就是干这个的——把不符合模板的数据挡在门外。

常见的格式校验手段:

  • 正则表达式——最灵活,但写起来容易出错。我建议团队维护一个正则库,别让每个人自己造轮子
  • 固定长度/范围长度——比如身份证号18位,银行卡号16-19位
  • 字符集限制——只允许数字、只允许字母、不允许特殊字符
  • 枚举值匹配——性别只能是"男""女""未知",状态只能是"启用""禁用"
我的经验:格式校验一定要放在最前面做。我曾经接手过一个项目,业务逻辑校验跑了一大堆,结果发现原始数据连基本格式都不对——白白浪费了计算资源。

2. 范围校验

范围校验检查的是数据是否在合理区间内。格式对了,但值不对,照样要拦下来。

比如年龄字段,格式上是个正整数,但填了200岁——这明显不合理。范围校验就是干这个的。

范围校验分几种:

类型 说明 示例
数值范围 最小值~最大值 年龄 0~150,价格 ≥ 0
日期范围 不能早于/晚于某个日期 出生日期不能晚于今天
长度范围 字符串长度限制 用户名 2~20 个字符
集合范围 值必须在指定集合内 省份必须在行政区划代码表中
注意:范围校验的边界值最容易出问题。我曾经遇到过一个案例,系统要求"金额大于0",结果前端传了0.00——系统没拦住,导致后续计算全错了。记住,边界值要单独测试。

3. 存在性校验

存在性校验,说白了就是检查这个数据有没有。空值、null、空字符串,统统要处理。

但这里有个坑——"空"的定义在不同场景下不一样。用户注册时,手机号不能为空;但用户修改个人资料时,手机号可以不填。所以存在性校验一定要结合业务场景来设计。

我习惯把存在性校验分成三个级别:

  • 强制存在——必填项,没有就不能继续。比如订单中的商品ID
  • 条件存在——某些条件下必填。比如选择了"其他"选项,备注字段就必须填
  • 可选存在——填了更好,不填也行。比如用户的头像
避坑指南:我曾经在项目中遇到一个bug——用户填了空格,系统认为"非空"就放行了。后来我们统一做了trim处理,并且把纯空格视为空值。这个细节很多人会忽略。

4. 唯一性校验

唯一性校验确保某个字段或字段组合的值在数据集里不重复。最常见的例子就是用户名、身份证号、订单号。

唯一性校验的实现方式:

  • 数据库唯一索引——最可靠,但报错信息不友好
  • 应用层查询——可以给出友好的提示,但存在并发问题
  • 分布式锁+唯一索引——高并发场景下的最佳实践

这里有个经典问题:唯一性校验应该在应用层做还是数据库层做?我的建议是——两层都做。应用层做是为了用户体验,数据库层做是为了数据安全。

并发陷阱:两个请求同时注册同一个用户名,应用层查询都返回"不存在",然后同时插入——结果数据库唯一索引报错。这就是典型的"检查-插入"竞态问题。解决方案是加分布式锁,或者直接用数据库的唯一索引兜底。

5. 业务逻辑校验

业务逻辑校验是最复杂的一类。它不只看单个字段,还要看字段之间的关系,甚至要结合外部数据来判断。

举个例子:请假申请。格式校验看日期格式对不对,范围校验看日期是否在合理范围内,存在性校验看必填项有没有填,唯一性校验看申请编号有没有重复——但业务逻辑校验要检查的是:请假天数是否超过年假余额、是否与已有请假日期冲突、审批人是否有权限审批。

业务逻辑校验的常见场景:

  • 字段间约束——结束日期不能早于开始日期
  • 状态流转校验——已取消的订单不能发货
  • 权限校验——普通员工不能给自己审批
  • 外部依赖校验——下单时检查库存是否充足
  • 计算规则校验——订单总金额 = 商品金额 + 运费 - 优惠
我的建议:业务逻辑校验最容易变,也最容易出bug。我习惯把业务校验规则做成可配置的,而不是硬编码在代码里。这样业务变了,改配置就行,不用改代码。

五类校验规则的关系

这五类规则不是孤立的,它们之间有明确的执行顺序。我画了一张图来说明:

数据校验规则执行流程 原始数据 第1层:格式校验 正则、长度、字符集、枚举 第2层:范围校验 数值区间、日期范围、长度限制 第3层:存在性校验 必填项、条件必填、空值处理 第4层:唯一性校验 单字段唯一、组合唯一、并发控制 第5层:业务逻辑校验 字段间约束、状态流转、权限、外部依赖 执行原则 逐层过滤 前置规则优先 失败即阻断

从这张图能看出来,校验规则是层层递进的。格式不对,后面的校验根本没必要跑。我见过有些团队把业务逻辑校验写在最前面,结果格式错误的数据把业务逻辑搞崩溃了——这就是典型的顺序搞反了。

总结一下:设计校验规则时,先想清楚这个数据要过几道关,每道关用什么规则,顺序怎么排。我个人的习惯是:先格式、再范围、再存在性、再唯一性、最后业务逻辑。这个顺序用了十几年,没出过大问题。