请教多级分销,取下级和下下,下下下级...获取订单思路 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nicolassggsuper
V2EX    问与答

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

  •  
  •   nicolassggsuper 2020-02-28 09:10:46 +08:00 4148 次点击
    这是一个创建于 2051 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现有账户表 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 条回复    2020-02-28 16:11:03 +08:00
    nicolassggsuper
        1
    nicolassggsuper  
    OP
       2020-02-28 09:18:47 +08:00
    编辑时,点击太快,发布出来了。 求指点
    luman
        2
    luman  
       2020-02-28 09:26:08 +08:00
    前段时间刚做过一个。最后实现的大概思路是,先使用闭包表建立关系方便查询下线,订单表使用两张,一张原始订单记录,一张存储父子级关系与步长。
    absolutely
        3
    absolutely  
       2020-02-28 09:26:38 +08:00
    无限极?
    luman
        4
    luman  
       2020-02-28 09:29:21 +08:00
    @sunjiayao #2 自动发布了
    第二张订单表字段大概可以设计为
    订单 id | 购买用户 id | 上线 id | 上下级步长 | 若有佣金也可以存该表
    另外提醒一下:佣金分红超过三级违法哦
    nicolassggsuper
        5
    nicolassggsuper  
    OP
       2020-02-28 09:40:59 +08:00
    @absolutely 可能是 10 级
    reus
        6
    reus  
       2020-02-28 09:41:25 +08:00
    超过三级就是传销,要进去的,小心了
    reus
        7
    reus  
       2020-02-28 09:44:14 +08:00   1
    @nicolassggsuper 10 级? 3 级都算擦边球了,之前封了一大批,10 级就是明送,如果你不是老板,赶紧跑路。
    nicolassggsuper
        8
    nicolassggsuper  
    OP
       2020-02-28 09:46:08 +08:00
    @sunjiayao 我们不涉及到佣金分红,感谢提醒。请问: 上下级步长 指的是? 如果 LV5 购买了 1 一个订单,上级是 LV4,那么 第二张订单保重存储几条记录? 上下级步长是几?
    nicolassggsuper
        9
    nicolassggsuper  
    OP
       2020-02-28 09:46:49 +08:00
    @reus 我们不涉及到佣金分红,谢谢
    luman
        10
    luman  
       2020-02-28 09:56:58 +08:00
    @nicolassggsuper #8 就是第几级下线的意思。如果你们需要记录十级(含)下线的订单关系,那所谓的步长最大就是 10。
    当 LV5 购买一个订单时。在创建原始订单后,要将其和其所有上级分别生产一条记录订单(数据量可能比较大,但没关系)。
    即为:
    LV1 | LV5
    LV2 | LV5
    .
    .
    .
    .
    nicolassggsuper
        11
    nicolassggsuper  
    OP
       2020-02-28 10:01:10 +08:00
    @sunjiayao 明白了,感谢,非常感谢!
    mjVtb96d2bap2u3Z
        12
    mjVtb96d2bap2u3Z  
       2020-02-28 10:49:02 +08:00
    @sunjiayao 如果涉及到上下级关系中途变更的,怎么处理比较好?
    optional
        13
    optional  
       2020-02-28 11:05:55 +08:00
    树形结构有两种实现方式,
    一种是 parent_id 方式存储, 这个可以用 cte 递归查询实现
    一种是 path 前缀树方式存储, 查询直接 like prefix%就行。
    前者调整灵活但是查询效率低,后者查询效率高但是灵活性少一点,实现的时候也可以两种都实现,在修改 parent_id 的时候同时保存前缀。
    tr>
    troycode
        14
    troycode  
       2020-02-28 11:19:59 +08:00
    存储过程来读吧
    DoubleShut
        15
    DoubleShut  
       2020-02-28 11:23:25 +08:00
    同 13 楼,两种方式都实现
    luckyrayyy
        16
    luckyrayyy  
       2020-02-28 11:32:00 +08:00
    是否可以直接缓存一个全体人员关系树?到时候能直接取到所有下级子树的 id。
    nicolassggsuper
        17
    nicolassggsuper  
    OP
       2020-02-28 11:36:15 +08:00
    @luckyrayyy 人员关系树缓存不是问题,按照 @optional 的方式也可以。 但最终需要的获取具体订单的性能
    luckyrayyy
        18
    luckyrayyy  
       2020-02-28 11:39:25 +08:00
    @nicolassggsuper 你的问题是最后怎么读这么多订单?这不是得分页么
    sampeng
        19
    sampeng  
       2020-02-28 13:13:01 +08:00 via iPhone
    不要用 parentid 的方式。用二叉树实现。无限分类
    yikyo
        20
    yikyo  
       2020-02-28 13:39:06 +08:00
    数据库读多写少的树型结构,可用左右值模式,限制只能有一个根。
    HonoSV
        21
    HonoSV  
       2020-02-28 14:09:02 +08:00
    mark,我现在这个项目也是做分销。13 楼提到的 parentId 和 path 方式都有用到。
    jayin
        22
    jayin  
       2020-02-28 14:16:21 +08:00
    上面的做法我都想过,也实践过。最后做法是,维护一个关系表 relation 表,记录用户 A 的所有下级用户 ID+用户层级。维护这个表是复杂点,但是各种查询性能快、简单。
    nicolassggsuper
        23
    nicolassggsuper  
    OP
       2020-02-28 14:17:29 +08:00
    @optional @HonoSV parentId 和 path 方式用在用户关系设计上?还是订单上也用到了这种关系?
    nicolassggsuper
        24
    nicolassggsuper  
    OP
       2020-02-28 14:18:37 +08:00
    @jayin 你这种思路是可行的,并且效率能接受
    HonoSV
        25
    HonoSV  
       2020-02-28 14:32:39 +08:00
    @nicolassggsuper 我们只用在 user 表上,所以订单展示要联一次表,因为用户量不大,所以还没啥性能问题。。。mark 也是看看还有没有更好的方案。
    sun019
        26
    sun019  
       2020-02-28 14:41:21 +08:00
    无限极分类吧 13 楼说的第一种
    keepsmilence
        27
    keepsmilence  
       2020-02-28 14:43:24 +08:00
    现在习惯设计关系表是都有 parent_id 和 parent_ids ( path )两个字段,parent_id 记录所属上级 id,parent_ids 从所属上级记录读取它的 parent_ids 后追加上级 id,逗号分隔;如果需要修改关系,修改后从新的关系更新 parent_ids ;之后查询就像上面那样,用「 like ,XXX,%」查询出所有下级 id (注意加了前后逗号,避免通配)后再用 id 集合查出订单;
    keepsmilence
        28
    keepsmilence  
       2020-02-28 14:47:47 +08:00
    噢,还有,如果任意一级更新了 parent_id,除了要从他的上级继承 parent_ids 之外,还要有个触发机制更新所有下级的 parent_ids
    optional
        29
    optional  
       2020-02-28 14:55:05 +08:00
    @nicolassggsuper 当然是用户了,订单上有需要去 join 啊
    doublleft
        30
    doublleft  
       2020-02-28 16:11:03 +08:00
    在前段用点击触发下钻可以么,节省很多
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5310 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 09:05 PVG 17:05 LAX 02:05 JFK 05:05
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86