关系等级存储问题

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 27

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

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

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

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

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

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

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

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

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年前 评论

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