构建无限类别深度的面包屑 - PHP + SQL

时间:2011-04-05 20:47:57

标签: php mysql sql breadcrumbs

我希望能够为内容页面构建面包屑,但是一段内容所包含的类别可以具有无限深度,所以我不确定如何在不获取内容的情况下进行操作每个类别一个接一个,然后得到它的父母等。看起来它可能是一个更简单的方法,但我无法弄清楚。

我有一篇文章表

article_id
article_name
article_cat_id

我还有一个类别表

cat_id
cat_name
cat_parent

Cat parent是另一类别的id,其中一个类别是孩子。

想象一篇文章有​​5个类别,据我所知,我必须构建像这样的面包屑(示例代码显然输入应该被转义等)

<?php
$breadcrumbs = array(
    'Category 5',
    'Content Item'
);
$cat_parent = 4;

while($cat_parent != 0) {
    $query = mysql_query('SELECT * FROM categories WHERE cat_id = '.$cat_parent);
    $result = mysql_fetch_array($query, MYSQL_ASSOC);
    array_unshift($breadcrumbs, $result['cat_name']);
    $cat_parent = $result['cat_parent'];
}
?>

这会给我

array(
'Category 1',
'Category 2',
'Category 3',
'Category 4',
'Category 5',
'Content Item'
)

我可以将其用于我的面包屑,但是我带了5个查询来做这件事,这不是很好。

有人可以建议任何更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

为了简单起见,这里有一些简单的选项:

  1. 坚持您的设计,使用递归/迭代方法,享受简单代码带来的好处。真的,这将带你走得很远。作为奖励,从更复杂的设置更容易从这里转移到更高效的设置。

  2. 如果类别的nr不是很大,您可以选择所有类别并在PHP中构建层次结构。由于页面大小,获取1行所需的工作量与其中的一大堆(比如几百)完全相同。这最大限度地减少了查询/网络跳闸的次数,但增加了通过电缆传输的数据量。测量<!/ p>

  3. 缓存层次结构并在每个X单位时间或每当添加/修改/删除类别时完全重新加载。在它最简单的形式中,缓存可以是一个PHP文件,其中包含整个类别层次结构的嵌套变量结构,以及节点的简单索引。

  4. 创建一个附加表,在该表中,您可以使用嵌套集,路径枚举,闭包表等以某种方式展平层次结构。将使用类别表上的触发器维护表。

    < / LI>

    我会选择(1),除非您确定在不久的将来每秒会有几个用户的持续负载。 (每秒1个用户每月访问量达到250万次)。

    简单代码没有任何问题。使代码变得复杂并不明显是错误的。

答案 1 :(得分:2)

在关系数据库中有两种常用的处理分层数据的方法:邻接列表模型嵌套集模型。您的架构目前正在遵循邻接列表模型。查看this page以获取一些示例查询。另请参阅此处的question,其中包含大量有用的信息。