gpt4 book ai didi

php/Mysql最好的树结构

转载 作者:IT老高 更新时间:2023-10-28 23:51:38 25 4
gpt4 key购买 nike

我必须构建一棵树,其中包含大约 300 个节点。树没有深度限制。所以它可以有 3 或 15 个级别。每个节点可以有无限数量的子节点。

优先级是尽可能快地获得完整的树/子树,但有时我也需要添加节点或移动节点,但不那么频繁。

我想知道在数据库中存储树的最佳方式以及在 php 中检索数据的最佳方式。

最佳答案

您可以使用嵌套集模型,因为它会产生非常高效的查询。查看 Managing Hierarchical Data in MySQL并阅读名为嵌套集模型的部分。

如果您使用像 Doctrine 这样的 ORM,它 includes nested set capabilities .

有些人可能很难掌握 leftright 的嵌套集合概念。 我发现使用这些数字来类比 open 的行号/close 标记在 XML 文档中,人们发现它更容易掌握。

以上面 MySQL 链接中的数据为例:

+-------------+----------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+
| 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 |
| 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 7 | MP3 PLAYERS | 11 | 14 |
| 8 | FLASH | 12 | 13 |
| 9 | CD PLAYERS | 15 | 16 |
| 10 | 2 WAY RADIOS | 17 | 18 |
+-------------+----------------------+-----+-----+

如果您将 lftrgt 字段用作 XML 文档的行号,您会得到:

1. <electronics>
2. <televisions>
3. <tube>
4. </tube>
5. <lcd>
6. </lcd>
7. <plasma>
8. </plasma>
9. </televisions>
10. <portable electronics>
11. <mp3 players>
12. <flash>
13. </flash>
14. </mp3 players>
15. <cd players>
16. </cd players>
17. <2 way radios>
18. </2 way radios>
19. </portable electronics>
20. </electronics>

以这种方式查看它可以使某些人更容易可视化生成的嵌套集层次结构。它还更清楚地说明了为什么这种方法可以提高效率,因为它可以选择整个节点而无需多次查询或连接。

关于php/Mysql最好的树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com