多级邀请数据库设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
caoyufei
V2EX    问与答

多级邀请数据库设计

  •  
  •   caoyufei 2017-11-09 10:46:09 +08:00 4880 次点击
    这是一个创建于 2945 天前的主题,其中的信息可能已经有所发展或是发生改变。

    uid 7 是 1 的 1 级

    9 是 7 的 1 级

    9 是 1 的 3 级

    每个人都是 1 级 也可能是别人的 二级 三级,

    最多 7 级

    如果查 1 的 7 级全部下线

    parents like '1%' 

    可要查 7 的 全部下线,感觉就不行了

    Imgur

    求数据库设计方案

    12 条回复    2019-06-27 17:55:46 +08:00
    clino
        1
    clino  
       2017-11-09 10:49:32 +08:00
    要不把 某个人和他的所有上线的关系都表达出来,比如某个人有 5 级上线,则有 5 条记录,里面包含上下线和中间层级
    这样虽然比较冗余,但是你要的查询是可以方便查出来的
    crystom
        2
    crystom  
       2017-11-09 10:52:05 +08:00
    关键词:左右值
    DKR
        4
    DKR  
       2017-11-09 11:07:13 +08:00
    只记录直属关系,多次遍历,查找整个关系链,其他信息单独一个表
    levon
        5
    levon  
       2017-11-09 11:47:09 +08:00
    对,一个 ParentId 就可以
    iscraft
        6
    iscraft  
       2017-11-09 12:50:18 +08:00
    在自己尚处在想象的一个项目中有这么一个类似的需求 对于这个情况有 3 年时间内都在不断迷惑 求解

    @crystom 看过 destoon 的 area 表和左右值 数据量小或者数据变动次数不多的时候使用 parent 或者左右值非常合适 最终还是要根据数据的具体情况来看
    @czheo find_in_set 是真的好用 这是我在一个小预约程序上添加一个小功能但最终不得不从 sqlite 迁移到 mysql 上得到的教训 但较大数据量效率一般 且仅支持 mysql
    @DKR 多次遍历存在嵌套循环 用时久消耗大

    最后我的意见是 如果不是无限分级 级别总数值小并且有上限的话 就把所有的级数都列在同一张表内
    uid l1 l2 l3 l4 l5 l6 l7
    1 7 0 9 0 0 0 0
    7 9 0 0 0 0 0 0
    1 的 1 级是 7,7 的 1 级是 9,1 的 3 级是 9
    全部下线 就多用几个 and
    yazohu
        7
    yazohu  
       2017-11-09 13:10:27 +08:00 via Android
    关键词: 嵌套集合
    leeg810312
        8
    leeg810312  
       2017-11-09 13:26:51 +08:00 via Android
    parents 保存完整的上级路径,查询 7 下级写 parents like '1,7,%',查询 10 下级写 parents like '1,7,9,10,%'
    dong3580
        9
    dong3580  
       2017-11-09 13:42:43 +08:00
    id parentid

    只记录直属关系
    changwei
        10
    changwei  
       2017-11-09 14:02:04 +08:00 via Android
    楼主的头像要小心了
    caoyufei
        11
    caoyufei  
    OP
       2017-11-09 14:53:04 +08:00
    @changwei 这还好啦,为毛你会关注到头像
    telami
        12
    telami  
       2019-06-27 17:55:46 +08:00
    其实,这是一种典型的 tree 型结构,楼上说了几种方案,parentId 属于邻接表,左右值属于嵌套集,一楼的方案属于闭包表,各有千秋。
    过去一年了,不知道楼主选了怎么样的方案?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5629 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 06:12 PVG 14:12 LAX 22:12 JFK 01:12
    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