ruby on rails 处理自关联的查询问题

自关联的查询方式
比如 users表 用 id 和 recommend_user_id做一个自关联的关系

users表 字段 id 、父级ID: recommend_user_id

1.Postgresql查询方式
2.添加索引
3.添加缓存
4.异步处理数据

如果数据量比较大,那么对于这种递归查询,很容易出现性能问题。
此时,可以考虑使用一些高级数据库或者工具来优化查询。

一种可能的解决方案是使用递归CTE(Common Table Expressions),这是一种高级的SQL技术,可用于递归查询。在PostgreSQL中,使用WITH RECURSIVE关键字和递归CTE来实现递归查询。这种方式可以减少查询次数,提高查询效率。以下是示例SQL语句:

WITH RECURSIVE recommended_users(recommend_user_id, user_id) AS (
  SELECT recommend_user_id, user_id FROM users WHERE user_id = 1
  UNION ALL
  SELECT users.recommend_user_id, recommended_users.user_id FROM recommended_users
  INNER JOIN users ON users.user_id = recommended_users.recommend_user_id
)
SELECT recommend_user_id FROM recommended_users;

该查询将返回所有与用户1相关的推荐用户的ID。

如果数据量非常大,这个方案仍然会影响性能。不过可以尝试在数据库中添加索引来加快查询速度,或者考虑使用缓存来优化查询。另外,如果这个查询是在后台执行的,也可以将其放入后台任务中,使用异步方式执行,避免阻塞主线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值