导航
导航

关系表修改操作的一种思路

对于关系表的修改操作,先提下何为关联表,在数据表设计中,多对多关系中间会定义一张关联表。
我用项目中产品为例,
产品: 电商通产品、企业通产品 …
产品策略: 等额本息、等额本金、先息后本…
产品与产品策略之间 比如product_strategy_rel表相关联

在产品或者产品策略的cud操作时候会修改该表,
之前我的做法(也是身边人做法)不管对于新增还是修改操作,查询关系表相关数据后全部删除,再根据最新的全部添加。逻辑简单,简单粗暴。

伪代码:
delete from table_rel where id = 1;
insert into table_rel (id、value) values (1, 1), (1, 2), (1, 3);

在某些条件下是可接受的,比如,新增的数据跟原有数据没有大量的重复。但是如果出现大量的重复数据只是一小部分的更改就得不偿失了。
最近重新审视了一下这个野蛮的做法,试着能不能优化它呢

我的解决如下,当然前提是数据量不是很大的情况下,基于集合的内存操作,用空间换时间

public static void main(String[] args) {

//新增数据
List<Integer> listAdd = new ArrayList<Integer>();
listAdd.add(1);
listAdd.add(2);
listAdd.add(3);
listAdd.add(4);

//copy新增数据
List<Integer> listAddCopy = new ArrayList<Integer>();
listAddCopy.addAll(listAdd);

//原存在数据
List<Integer> list = new ArrayList<Integer>();
list.add(2);
list.add(3);
list.add(4);
list.add(5);

// 交集
listAddCopy.retainAll(list);
if(CollectionUtils.isNotEmpty(listAddCopy)){
listAdd.removeAll(listAddCopy);
list.removeAll(listAddCopy);
System.out.println(listAddCopy);
}
//需新增数据
System.out.println(listAdd);
//需删除数据
System.out.println(list);
}

结果如下:
[1]
[5]

这样对于listAdd的数据进行新增操作
对于list的数据进行删除操作,避免了全删再新增。