mysql 树形结构存储查询方案

2022-01-21 17:02:06 +08:00
 wxy1991
大家常见的树形结构是如何设计存储的,查询,修改的时候方便吗?
之前我一直使用的是 id ,name ,parent_id 的方案,但是后来发现查询子节点的时候特别不方便,哪怕最优的方案也需要查询 n(树的层数)次,不知道大家有没有什么好的查询策略或者数据存储方案
3741 次点击
所在节点    MySQL
18 条回复
hidemyself
2022-01-21 17:04:33 +08:00
闭包表?
zxabition
2022-01-21 17:07:32 +08:00
加个 path 字段?,然后维护好这个字段?
这种:
id code path
1348900982112034817 100101 [0],[1348900982044925953]
1348900982195920898 10010101 [0],[1348900982044925953],[1348900982112034817]
1348900982275612674 10010102 [0],[1348900982044925953],[1348900982112034817]
1348900982497910786 100102 [0],[1348900982044925953]
1348900982565019649 10010201 [0],[1348900982044925953],[1348900982497910786]
1348900982632128513 10010202 [0],[1348900982044925953],[1348900982497910786]
1348900982699237377 100103 [0],[1348900982044925953]
Bronya
2022-01-21 17:14:38 +08:00
用 Path Enumerations 方式比较方便查子节点,可以看看这个:

https://www.zhihu.com/question/20417447/answer/15078011
815979670
2022-01-21 17:22:31 +08:00
我上个月刚写了一篇文章:《 MySQL Tree 存储方案 》 https://www.dbkuaizi.com/archives/142.html
wxy1991
2022-01-21 17:23:47 +08:00
多谢楼上的各位大佬,我参考下看看我们项目适合哪种
hteen
2022-01-21 17:36:31 +08:00
数据少 闭包表
数据多 path 字段+fullindex
wxy1991
2022-01-21 17:42:55 +08:00
@hteen 数据多 path 字段会超长吧
fmumu
2022-01-21 17:54:24 +08:00
数据不多,就一次查出来,程序里递归处理
数据多就懒加载呗
要不就和行政区划一样,上级 id 做下级的前缀
mx1700
2022-01-21 19:07:39 +08:00
Mysql 8 支持递归查询,如果深度不深效率还可以
golangLover
2022-01-21 19:10:26 +08:00
用 json, 存 string
rabbbit
2022-01-21 19:23:43 +08:00
搭车问个问题:
这种 parentId 存树形结构的怎么查询比较快?
树不限深度, 总节点数在 1 万个左右.直接写 SQL 还是全查出来然后用 Java 处理,
rabbbit
2022-01-21 19:25:17 +08:00
说错了,不是 1 万个节点.是查出来的数据量有 1 万条左右.
pelloz
2022-01-21 19:28:25 +08:00
一般来说,数据不会有很多层,那么上级 id 做下级的前缀其实很可行
garfeildma
2022-01-21 20:47:07 +08:00
推荐《 SQL 反模式》,里边专门一章讲这个问题的
RuLaiFo
2022-01-22 09:49:34 +08:00
可以去了解一下 mptt 查询很快,但是添加删除会更新整个树,根据业务看你的树有多大(没测试过性能极限值),几百个节点应该还是可以的。
Akiya
2022-01-22 12:40:49 +08:00
图数据库了解一下
Akiya
2022-01-22 12:45:01 +08:00
@rabbbit 一万条直接全读出来在内存里面处理就行了
wxy1991
2022-01-24 14:57:05 +08:00
@rabbbit 你是要查询整个树,还是查询某个节点的父子节点,如果查询整个树,建议一次全查出来,用代码计算树的结构,后续可以存到 redis 中,只要树结构发生变更时更新下 redis 数据就行。如果是查询父子节点,那只能一层一层递归查询了

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

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

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

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

© 2021 V2EX