关系等级存储问题

现有用户1、2、3、4、5
1->2->3
2->4
4->5
目前邀请关系不是很大,可以通过mysql解决,随着业务的增长用户达到了100w,
查询2的所有下级(包括下级的下级….),怎么高效的查询出来。
为了以后得业务需求,比如2的下级4,有可能变成跟2平级,有可能是2的上级,设计要满足这种奇怪现象,为了后面统计数据,可以根据id查询上级、下级、关系等级为2的这种复杂查询,大家有什么好的建议或者办法,可以谈讨下

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 27

当技术没办法解决可以考虑变更业务逻辑。还有你这个需求就很不明确。下级和上级平级或者高这个本身就矛盾

6个月前 评论
ononl (作者) 6个月前
徵羽宫 6个月前
mmxhn1258 (楼主) 6个月前
sanders

可能需要确认一下需求,我从以下几点帮楼主分析下:

这点包括对读写效率要求,楼上提供的各种方案几乎都是基于关系型数据库的,除了递归方案以外,都是通过确保读效率降低写的方案。当然,如果楼主的业务场景对写入效率不敏感,自然用以上方案即可。

另外可以换个角度来分析楼主的需求,推荐关系既然是分上下级的,是否存在级数限制?如果存在级数限制且是个位数的话,完全可以通过快照所有上级ID的方式来存储和查询。

如果读写效率都敏感,且要达到真正的无限分级,我建议不如抛开关系型数据库的限制使用类似 Neo4j 这样的图数据库专门解决此类问题。

6个月前 评论

等级无限?还有关系等级为2 是啥意思,感觉主要问题还是因为可以变为上级导致数据上不好处理

6个月前 评论
mmxhn1258 (楼主) 6个月前
mmxhn1258 (楼主) 6个月前
小猪蹄子 (作者) 6个月前
小猪蹄子 (作者) 6个月前

使用Nestedset,搜索一下就有,上面发的那个教程居然还付费,多少有点侮辱人了

6个月前 评论
徵羽宫 6个月前
ononl 6个月前
徵羽宫 6个月前
ononl 6个月前
徵羽宫 6个月前
徵羽宫 6个月前
ononl 6个月前
DogLoML 5个月前
陈先生
ID PID LEVEL
2 1 1
3 2 1
3 1 2
4 3 1
4 2 2
4 1 3
6个月前 评论

这种数据结构相当于多叉树,用『树查询』思路解决: 在原有表结构中增加一列 path,为路径,通过 like 单边查询实现查到所有级联下级。

id 编号 路径
1 1 A .1.
2 2 B .1.2.
3 3 C .1.2.3.
4 4 D .1.2.4.
5 5 E .1.2.4.5.
6 6 F .1.2.3.6.
7 7 G .1.2.3.6.7

查所有 C 的下级(含 C,要排除 C 再加条件 id != 3)

select * from table_name where path like ".1.2.3.%"

查所有 E 的上级,把『路径』split 一下就好了

6个月前 评论

“2 的下级 4,有可能变成跟 2 平级,有可能是 2 的上级”

是否会存在多次关联,例如4的父级是2,是否会关联到另外一个2?如果不会关联的话,平级变更,只需要解除2和4的关联关系,把4的level变为2就行。

如果4变为了2的平级,那么4下面的关联的子级是否会变更level?例如,从4变为了level2,那么4关联的5,它的level还是5吗?那么关联的level岂不是就成了level2-关联-level5了?

如果是4变为了2的上级,那么4之前关联的子关系又如何处理?还是说不区分层级(level),只要是子级就行?

6个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!