在MySQL中构建面包屑

时间:2009-07-27 23:21:01

标签: php mysql performance

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

  - id
  - name
  - parentID

信息存储如下:

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

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

第一种想到的方法是一系列SQL查询,但我很快意识到,这会使网站变得越来越复杂,这将是潜在的资源密集型。

通过mysql手册阅读,我已经看到mysql可以使用循环和条件语句,但是我不确定我是如何在这里实现它们的。

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

如果我查看“宠物”类别,我只会看到home,因为它位于顶层。只要我向下钻取(catsdogspets下的页面),我就会在栏上看到pets - 后续子类别也是如此和页面。

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

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

因此,任何方法都需要轻松a)用户理解,b)轻松实现用户。

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

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

示例:我有德国谢泼德位于 下的

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

你是否有一个堆栈或有序集(按用户如何应用过滤器进行浏览),包含存储在会话中的面包屑?

当你开始交叉查询时,我可以看到它变得严峻,但有时数据不是分层的,而是更多的标签汤,以上开始是你的标签汤澄清面包屑。

大多数网站实际上并没有使用好的(或任何)标签汤。例如,您有多少次在网站上查看销售CD,并希望深入查看金属CD(例如),但点击左侧的“摇滚和金属”链接取出顶级金属类别,而不是当前浏览状态的过滤器。

那么 - 您的问题实际上是一个标签汤,您正在应用错误的层次结构?您是否应该查看可以将项目传递到的自动标记生成库,以及标记查找机制?好的,我确信你的个人网站不够复杂,不需要标签搜索,但总的来说,我认为值得考虑。