当前位置: 首页 > 面试题库 >

php / Mysql最佳树形结构

鲁才艺
2023-03-14
问题内容

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

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

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


问题答案:

您可以使用 嵌套集模型,
因为它可以产生非常有效的查询。检出在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>

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



 类似资料:
  • 主要内容:附加“虚段”的归并树通过上一节对置换-选择排序算法的学习了解到,通过对初始文件进行置换选择排序能够获得多个长度不等的初始归并段,相比于按照内存容量大小对初始文件进行等分,大大减少了初始归并段的数量,从而提高了外部排序的整体效率。 本节带领大家思考一个问题:无论是通过等分还是置换-选择排序得到的归并段,如何设置它们的归并顺序,可以使得对外存的访问次数降到最低? 例如,现有通过置换选择排序算法所得到的 9 个初始归并段,

  • 问题内容: 所以,我的问题是,我想构建这两个表的树: 树应该看起来像: p p_0 p_0_0 p_0_1 p_0_1_0 p_0_1_1 q 有人可以帮我解决递归解决方案吗? 问题答案: 为此,您不需要在数据库中创建2个表,您可以仅从一个表中进行维护,如下所示 生成的数组将像 您需要使用下面的递归函数来实现它 该算法非常简单: 取所有元素的数组和当前父代的ID(最初为0 / nothing /

  • 问题内容: 问题 在处理产品和订单的Web应用程序中,我想维护前雇员(用户)与其处理的订单之间的信息和关系。我想维护过时产品与包括这些产品的订单之间的信息和关系。 但是我希望员工能够整理管理界面,例如删除前员工,过时的产品,过时的产品组等。 我正在考虑实施软删除。那么,通常如何做到这一点? 我的即时想法 我的第一个想法是在应该可以软删除的每个对象表中粘贴“ TINYINT NOT NULL DEF

  • 问题内容: 我正在寻找检查并查看查询是否返回任何结果的最佳方法。我觉得我经常写这部分代码,有时会出错,有时却没有。 例如,我运行此查询以检查是否存在用户名,然后再将新用户名插入数据库。 然后,我想检查一下是否返回了任何结果。这是我这样做的一种方式: 如果第一种方法不起作用,那么有时它将: 然后,我什至看到前几天可以这样做: 做这个的最好方式是什么? 问题答案: 对于PHP 5和7及更高版本,请使用

  • 问题内容: 我有一个类别表,如下所示。我要保存类别,该表中的子类别(多个子类别)。我的桌子看起来像 现在,我需要查询该表并按如下所示创建树形结构,以轻松浏览前端的类别。 像这样的树 我对查询有点困惑。谁能帮帮我吗 ? 提前致谢 问题答案: 对于基本显示,您可以使用: 它将为您提供所有的根节点。 当用户单击某个节点时,他/她/它向服务器(可能是Ajax)提交请求以获取被单击节点的子节点,例如: 然后

  • 树形结构有两种表示方法:子表表示法(嵌套)和父指针表示法(扁平)。 Tree 将两者进行了整合,输出一个扁平的结构,一个节点既通过 pId(指向父节点的唯一标志)建立与父节点关系,又通过 children(数组,存储子节点的唯一标志)建立与子节点的关系。 一个树形结构,为了方便处理,通常需要具备以下特点: 一个扁平的数组结构很重要,在需要获取某个节点时,可以仅通过一次循环快速找到该节点。Tree