我想能够建立一个内容页面的面包屑,但类别的内容是在可以有无限的深度,所以我不知道如何去做它没有得到每个类别一个接一个,然后得到它的父等。这似乎是一个更简单的方法,但是我想不出来。
我有一个文章表
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个查询来做到这一点,这不是真正可取的。
谁能提出更好的解决方案?以下是一些简单的选项:
-
坚持现有的设计,使用递归/迭代方法,享受简单代码的好处。真的,这会让你走得很远。作为奖励,从这里转移到性能更高的东西比从更复杂的设置更容易。
-
如果类别的数量不是很大,你可以选择所有的类别并在PHP中构建层次结构。由于页面大小,获取1行所需的工作量与一大堆行(比如几百行)几乎是一样的。这将最小化查询/网络传输次数,但增加了通过电缆传输的数据量。测量!
-
缓存层次结构并在每X单位时间或每当添加/修改/删除类别时完全重新加载它。在最简单的形式中,缓存可以是一个PHP文件,其嵌套变量结构包含整个类别层次结构,以及节点的简单索引。
-
创建一个额外的表,在这个表中,你已经以某种方式使层次结构扁平化,可以使用嵌套集、路径枚举、闭包表等。该表将使用类别表上的触发器来维护。
我会选择(1),除非你相当确定在不久的将来你会有每秒几个用户的持续负载。(每秒1个用户,每月250万次访问)。
简单的代码没有错。为不明显的加速而使代码复杂化是错误的。
在关系数据库中有两种常用的处理层次数据的方法:邻接表模型和嵌套集模型。此处的模式当前遵循邻接表模型。查看此页面以获取一些示例查询。