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



我想能够建立一个内容页面的面包屑,但类别的内容是在可以有无限的深度,所以我不知道如何去做它没有得到每个类别一个接一个,然后得到它的父等。这似乎是一个更简单的方法,但是我想不出来。

我有一个文章表

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个查询来做到这一点,这不是真正可取的。

谁能提出更好的解决方案?

以下是一些简单的选项:

  1. 坚持现有的设计,使用递归/迭代方法,享受简单代码的好处。真的,这会让你走得很远。作为奖励,从这里转移到性能更高的东西比从更复杂的设置更容易。

  2. 如果类别的数量不是很大,你可以选择所有的类别并在PHP中构建层次结构。由于页面大小,获取1行所需的工作量与一大堆行(比如几百行)几乎是一样的。这将最小化查询/网络传输次数,但增加了通过电缆传输的数据量。测量!

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

  4. 创建一个额外的表,在这个表中,你已经以某种方式使层次结构扁平化,可以使用嵌套集、路径枚举、闭包表等。该表将使用类别表上的触发器来维护。

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

简单的代码没有错。为不明显的加速而使代码复杂化是错误的。

在关系数据库中有两种常用的处理层次数据的方法:邻接表模型嵌套集模型。此处的模式当前遵循邻接表模型。查看此页面以获取一些示例查询。

最新更新