关系等级存储问题

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 27

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

1年前 评论
ononl (作者) 1年前
徵羽宫 1年前
mmxhn1258 (楼主) 1年前
sanders

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

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

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

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

1年前 评论

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

1年前 评论
mmxhn1258 (楼主) 1年前
mmxhn1258 (楼主) 1年前
小猪蹄子 (作者) 1年前
小猪蹄子 (作者) 1年前

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

1年前 评论
徵羽宫 1年前
ononl 1年前
徵羽宫 1年前
ononl 1年前
徵羽宫 1年前
徵羽宫 1年前
ononl 1年前
DogLoML 1年前
ID PID LEVEL
2 1 1
3 2 1
3 1 2
4 3 1
4 2 2
4 1 3
1年前 评论

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

1年前 评论

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

1年前 评论

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