多级邀请数据库设计

2017-11-09 10:46:09 +08:00
 caoyufei

uid 7 是 1 的 1 级

9 是 7 的 1 级

9 是 1 的 3 级

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

最多 7 级

如果查 1 的 7 级全部下线

parents like  '1%'

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

求数据库设计方案

4254 次点击
所在节点    问与答
12 条回复
clino
2017-11-09 10:49:32 +08:00
要不把 某个人和他的所有上线的关系都表达出来,比如某个人有 5 级上线,则有 5 条记录,里面包含上下线和中间层级
这样虽然比较冗余,但是你要的查询是可以方便查出来的
crystom
2017-11-09 10:52:05 +08:00
关键词:左右值
czheo
2017-11-09 10:53:29 +08:00
DKR
2017-11-09 11:07:13 +08:00
只记录直属关系,多次遍历,查找整个关系链,其他信息单独一个表
levon
2017-11-09 11:47:09 +08:00
对,一个 ParentId 就可以
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
2017-11-09 13:10:27 +08:00
关键词: 嵌套集合
leeg810312
2017-11-09 13:26:51 +08:00
parents 保存完整的上级路径,查询 7 下级写 parents like '1,7,%',查询 10 下级写 parents like '1,7,9,10,%'
dong3580
2017-11-09 13:42:43 +08:00
id parentid

只记录直属关系
changwei
2017-11-09 14:02:04 +08:00
楼主的头像要小心了
caoyufei
2017-11-09 14:53:04 +08:00
@changwei 这还好啦,为毛你会关注到头像
telami
2019-06-27 17:55:46 +08:00
其实,这是一种典型的 tree 型结构,楼上说了几种方案,parentId 属于邻接表,左右值属于嵌套集,一楼的方案属于闭包表,各有千秋。
过去一年了,不知道楼主选了怎么样的方案?

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

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

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

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

© 2021 V2EX