1. 背景
针对数据的 增加、删除、修改 操作,前端在页面进行逻辑操作,直到保存时才去发起请求,将数据传到后台去处理(节省了请求次数和接口的定义量)。
在这种背景下,如何界定入参数据对应的操作类型成为了一个需要考虑的点。设计了几种方案如下,可在不同的场景下参考使用。
2. 方法
public class SourceRule {
private Long id; // 主键 id
private Long uid; // 用户 id
private Integer aaa;
private Long bbb;
private Integer ccc;
}
数据实体例如上所示,根据不同的 uid 可以查找到此账户下的所有记录
2.1 批量删除、批量添加 —— 简单粗暴(适合数据量少的情况,效率一般)
步骤:
- 直接根据某一特殊的字段,例如用户uid等,删除此字段下的所有数据,然后再把前端请求传来的数据批量插入。
优点:
- 处理逻辑简单,前后端均不需要做特殊的处理。
缺点:
- 后端对前端传来的数据进行 stream 过滤,分别取出有 ID 和没 ID 的数据集合。
- 获取数据库中某用户uid 下的所有数据,拿每一条元素(database)与有 ID 数据集合的每一条元素(request)进行遍历。
- 交集(两个集合中都有,也可以进一步根据其它字段是否向相同判断是 update 还是 不操作):修改 | 不操作。
- 差集(数据库中有,请求参数的集合中没有):删除。
- 没有 ID 的集合直接处理:代表为新增的数据,直接插入表中即可(若考虑唯一索引不能重复的问题,最好先删除,放到最后再添加)。
优点:
- 操作的数据量较少,一定程度效率略高。
缺点:
- 后端逻辑复杂。
- 比对操作需要两层循环,定义有 ID 的数据集合 size 为 m,库中所有与某 uid 相关的数据为 n 时间复杂度为 O(m * n),效率仍与数据量挂钩明显。
2.3 ID判断 + 前端局部分类 —— 前后均分难度(效率高)
步骤:
- 前端将逻辑删除的数据存在一个自定义的 deleteDateList 对象中,然后请求时除了表格/列表中的数据外,同样携带这个 deleteDateList 对象。
- 后端对前端传来的列表数据进行 stream 过滤,分别取出有 ID 和没 ID 的数据集合。
- 处理集合数据:
- 有 ID:修改 | 不操作
- 没 ID:新增
- deleteDateList:删除
优点:
- 前后端各自做一些处理和判断,难度均分,改动的数据量也少,效率高。
缺点:
- 前端将逻辑增加、删除、修改的数据,分类存储 addDateList、deleteDateList、updateDateList中,
- 后端直接处理集合数据:
- addDateList:新增
- deleteDateList:删除
- updateDateList:修改
优点:
- 改动的数据量少,后端工作量会简单一些。
缺点:
- 前端分类处理复杂。