php/Mysql最好的树结构

标签 php mysql tree hierarchical-data hierarchical

我必须构建一棵树,其中包含大约 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/

相关文章:

javascript - 将来自 mysql 的数据与 php 一起使用时,Google 折线图不会按月分组。只显示所有日期

php - 如何为每个页面指定标题?

mysql错误: ERROR 1045 (28000): Access denied for user 'root' @'localhost' (using password: YES)

mysql - 使用 .Rprofile 在 R 中预加载 MySQL 数据库连接

sql - 检查基于 'ancestry' 的 SQL 表中的继承属性

php - filter_var($email, FILTER_VALIDATE_EMAIL) 在 if 条件下不起作用

php - 从查询中获取大致搜索结果数量的最佳方法是什么?

mysql - 如何将数据库更改部署到实时服务器?

ruby - 如何让 Ruby 符号指针指向其他内容?

performance - Scala 与 Earth Box 中基于树的算法