2009-07-27 272 views
0

我有一个定义在我的网站可能类别表 - 字段是这个样子:大厦面包屑在MySQL

 
    - id 
    - name 
    - parentID 

的信息存储是这样的:

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

一个parentID为0表示类别/页面处于家庭级别。我正在寻找一种快速方便地生成父类别的方法。

想到的第一个方法是一系列的SQL查询,但我很快意识到,这会隐藏资源密集型网站得到更复杂。

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

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

如果我正在查看Pets类别,我只会看到home,因为它位于顶层。只要我深入研究(或者进入cats,dogspets下的一个页面),那么我应该在栏上看到pets - 后续子类别和页面也是如此。

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

澄清:这是CMS的一部分 - 因此,用户将需要能够动态更改类别。我查看了几种数据存储方案(例如嵌套集),并且它们似乎不适合用于更改导航的简单表单。因此,任何方法都需要易于a)被用户理解,并且b)易于被用户实现。

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

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

例子:我有一个位于下这是下宠物

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

您可以使用存储过程,它将利用您提到的“循环和条件语句”。但是,SQL确实不能很好地处理树木。考虑以非树形格式存储值(例如嵌套集),或者如果数据集足够小,从单个SELECT构建树一次,并将结果缓存在APC,memcache中,或者甚至在单个记录中序列化在数据库中。 – 2009-07-28 00:38:33

回答

5

德国牧羊犬考虑使用 “嵌套集合” 的模式,而不是:Managing Hierarchical Data in MySQL

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

+0

我澄清了我的问题 - 我想使用嵌套设置,但是我相信用户通过控制面板进行可视化和实现将会非常困难。 – EvilChookie 2009-07-28 00:17:00

+2

您可以根据需要呈现数据,并在幕后使用嵌套集。 – cdmckay 2009-07-28 00:17:56

+0

就像您的用户不需要为应用程序编写SQL查询以获得数据库支持一样,他们不需要了解嵌套集以便在引擎盖下使用嵌套集。 – 2009-07-28 00:35:00

0

您是否可以在会话中存储包含您的面包屑的堆栈或有序集(按照用户对浏览器应用过滤器的方式进行排序)?

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

大多数网站实际上并没有功能良好(或任何)标签汤下钻。例如,你有多少次看过网站上的销售CD,并想深入查看Metal CD(例如),但点击左边的“Rock and Metal”链接就可以看到顶级金属类别,而不是作为您当前浏览状态的过滤器。

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

+0

我会说这不是问题。也许标签并不是描述它的最好方式。类别功能就像PC上的文件夹一样。当您显示一个类别时,它会向您显示当前级别下方的类别以及其中的任何页面。 – EvilChookie 2009-07-28 00:22:14

+0

这很公平,尽管具有管理适当硬链接的文件系统可以像标签查找系统一样工作。只是扔在那里。就像在按项目组织项目时寻找最近的单词/图像/ foo文档一样,您忘记了它所在的项目。 – JeeBee 2009-07-28 00:27:30