无限级别分佣模式设计

2018-10-27 03:10:14 +08:00
 rootx
A 邀请了 B C

B 邀请了 D E
C 邀请了 F G

D 邀请了 1 2
E 邀请了 3 4
F 邀请了 5 6
G 邀请了 7 8

当前 A 是团长 BCDEFG12345678 均为会员 因为他们都是 A 这条线带出来的 他们的消费 A 都可以获得佣金

突然 B 升级成为了团长 则需要把 B 这条线带出来的用户都找出来并归给 B:DE1234

查出 B 这条线所有用户 除了数据库记录上级关系 程序用递归法遍历 因为深度未知 所以该方案操作耗时位未知 并且可能随着时间的推移 越顶层的人升级 需要遍历的就越久

还有其他更优雅更快速的方式实现吗?无论是从数据库设计还是程序上。
8969 次点击
所在节点    程序员
44 条回复
Conte
2018-10-27 09:41:04 +08:00
原来超过三级就是传销,学到了😁
zn
2018-10-27 09:51:56 +08:00
每个人都只有一个上级,有许多个下级,这样的话,实际上结构是一棵树,是否可以考虑维护树状结构?优化得好的话,每个用户占 16 字节左右数据应该够了,这样的话,一亿用户大约只需要 1.5G 内存就可以了。
yidinghe
2018-10-27 09:55:03 +08:00
遍历树结构没你想象那么慢,先用笨方法实现没关系。
lyhiving
2018-10-27 10:05:49 +08:00
之前有做过,父一级单独记录,父集一个记录,子集一个记录。实际中跑到 199 级没什么压力。
northernlights
2018-10-27 10:32:53 +08:00
这是传销,犯法的。
lihongjie0209
2018-10-27 11:12:39 +08:00
数据库的树形结构设计可以了解一下
cnkuner
2018-10-27 11:14:33 +08:00
你们的下线不会达到数据库瓶颈的。
showecho
2018-10-27 11:27:45 +08:00
说传销的建议好好了解一下;

传销最简单的判断方法是 看是不是利用拉下线赚钱;

很明显,lz 的不是,这只是一种激励政策,这种激励政策很多网站在用的。
robinchina
2018-10-27 11:44:42 +08:00
@Conte 不是超过三级,是达到三级就算传销
robinchina
2018-10-27 11:46:17 +08:00
不要怕慢,电脑很强大的,我在的一个群里面,有人就这么跑,1 万多级都很快,1 万多级全世界的人都不够用啊
Aruforce
2018-10-27 12:02:29 +08:00
这样做?每拉一个人则为这个人建立一个团员的列表…同时维护一个树存储人间的关系?对于每个人查团员都是常数复杂度……任何一个人增加团员是的时候只为父级团员表加数据…… 内存消耗比较大
Aruforce
2018-10-27 12:03:29 +08:00
@Aruforce 数据不要在数据库里递归…放到本地缓存里面
liukanshan
2018-10-27 15:09:53 +08:00
可以考虑下数据嵌套模型 。

简单来说 每个用户都存在一个 left v 和 right v,这两个值来确定层级以及范围关系。

举例来说:

当 A 的 左值: 1 右值: 2 (没有邀请人的状态)

A 这个时候邀请了 B 来看一看这个范围值如何变化

B 节点左值=A.右值
B 节点右值= B.左值+1

最后一步 由于 A 节点插入了一个子节点 需要范围包括 那么 A.右值 = A.右值+2


最终状态就是

A 左值: 1 右值: 4
B 左值: 2 右值: 3


以此类推 。

如果维护起了这套关系 查询子节点信息不需要递归 因为子节点的两边值是一定小于父节点的值 即:

```sql
SELECT * FROM user WHERE lv > parent.lv and rv < parent.rv
```

再来看下 B 邀请了 C

C 节点的左右值和 B 值获取方式一样。

这里不同的是 你需要更改 A 和 B 节点的右值,当然也不需要递归 你只需要找出 lv >= C.lv AND rv < C.lv 然后右值 + 2

最终的状态就是

A 左值: 1 右值: 6
B 左值: 2 右值: 5
C 左值: 3 右值: 4

来查询下 A 一共邀请了多少人?

```
A.右值 / 2 -1 = 2
```


这套模型的关键在于插入和删除 要确保相关的节点值要改变 只要能做到这一点 理论支持无限极分销 并且查询并不需要递归。

希望能帮到你。
liukanshan
2018-10-27 15:11:35 +08:00
补充上面说的

推荐使用存储过程进行插入和节点的删除
TommyLemon
2018-10-27 15:16:55 +08:00
不确定层级就只能递归,不确定每层的内容就只能遍历。
这个需求类似于 评论的评论、文件夹套文件夹 /文件,
已经有开源的算法了,
还支持朋友圈单层评论、QQ 空间动态二级评论等。

github.com/TommyLemon/AbsGrade
创作不易,GitHub 右上角点 Star 支持下吧 ^_^
takato
2018-10-27 15:34:37 +08:00
@geelaw 代价是单个新 node 插入操作的最坏情况变成了 O(V)?
Hilong
2018-10-27 15:36:01 +08:00
如果是 django 可以了解下 django-tree-beard
zhzer
2018-10-27 16:11:30 +08:00
传销?
colordog
2018-10-27 16:20:40 +08:00
传销还有一点,收入是不是均来源于下线
realpg
2018-10-27 16:31:46 +08:00
传销算法的库超级难写 2333
一个基本的分层结构还好
等你遇到层出不同的奖金制度时候就要崩溃了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/501589

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX