各位大佬,几十万用户,存在上下级关系如下需求,改用啥数据库或啥方式存储处理好些 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cnbattle
V2EX    问与答

各位大佬,几十万用户,存在上下级关系如下需求,改用啥数据库或啥方式存储处理好些

  •  
  •   cnbattle 2021-01-06 09:47:20 +08:00 2756 次点击
    这是一个创建于 1746 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前用 mysql

    有如下俩张表:

    1. 基础表:存用户数据及上级的 ID
    id parend_id is_black 昵称等其他字段
    1 0 0
    2 1 0
    3 2 0
    4 2 0
    1. 关系表:某用户上级及下级所有用户的表: 存用一用户 id,上级,上级的上级直到,没有上级, 下级同理(下级数据,极少数的账号有 20 多万的下级 id,大多数几千到几万不等)
    id uid 所有上级 所有下级
    1 1 2,3,4
    2 2 1 3,4
    3 3 1,2
    4 4 1,2

    需求如下:

    1. 基于某一用户,检索他的下级, 例如 基于 id 2 下, 检索昵称为 cnbattle 的用户

    2. 拉黑某用户,拉黑后,删除并清空该用户的关系,下级数据依次上移到该用户的上级,

    假设基于上述的表: 拉黑 id 2 的用户,那么更新为如下的数据

    基础表:

    id parend_id is_black 昵称等其他字段
    1 0 0
    2 0 1
    3 1 0
    4 1 0

    关系表

    id uid 所有上级 所有下级
    1 1 3,4
    2 2
    3 3 1
    4 4 1

    问题:

    Q1: 检索,目前是基于关系表 where in, 虽目前能正常运行,但性能不好,有内存溢出的风险

    Q2: 拉黑用户:是队列处理,当处理一个关系靠顶部的用户时,处理数据量会比较大(这个还好,队列慢慢处理也行)


    基于上述情况,如果优化可以基本满足在简单加机器的情况下,让程序稳定运行的方案方法?

    22 条回复    2024-01-19 16:34:36 +08:00
    mlhadoop
        1
    mlhadoop  
       2021-01-06 09:51:12 +08:00   2
    所以是 zhuan 销集团么
    IMCA1024
        2
    IMCA1024  
       2021-01-06 09:54:00 +08:00
    Q1: 可以定时任务 每隔一小段时间跑一份数据处理, 但有一定延时,单表查询速度比较快,
    也可以继续用你的这种 in 查询 几千几万 ,应该还好的啊, 控制 in 的数量应该问题不大,分段也可以。

    也想看看其他方法,学习学习
    wangxiaoaer
        3
    wangxiaoaer  
       2021-01-06 10:21:34 +08:00
    blueorange
        4
    blueorange  
       2021-01-06 10:26:37 +08:00
    @mlhadoop 非常像
    oott123
        5
    oott123  
       2021-01-06 10:27:05 +08:00 via Android
    Materialized Path 行不行
    UserNameisNull
        6
    UserNameisNull  
       2021-01-06 11:49:54 +08:00
    图数据库呢?
    wudaye
        7
    wudaye  
       2021-01-06 12:58:19 +08:00 via Android   1
    可以拉黑,看来不是企业组织
    cnbattle
        8
    cnbattle  
    OP
       2021-01-06 14:01:12 +08:00
    @mlhadoop
    @blueorange
    @wudaye

    直销系统,有兴趣的话可以了解下
    cnbattle
        9
    cnbattle  
    OP
       2021-01-06 14:04:15 +08:00
    @oott123 存储方式有的, 关系链 有个所有上级字段,存的就是类似 Materialized Path 的结构数据,目前是想找个好的方式来做查询,及更新操作
    cnbattle
        10
    cnbattle  
    OP
       2021-01-06 14:35:51 +08:00
    @wangxiaoaer 谢谢,大概看了下,感觉不错,不过之前没用过 postgresql,周末模拟点数据试试
    dswyzx
        11
    dswyzx  
       2021-01-06 14:38:09 +08:00
    法律规定,分销层级超过三级即可判定为传销.所以说如果是合法的也就最多嵌套三层层级.直接写死层级也没多复杂吧
    cnbattle
        12
    cnbattle  
    OP
       2021-01-06 14:39:01 +08:00
    @UserNameisNull 没了解过,我先看看 0.0
    cnbattle
        13
    cnbattle  
    OP
       2021-01-06 14:58:13 +08:00
    @dswyzx 不是讨论是否发杂的问题,而是想讨论下有没有啥更好一些的方案而已

    就好比你说三级一个用户找了几百人,往下两级就几万用户了,同样会出现性能,内存可能溢出的问题,和修改操数据量大的问题,从而可能出现 mysql 锁 相关的一系列问题,只是想在可能出问题之前,做点预防性的优化 修改等
    opengps
        14
    opengps  
       2021-01-06 15:05:43 +08:00   1
    不要一看到无限级联就想到传销,现在常见的玩法是:虽然无限级联,但是消费利润最多分享给上级个上上级这三级,丝毫没有违法
    atusss
        15
    atusss  
       2021-01-06 15:10:23 +08:00
    嗷,最近才做了一个类似的需求。
    表结构大致这样
    user_id (用户 id ),`base_id ( 64 进制的用户 id ),`link (当前用户的完整链),

    1003854 3R5E {3QzH}{3QBh}{3R5E}
    1000072 3QA8 {3Qz2}{3Qz9}{3Qzg}{3QzT}{3QA8}
    1000996 3Qbn {3QzH}{3QEa}{3QES}{3Qbn}
    1000073 3QAz {3Qz2}{3Qz9}{3Qzg}{3QzT}{3QAz}
    1003856 3R5G {3QzH}{3QEa}{3QES}{3Qbn}{3R5G}
    1000080 3QAG {3QzH}{3QAG}
    1000375 3QET {3QzH}{3QEa}{3QET}
    1000060 3QzY {3Qz2}{3Qz9}{3Qzg}{3QzY}
    1000442 3QFW {3QzH}{3QEa}{3QET}{3QFW}
    JasperYanky
        16
    JasperYanky  
       2021-01-06 15:15:46 +08:00   1
    https://github.com/django-mptt/django-mptt 这是个树型结构管理库,我拿来做用户关系,基本都能满足,你可以看看
    coreki
        18
    coreki  
       2021-01-07 00:28:38 +08:00 via Android
    我写过这个,多级上下级,也是几万几十万下级,这种下级全部写在一个字段里面,性能不好。
    cnbattle
        19
    cnbattle  
    OP
       2021-01-07 08:25:28 +08:00 via Android
    @matrix67 这样方式,数据量少还可以,一多就不行了
    cnbattle
        20
    cnbattle  
    OP
       2021-01-07 08:28:20 +08:00 via Android
    @coreki 恩,所以就想问问有啥好点的方式,现在在研究图数据量,测试看看
    cnbattle
        21
    cnbattle  
    OP
       2021-01-07 08:32:36 +08:00 via Android
    @coreki 图数据库
    kanepan19
        22
    kanepan19  
       2024-01-19 16:34:36 +08:00
    @atusss
    请问这个如何查询 某个层级的用户的所有下级
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     877 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:28 PVG 05:28 LAX 14:28 JFK 17:28
    Do have faith in what you're doing.
    ubao msn 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