nicolassggsuper
V2EX  ›  问与答

请教多级分销,取下级和下下,下下下级...获取订单思路

  •  
  •   nicolassggsuper · Feb 28, 2020 · 4934 views
    This topic created in 2447 days ago, the information mentioned may be changed or developed.
    现有账户表 t_user,订单表 t_order ,两张表通过 userid 关联。
    t_user 内部有上下级关系 级别 LV1 LV2 LV3... LVn

    需求:LV1 可以看到 lv2 级 lv2 所有下级,下下级的订单信息,其他级别以此类推;
    备注:lv1 的 lv2 级别用户可能有多个

    目前解决方式: 获取 lv1 得所有 lv2 级 lv2 所有下级,下下级的...用户的 userid,然后取 t_order 表中查找( select * from t_order where uid in (***,****,***))

    问题:数据量小得化,系统还能扛得住,假设 lv2 级别得用户有 1W,感觉紧紧一个查询,数据库就吃不消。


    请教这种情况改怎么破?
    30 replies  •  2020-02-28 16:11:03 +08:00
    nicolassggsuper
    nicolassggsuper
    OP
    Feb 28, 2020
    1
    编辑时,点击太快,发布出来了。 求指点
    luman
    luman
    Feb 28, 2020
    2
    前段时间刚做过一个。最后实现的大概思路是,先使用闭包表建立关系方便查询下线,订单表使用两张,一张原始订单记录,一张存储父子级关系与步长。
    absolutely
    absolutely
    Feb 28, 2020
    3
    无限极?
    luman
    luman
    Feb 28, 2020
    4
    @sunjiayao #2 自动发布了
    第二张订单表字段大概可以设计为
    订单 id | 购买用户 id | 上线 id | 上下级步长 | 若有佣金也可以存该表
    另外提醒一下:佣金分红超过三级违法哦
    nicolassggsuper
    nicolassggsuper
    OP
    Feb 28, 2020
    5
    @absolutely 可能是 10 级
    reus
    reus
    Feb 28, 2020
    6
    超过三级就是传销,要进去的,小心了
    reus
    reus
    Feb 28, 2020❤️1
    7
    @nicolassggsuper 10 级? 3 级都算擦边球了,之前封了一大批,10 级就是明送,如果你不是老板,赶紧跑路。
    nicolassggsuper
    nicolassggsuper
    OP
    Feb 28, 2020
    8
    @sunjiayao 我们不涉及到佣金分红,感谢提醒。请问: 上下级步长 指的是? 如果 LV5 购买了 1 一个订单,上级是 LV4,那么 第二张订单保重存储几条记录? 上下级步长是几?
    nicolassggsuper
    nicolassggsuper
    OP
    Feb 28, 2020
    9
    @reus 我们不涉及到佣金分红,谢谢
    luman
    luman
    Feb 28, 2020
    10
    @nicolassggsuper #8 就是第几级下线的意思。如果你们需要记录十级(含)下线的订单关系,那所谓的步长最大就是 10。
    当 LV5 购买一个订单时。在创建原始订单后,要将其和其所有上级分别生产一条记录订单(数据量可能比较大,但没关系)。
    即为:
    LV1 | LV5
    LV2 | LV5
    .
    .
    .
    .
    nicolassggsuper
    nicolassggsuper
    OP
    Feb 28, 2020
    11
    @sunjiayao 明白了,感谢,非常感谢!
    mjVtb96d2bap2u3Z
    mjVtb96d2bap2u3Z
    Feb 28, 2020
    12
    @sunjiayao 如果涉及到上下级关系中途变更的,怎么处理比较好?
    optional
    optional
    Feb 28, 2020
    13
    树形结构有两种实现方式,
    一种是 parent_id 方式存储, 这个可以用 cte 递归查询实现
    一种是 path 前缀树方式存储, 查询直接 like prefix%就行。
    前者调整灵活但是查询效率低,后者查询效率高但是灵活性少一点,实现的时候也可以两种都实现,在修改 parent_id 的时候同时保存前缀。
    troycode
    troycode
    Feb 28, 2020
    14
    存储过程来读吧
    DoubleShut
    DoubleShut
    Feb 28, 2020
    15
    同 13 楼,两种方式都实现
    luckyrayyy
    luckyrayyy
    Feb 28, 2020
    16
    是否可以直接缓存一个全体人员关系树?到时候能直接取到所有下级子树的 id。
    nicolassggsuper
    nicolassggsuper
    OP
    Feb 28, 2020
    17
    @luckyrayyy 人员关系树缓存不是问题,按照 @optional 的方式也可以。 但最终需要的获取具体订单的性能
    luckyrayyy
    luckyrayyy
    Feb 28, 2020
    18
    @nicolassggsuper 你的问题是最后怎么读这么多订单?这不是得分页么
    sampeng
    sampeng
    Feb 28, 2020 via iPhone
    19
    不要用 parentid 的方式。用二叉树实现。无限分类
    yikyo
    yikyo
    Feb 28, 2020
    20
    数据库读多写少的树型结构,可用左右值模式,限制只能有一个根。
    HonoSV
    HonoSV
    Feb 28, 2020
    21
    mark,我现在这个项目也是做分销。13 楼提到的 parentId 和 path 方式都有用到。
    jayin
    jayin
    Feb 28, 2020
    22
    上面的做法我都想过,也实践过。最后做法是,维护一个关系表 relation 表,记录用户 A 的所有下级用户 ID+用户层级。维护这个表是复杂点,但是各种查询性能快、简单。
    nicolassggsuper
    nicolassggsuper
    OP
    Feb 28, 2020
    23
    @optional @HonoSV parentId 和 path 方式用在用户关系设计上?还是订单上也用到了这种关系?
    nicolassggsuper
    nicolassggsuper
    OP
    Feb 28, 2020
    24
    @jayin 你这种思路是可行的,并且效率能接受
    HonoSV
    HonoSV
    Feb 28, 2020
    25
    @nicolassggsuper 我们只用在 user 表上,所以订单展示要联一次表,因为用户量不大,所以还没啥性能问题。。。mark 也是看看还有没有更好的方案。
    sun019
    sun019
    Feb 28, 2020
    26
    无限极分类吧 13 楼说的第一种
    keepsmilence
    keepsmilence
    Feb 28, 2020
    27
    现在习惯设计关系表是都有 parent_id 和 parent_ids ( path )两个字段,parent_id 记录所属上级 id,parent_ids 从所属上级记录读取它的 parent_ids 后追加上级 id,逗号分隔;如果需要修改关系,修改后从新的关系更新 parent_ids ;之后查询就像上面那样,用「 like ,XXX,%」查询出所有下级 id (注意加了前后逗号,避免通配)后再用 id 集合查出订单;
    keepsmilence
    keepsmilence
    Feb 28, 2020
    28
    噢,还有,如果任意一级更新了 parent_id,除了要从他的上级继承 parent_ids 之外,还要有个触发机制更新所有下级的 parent_ids
    optional
    optional
    Feb 28, 2020
    29
    @nicolassggsuper 当然是用户了,订单上有需要去 join 啊
    doublleft
    doublleft
    Feb 28, 2020
    30
    在前段用点击触发下钻可以么,节省很多
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2494 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 04:35 · PVG 12:35 · LAX 20:35 · JFK 23:35
    ♥ Do have faith in what you're doing.