You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关系型数据库关注模型SQL设计及高效回关状态查询方案

高效实现粉丝列表回关状态标识的方案

场景回顾

我们有一张仅包含UserId(关注者ID)和FollowedId(被关注者ID)的Followers表,现在需要查询用户100的粉丝列表时,新增DoIFollowBack字段,用来标识用户100是否回关了该粉丝。

两种方案对比分析

方案一:新增字段存储双向关系

  • 操作方式:给Followers表加一个IsMutual(是否互关)字段,当A关注B且B也关注A时,把两条记录的IsMutual设为1;只要有一方取消关注,就把对应记录的IsMutual设为0。
  • 利弊:
    • 好处:查询时直接读字段,不用额外计算,速度快。
    • 弊端:维护成本极高,每次新增、取消关注都要同步更新两条记录的状态,很容易出现数据不一致(比如网络波动导致更新失败,一条改了另一条没改),后期排查修复麻烦。

方案二:单SQL关联查询实时判断

  • 操作方式:不用改表结构,直接通过左关联自身表的方式,在查询粉丝列表时实时判断回关状态,SQL示例:
SELECT 
    f1.UserId AS FollowerId,
    CASE WHEN f2.FollowedId IS NOT NULL THEN 1 ELSE 0 END AS DoIFollowBack
FROM Followers f1
LEFT JOIN Followers f2 
    ON f1.UserId = f2.FollowedId 
    AND f2.UserId = 100
WHERE f1.FollowedId = 100;
  • 利弊:
    • 好处:不用改表,不用维护额外字段,数据天然一致(完全基于原始关注关系判断),逻辑简单。
    • 弊端:查询时需要关联表,但只要给Followers表建立两个联合索引:(FollowedId, UserId)和(UserId, FollowedId),关联查询的性能会非常高,几乎可以忽略开销。

最终结论

优先选方案二,也就是单SQL关联查询的方式。

  • 方案一的一致性问题是硬伤,后期维护会头疼;
  • 方案二只要建好索引,查询效率和方案一没差别,还能省掉大量维护工作,代码逻辑也更清晰。

内容的提问来源于stack exchange,提问作者normativepcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:05:20