一尘不染

php / Mysql最佳树形结构

mysql

我必须建立一棵树,其中将包含约300个节点。该树没有深度限制。因此它可以具有3或15个级别。每个节点可以有无限数量的子代。

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

我想知道在数据库中存储树的最佳方法以及在php中检索数据(如果可能)的最佳方法。


阅读 310

收藏
2020-05-17

共1个答案

一尘不染

您可以使用 嵌套集模型,
因为它可以产生非常有效的查询。检出在MySQL中管理分层数据,并阅读称为 嵌套集模型 的部分。

如果您使用的是Doctrine之类的ORM,则它包含嵌套集功能

它可以是很难对一些把握的嵌套组的概念 右。 我发现使用这些数字作为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>

以这种方式查看它可以使某些人更容易可视化嵌套集的层次结构。它还使这种方法提高效率的原因更加明确,因为它可以选择整个节点而无需多个查询或联接。

2020-05-17