一对多业务关系分页查询:如何高效地用多端作为查询条件并实现分页显示?

一对多业务关系分页查询:如何高效地用多端作为查询条件并实现分页显示?

一对多业务关系分页查询,多端作为查询条件

业务关系为一对多时,多端可以作为查询条件并分页显示,下面提供两种设计思路:

方法一

使用两张表,一张存储用户信息,另一张存储对应标签:

  • 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       | 小明       | 活泼, 可爱  |

以上就是一对多业务关系分页查询:如何高效地用多端作为查询条件并实现分页显示?的详细内容,更多请关注其它相关文章!