如何正确关联原表并独立存储各字段的校验结果?
实现方案
1. 先规范原有业务表
首先你的业务表必须保留全局唯一主键,用来做跨表关联,参考建表语句(以MySQL为例):
CREATE TABLE `biz_user` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '业务主键', `age` INT DEFAULT NULL COMMENT '年龄', `name` VARCHAR(64) DEFAULT NULL COMMENT '姓名', `country` VARCHAR(32) DEFAULT NULL COMMENT '国家', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务主表';
你给出的样例里id=1的那条数据,就存在这张表中。
2. 校验结果表结构设计
你给出的预期结果表缺少核心关联字段,仅存字段值、校验结果、校验规则名的话,后续根本没法追溯这条校验结果对应哪条业务数据,重名、同年龄的记录会完全混乱。
正确的校验结果表需要包含关联字段、追溯字段,参考建表语句:
CREATE TABLE `field_validate_result` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '校验结果自增主键', `biz_id` BIGINT UNSIGNED NOT NULL COMMENT '关联业务表主键ID', `field_name` VARCHAR(32) NOT NULL COMMENT '被校验的字段名,比如age/name', `field_value` TEXT COMMENT '校验时的字段值快照,对应你样例里的Field列内容', `valid` TINYINT(1) NOT NULL COMMENT '校验结果:1=通过,0=不通过', `validator` VARCHAR(64) NOT NULL COMMENT '校验规则标识,比如Moreequal18/IsName', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '校验执行时间', PRIMARY KEY (`id`), KEY `idx_biz_id` (`biz_id`), KEY `idx_valid` (`valid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字段校验结果表';
字段说明:
- biz_id是和业务表关联的核心字段,绝对不能少
- field_name用来标记当前校验的是业务表的哪一列,避免同值不同字段的混淆
- field_value是可选的快照字段,如果需要保留校验当时的字段值就加,不需要的话后续查询可以直接关联业务表取实时值
- 如果需要存校验失败的具体原因,可以额外加
error_msg字段存错误提示
3. 表间关联规则
- 两张表是1对N的关系:1条业务表记录,对应N条校验结果(N等于该条记录被校验的字段数量)
- 关联逻辑通过
field_validate_result.biz_id = biz_user.id实现,并发写入量不高的场景可以加外键约束保证数据一致性,高并发场景建议去掉外键,靠代码层保证关联正确性 - 如果需要保留多次校验的历史记录,直接追加写入即可;如果只需要最新一次校验结果,可以每次校验前先删除对应biz_id的历史校验数据,或者加
is_latest字段标记最新记录。
4. 对应你样例的写入效果
针对你给出的id=1的业务数据,校验结果表写入的内容如下:
| biz_id | field_name | field_value | valid | validator |
|---|---|---|---|---|
| 1 | age | 18 | 1 | Moreequal18 |
| 1 | name | Olya | 1 | IsName |
| 1 | country | Moldo | 1 | IsValidCountry |
注意:绝对不要用field_value(也就是你样例里的18、Olya这类字段值)作为两表关联的依据,字段值可重复、可修改,完全不具备唯一性,关联会100%出问题。
额外规范建议
- validator字段建议统一维护枚举常量,不要随意写入字符串,避免同一个校验规则出现多种命名(比如同时出现More18、Moreequal18这类重复定义)
- 单表数据量超过千万级的话,可以按biz_id做分表,或者按校验时间做归档
- 如果需要区分不同批次的校验,可以加
batch_no字段标记同一次校验任务的所有结果。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

