php - 在 MySQL 中构建面包屑

标签 php mysql performance

我有一个表格,它定义了我网站中可能的类别 - 字段看起来像这样:

  - id
  - name
  - parentID

信息是这样存储的:

+-----+------+----------+
| id  | name | parentID |
+-----+------+----------+
|  1  | pets |        0 |
+-----+------+----------+
|  2  | cats |        1 |
+-----+------+----------+
|  3  | dogs |        1 |
+-----+------+----------+

parentID 为 0 表示类别/页面位于主页级别。我正在寻找一种快速轻松地生成父类别的方法。

我想到的第一个方法是一系列 SQL 查询,但我很快意识到,网站越复杂,这种方法就会消耗更多资源。

通过阅读 mysql 手册,我看到 mysql 可以使用循环和条件语句,但是我不确定我将如何在此处将它们付诸实践。

理想情况下,我想要一个查询来提取所有直接相关的父元素。

如果我查看 Pets 类别,我只会看到 home,因为它位于顶层。一旦我向下钻取(catsdogspets 下的页面),我应该会看到 pets 在栏上 - 随后的子类别和页面也是如此。

使用以这种方式存储的信息生成类别列表的最有效方法是什么?如果此问题需要更多说明,请询问,我会尽力提供更多信息。

澄清:这是 CMS 的一部分 - 因此,用户需要能够即时更改类别。我研究了几种数据存储方案(例如嵌套集),它们似乎不太适合用于更改导航的简单表单。

因此,任何方法都需要易于 a) 用户理解,以及 b) 易于用户实现。

最好将类别描述为 PC 上的文件夹,而不是标签。当您查看任何给定类别时,您可以看到该类别的直接子级以及直接子级页面。

当您查看类别或页面时,父类别(但本身不可见)。

示例:我有 German Shepard,它位于 dogs 之下,位于 pets

When viewing *pets*:           Home
When viewing *dogs*:           Home -> Pets
When viewing *German Shepard*: Home -> Pets -> Dogs

最佳答案

考虑改用“嵌套集”模型:Managing Hierarchical Data in MySQL .

更新(基于对问题的澄清):嵌套集模型不必(事实上我很难想象为什么会)暴露给最终用户。嵌套集模型可以支持所有目录式操作(添加新文件夹/子文件夹;将文件夹移动到不同的路径等),尽管有些操作比其他操作更难实现。我链接到的文章提供了添加和删除(子)文件夹的示例。

关于php - 在 MySQL 中构建面包屑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1191171/

相关文章:

php - 警告:mysql_num_rows():提供的参数不是有效的MySQL结果资源

php - 使用来自 mysql 数据库的 php 填充多个变量

php - 有没有关于如何在 "Laravel 5.1"中为基于 CRUD 的应用程序编写测试的示例?

mysql - 如何查找 08 :00-16:00 on a resource 之间的总预订时间

c# - 当互联网连接速度慢时 : WebException - The remote server returned an error: NotFound

java - 用于单写入器线程的 AtomicXXX 惰性设置

c++ - C++ 中带线程的时钟函数

javascript - javascript函数中的html代码

php - 在上传到 Mysql 之前获取 blob 字符串的大小

mysql - 如何使用Angular JS检索数据并在MYSQL列中存储json格式