我有一个表格,用于定义我网站中可能的类别 - 字段看起来像这样:
- id - name - parentID
信息存储如下:
+-----+------+----------+ | id | name | parentID | +-----+------+----------+ | 1 | pets | 0 | +-----+------+----------+ | 2 | cats | 1 | +-----+------+----------+ | 3 | dogs | 1 | +-----+------+----------+
parentID
为0表示类别/页面位于主页级别。我正在寻找一种快速轻松生成父类别的方法。
第一种想到的方法是一系列SQL查询,但我很快意识到,这会使网站变得越来越复杂,这将是潜在的资源密集型。
通过mysql手册阅读,我已经看到mysql可以使用循环和条件语句,但是我不确定我是如何在这里实现它们的。
理想情况下,我希望有一个查询可以提取所有直接相关的父元素。
如果我查看“宠物”类别,我只会看到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
答案 0 :(得分:5)
请考虑使用“嵌套集”模型:Managing Hierarchical Data in MySQL。
更新(基于对问题的澄清):嵌套集模型不一定(实际上我很难想象为什么会这样)暴露给最终用户。所有目录式操作(添加新文件夹/子文件夹;将文件夹移动到不同的路径等等)都可以在嵌套集模型中得到支持,尽管有些操作比其他操作更难实现。我链接的文章提供了添加和删除(子)文件夹的示例。
答案 1 :(得分:0)
你是否有一个堆栈或有序集(按用户如何应用过滤器进行浏览),包含存储在会话中的面包屑?
当你开始交叉查询时,我可以看到它变得严峻,但有时数据不是分层的,而是更多的标签汤,以上开始是你的标签汤澄清面包屑。
大多数网站实际上并没有使用好的(或任何)标签汤。例如,您有多少次在网站上查看销售CD,并希望深入查看金属CD(例如),但点击左侧的“摇滚和金属”链接取出顶级金属类别,而不是当前浏览状态的过滤器。
那么 - 您的问题实际上是一个标签汤,您正在应用错误的层次结构?您是否应该查看可以将项目传递到的自动标记生成库,以及标记查找机制?好的,我确信你的个人网站不够复杂,不需要标签搜索,但总的来说,我认为值得考虑。