收藏功能对应的源业务数据删除了,表里脏数据了(对应业务 id 字段)?!
一、前言
因此,本篇文章将围绕处理收藏表中脏数据的问题进行。
二、需求分析
我们看到问题的起因,是业务数据删除后,导致收藏记录出现的脏数据。
那么,
- 在删除业务数据的同时,也对收藏记录进行删除。
- 定时任务,按指定时间(定时/日/月)进行检查收藏表的数据是否对应已被删除。(即定时检查删除)
- 在查询收藏表数据的同时,根据业务id 检查对应业务数据是否存在,不存在就对该收藏数据删除。
- ...(其他暂未想到,欢迎各位大佬可以评论区替之补充~ )
三、设计方案(少代码,多思路)
公共部分(根据业务 id 删除收藏记录)
它们公共部分都是需要根据业务 id 去删除对应的收藏记录表(因为业务被删除了,所有收藏了该业务的用户,都会出现脏数据)
简单的 mysql 和 java
DELETE FROM t_collect WHERE FIND_IN_SET('business_id','business_id_01,business_id_02');
public int deleteByBusinessIds(String businessId) {
QueryWrapper<Favorites> queryWrapper = new QueryWrapper<>();
queryWrapper.apply("FIND_IN_SET(business_id, {0})", businessId);
return collectMapper.delete(queryWrapper);
}
(一)删除业务同时删除收藏记录
这个思路就是很简单了,在删除业务逻辑中,都加上公共部分的删除逻辑即可。(这个在几十个业务的情况下,是不理想的,因为所有业务都得加上。)
(二)定时检查进行删除
这个也很好理解,顾名思义;写个定时任务,根据收藏表的记录去查询原业务数据不存在进行删除该收藏记录。(不理想,收藏记录多起来是存在问题的。)
(三)查询收藏同时检查并删除不存在对应业务的数据
在查询出,用户对应的收藏记录数据的同时,多加一步进行查询对应的数据业务;不存在即进行删除。(比较理想,不存在过多处理)
四、总结
序号 | 方法 | 优点 | 缺点 | 整体 |
---|---|---|---|---|
① | 删除业务同时删除收藏记录 | 业务较少优势还是有的 | 给涉及的业务,添加处理,业务和功能分离不够明确 | 业务过多不理想 |
② | 定时检查进行删除 | 算是一个解决方案,但建议性不大; | 数据过多会存在时间过长,重复性功能处理也过多 | 数据过多(收藏用户过多)不理想 |
③ | 查询收藏同时检查并删除不存在对应业务的数据 | 业务和功能分离明确,不易受影响 | 仅在查询过程中删除 | 理想 |
文章小尾巴
转载自:https://juejin.cn/post/7282150745163989048