联表查询还是单表查询?

conhaifeng 发布于 2016/05/28 17:45
阅读 412
收藏 2

项目中经常遇到某个信息类中包含多个表数据的情况。

比如,TaskInfo中包含Task的详细信息,以及发布Task的用户User信息,当查询符合条件的Task列表时,应

该如何获取TaskInfo?

我想到的解决办法:

1. 单表多次查询。即,先获取所有符合条件的Task信息,再根据Task中的userId去数据库中查询User信息,

组合成TaskInfo。缺点:查询次数过多。 优点:单表查询缓存效率高

2.联表查询。即,直接使用连表查询,一次性将task和user的信息查询出来。优点:查询只一次。缺点:扩

展性差,缓存效率低

3.将userName等需要的字段同时存在Task表中,如此只查询Task表即可,不需要再查询User表。优点:

查询方便。 缺点:当用户UserName修改之后,改动的表有点多。

不知大家如何抉择?


加载中
0
ZeRur
ZeRur
单表查 另一个提供列表查询接口
ZeRur
ZeRur
回复 @conhaifeng : 拿着第一次查询的taskList里的所有task的id 去查一个user列表出来 内存拼起来
conhaifeng
conhaifeng
另一个提供列表查询接口 ---- 啥意思?
1
tomczhen
tomczhen

其实三种方式都行,具体要看实际业务情况。

这里看task和user的话,2个表通常是必须了,方便以后对task数据进行分离冷热数据,做分区或分表。

第二种方式属于范式要求,OLTP高写情况下按范式要求可以减少写入量。

对于高读环境,可以使用第一或者第三种方法。
第一种方式其实是有考虑缓存设计的情况,高读对象是task,第三种则是高读对象是user+task(通常是报表分析)。

另外,在数据量没有达到阀值的情况下,其实无论那种方式都是可以的,有的业务也许永远都不会到达这个阀值。

conhaifeng
conhaifeng
恩。回答好专业! 系统目前可预见的业务量也就几千到几万的级别,所以远达不到阈值
0
tywali
tywali
联表查询,简单明了
0
楼宇
user信息修改频率小,可以考虑做redis(假设缓存用redis,也可以考虑其他的)缓存,如果想要减轻redis负担或者速度更快,可以考虑实现本地缓存
conhaifeng
conhaifeng
恩。User表是要做缓存的。
0
LucEsape
LucEsape
单表查询,不要考虑sql查询带来的性能消耗,用了缓存后,性能不是什么问题。反而用联表查询,会给后期的扩展和维护带来巨大工作量,简单的说dao层的接口的复用率就会大大降低,缓存处理也更为棘手。
LucEsape
LucEsape
回复 @conhaifeng : 嗯,有时候代码方式有多种,关键是要找你的核心扩展能力
conhaifeng
conhaifeng
是的,在设计User管理这部分时,就实现过联表查询,就遇到了接口复用率的问题,后来就废弃掉了。
返回顶部
顶部