很久没写博文了,这段时间比较忙,部门内很多基础环境在搭建同时新系统也在同步开发中。今天在做业务开发的时候遇到个问题,申请材料由多个内容块组成,有的内容块已在其他申请时审核通过,如何让审核系统知道这部分已经被审核,以减少对这部分内容块的检查力度。
问题
起初,我们设计申请表时,通过在该表内添加外键字段和其他表中记录进行关联,形成一条完整的申请记录。这样设计时存在个问题,当关联表内的记录更改后,申请表内关联该记录的申请内容也会跟着改变,这样用户在查询历史申请记录时看不到当时的申请状态。
如何解决
针对这一问题,可以通过快照的方式来解决。以前一直听到快照,特别是电商系统内,但是一直不明白是什么意思怎么操作,今天和老大交流了一下有种茅塞顿开的感觉。
快照顾名思义就是将当时的状态以镜像的方式复制一份,让我来举个例子。
现在有两张表,申请表和材料表,申请表中的材料表ID和材料表中的材料表ID进行关联。有两条申请记录都和材料表中的材料1记录相关联,如果在两次申请时材料1内容有改变,当时的申请状态就不会保留。
申请表ID | 材料1 | 材料2 | 材料表ID |
---|---|---|---|
1 | 申请材料内容11 | 申请材料内容12 | 材料1 |
2 | 申请材料内容21 | 申请材料内容22 | 材料2 |
3 | 申请材料内容31 | 申请材料内容32 | 材料1 |
材料表ID | 内容1 | 内容2 |
---|---|---|
材料1 | 内容11 | 内容12 |
材料2 | 内容21 | 内容22 |
现在添加一张快照表,表结构和原表相似,但是最主要的时添加来几个字段
材料表ID | 内容1 | 内容2 | 申请表ID | 是否被审核通过 | HashCode |
---|---|---|---|---|---|
材料1 | 内容11 | 内容12 | 1 | 0 | xxxx |
材料2 | 内容21 | 内容22 | 2 | 0 | yyyy |
材料1 | 内容11 | 内容12 | 3 | 0 | xxxx |
通过这张表,我们可以看到快照表内容。其实快照表内容就是根据申请表内的材料表ID字段,通过一定规则运算,生成一条记录。那规则运算是什么呢?
规则运算
申请表ID | 材料1 | 材料2 | 材料表ID |
---|---|---|---|
1 | 申请材料内容11 | 申请材料内容12 | 材料1 |
2 | 申请材料内容21 | 申请材料内容22 | 材料2 |
3 | 申请材料内容31 | 申请材料内容32 | 材料1 |
4 | 申请材料内容41 | 申请材料内容42 | 材料1 |
当有一条新记录(如:申请表ID为4)插入到申请表中,申请表通过材料表ID去材料表内查找对应的记录(如:材料1),然后计算此时该记录的HashCode。根据该HashCode和是否被审核通过来查找快照表:
如果查找到记录(记为D1),则向快照表插入一条新记录,记录内容同D1,只是将申请表ID至为4;
如果没查找到记录,则向快照表中插入查找到的材料表的内容(如:材料1),并将申请表ID至为4。
申请表ID | 材料1 | 材料2 | 材料表ID |
---|---|---|---|
1 | 申请材料内容11 | 申请材料内容12 | 材料1 |
2 | 申请材料内容21 | 申请材料内容22 | 材料2 |
3 | 申请材料内容31 | 申请材料内容32 | 材料1 |
4 | 申请材料内容41 | 申请材料内容42 | 材料1 |
材料表ID | 内容1 | 内容2 | 申请表ID | 是否被审核通过 | HashCode |
---|---|---|---|---|---|
材料1 | 内容11 | 内容12 | 1 | 0 | xxxx |
材料2 | 内容21 | 内容22 | 2 | 0 | yyyy |
材料1 | 内容11 | 内容121 | 3 | 1 | zzzz |
材料1 | 内容11 | 内容121 | 4 | 1 | zzzz |
通过是否被审核通过这个flage,审核系统就很容易知道哪些内容已被审核过,哪些没有。
如何组成申请状态
申请表和材料表不再是根据材料表ID进行关联,而是通过材料快照表中申请表ID进行关联,通过它来构成一条完整的申请记录,当然该申请记录也就是记录当时的申请状态。