关于开发中单表查和连表查的取舍

  关于开发中单表查询和连接查询怎么取舍?连表配合索引一次查询就可以出来,单表的话可能需要 n 次读取数据库。

处理策略

  能单表就单表,尽量不要连表,不光有开销,连表后复用性降低,系统复杂性会增加。而且数据库做关联是很耗性能的。把连表查拆分成两次查询也是基于查出结果的 idList 去查另一张表,开销很小,查询出的结果可以做一次merge组合。

通用的 merge 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* @author wave
* @create 2018-06-20 11:24
**/
public class MergeUtil {

/**
* 把 sourceList 的一些属性合并到 targetList 中
* 基于 testFunction 的条件,合入逻辑实现为 biConsumer
* @param targetList
* @param sourceList
* @param testFunction
* @param biConsumer
* @param <T>
* @param <S>
*/
public static <T, S> void merge(List<T> targetList, List<S> sourceList,
BiFunction<? super T, ? super S,Boolean> testFunction,
BiConsumer<? super T, ? super S> biConsumer) {
targetList.forEach((t)->{
Optional<S> optional = sourceList.stream().filter(s -> testFunction.apply(t,s)).findFirst();
if (optional.isPresent()) {
biConsumer.accept(t,optional.get());
}
});
}
}

调用方式

1
2
3
4
5
6
7
/**
* 基于两个 list 的 id 做关联, 将 name 属性 merge 到目标 list
*
**/
MergeUtil.merge(targetList,sourceList,
(target,source)->target.id().equals(source.id()),
(target,source)->target.setName(source.getName));

Reference:

  • 梁桂钊的知识星球 –「服务端思维」
-------------本文结束感谢您的阅读-------------
Thank you for your encouragement