一对多业务关系分页查询:如何高效地用多端作为查询条件并实现分页显示?
一对多业务关系分页查询,多端作为查询条件
业务关系为一对多时,多端可以作为查询条件并分页显示,下面提供两种设计思路:
方法一
使用两张表,一张存储用户信息,另一张存储对应标签:
-
user表:
| user_id | name | |---------|------| | 1 | 小明 | | 2 | 小李 | | 3 | 小张 |
-
tag表:
| tag_id | user_id | tag | |---------|---------|-------| | 1 | 1 | 活泼 | | 2 | 1 | 可爱 | | 3 | 2 | 活泼 | | 4 | 3 | 可爱 |
此方法存在如下问题:
- 以stream流对name进行分组,性能会因数据量增大而下降。
- 若以tag作为查询条件,会漏掉其他相关tag。
方法二
采用单表设计,将标签信息存储在同一列中:
-
user表:
| user_id | name | tags | |---------|------------|--------------| | 1 | 小明 | 活泼, 可爱 | | 2 | 小李 | 活泼 | | 3 | 小张 | 可爱 |
此方法可以解决上述问题:
- 单表查询避免了流分组的性能开销。
- 使用exists子查询可以准确筛选满足查询条件的数据。
分页查询sql:
select *, (select group_concat(tag) from tag where user_id = user.id and tag = '活泼') as tags from user where exists(select 1 from tag where user_id = user.id and tag = '活泼' limit 1) limit 0, 10;
最终结果:
| user_id | name | tags | |---------|------------|--------------| | 1 | 小明 | 活泼, 可爱 |
以上就是一对多业务关系分页查询:如何高效地用多端作为查询条件并实现分页显示?的详细内容,更多请关注其它相关文章!