关系等级存储问题

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 27

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

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

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

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

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

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

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

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

5个月前 评论

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

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

这种数据结构相当于多叉树,用『树查询』思路解决: 在原有表结构中增加一列 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 一下就好了

5个月前 评论

“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),只要是子级就行?

5个月前 评论

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