我有一个定义在我的网站可能类别表 - 字段是这个样子:大厦面包屑在MySQL
- id - name - parentID
的信息存储是这样的:
+-----+------+----------+ | id | name | parentID | +-----+------+----------+ | 1 | pets | 0 | +-----+------+----------+ | 2 | cats | 1 | +-----+------+----------+ | 3 | dogs | 1 | +-----+------+----------+
一个parentID
为0表示类别/页面处于家庭级别。我正在寻找一种快速方便地生成父类别的方法。
想到的第一个方法是一系列的SQL查询,但我很快意识到,这会隐藏资源密集型网站得到更复杂。
通过阅读mysql手册,我已经看到mysql可以使用循环和条件语句,但是我不确定如何在这里使用这些语句。
理想情况下,我希望有一个查询来提取所有直接相关的父元素。
如果我正在查看Pets类别,我只会看到home
,因为它位于顶层。只要我深入研究(或者进入cats
,dogs
或pets
下的一个页面),那么我应该在栏上看到pets
- 后续子类别和页面也是如此。
什么是使用以这种方式存储的信息来生成类别列表的最有效方式?如果这个问题需要更多的澄清,请问,我会尽我所能提供更多的信息。
澄清:这是CMS的一部分 - 因此,用户将需要能够动态更改类别。我查看了几种数据存储方案(例如嵌套集),并且它们似乎不适合用于更改导航的简单表单。因此,任何方法都需要易于a)被用户理解,并且b)易于被用户实现。
这些类别最好在PC上描述为文件夹,而不是标签。当您查看任何给定的类别时,您可以看到该类别的直接子项以及直接的子页面。
当您查看类别或页面时,父类别(但本身不可见)。
例子:我有一个位于下狗这是下宠物
When viewing *pets*: Home When viewing *dogs*: Home -> Pets When viewing *German Shepard*: Home -> Pets -> Dogs
您可以使用存储过程,它将利用您提到的“循环和条件语句”。但是,SQL确实不能很好地处理树木。考虑以非树形格式存储值(例如嵌套集),或者如果数据集足够小,从单个SELECT构建树一次,并将结果缓存在APC,memcache中,或者甚至在单个记录中序列化在数据库中。 – 2009-07-28 00:38:33