0

我正在使用邻接列表模型在我的网站中查找子类别。我有工作 PHP 代码来查找所有类别和子类别,但现在我无法弄清楚如何使用它来创建导航系统。以下是该网站的工作方式,非常基本:

URL 字符串 会有一个主类,后面是层级

index.php?category=category-name&level1=sub-category&level2=another-sub-category&level3=content-item

稍后我将制作 SEO 友好的链接。

没有子类别的 URL 其中级别 1 是内容项

www.website.com/category/content-item/

带有子类别的 URL 其中级别 1、2、3 等是子类别,最终级别是内容项

www.website.com/category/sub-category/sub-category-2/content-item/

这是我用来查找类别和子类别的代码。目前它只输出所有类别和子类别的列表以及每个孩子的级别。不确定这是否有帮助,它只是创建一个列表。

    function display_children($ParentCategoryID, $Level) {

        // retrieve all children of parent

        if ($ParentCategoryID == ''){
            $Result = mysql_query('SELECT * FROM categories WHERE parent_category_id IS null');
        }
        else{
            $Result = mysql_query('SELECT * FROM categories WHERE parent_category_id="'.$ParentCategoryID.'";');
        }

        // display each child
        while ($Row = mysql_fetch_array($Result)) {

            echo str_repeat('-',$Level)."[".$Level."]".$Row['category_name']."<br />";

            display_children($Row['category_id'], $Level + 1);

        }

    }
4

1 回答 1

0

有关如何在数据库中表示分层数据的选项,请首先查看此问题。

邻接列表非常简单,并且使更改变得容易,但可能很糟糕,因为它会导致递归代码,例如上面的函数,在实践中,这是负载下的性能杀手。在不更改数据模型的情况下,最好的方法是使用 MySQL 会话变量在一次查询中检索整个层次结构,这会在一次数据库调用中带回您需要的所有数据。即使这会导致负载下的性能不佳 - 不如递归函数 - 但仍然不好;而且,我是根据经验写的:)。

如果是我,我会使用嵌套集、邻接表和一些非规范化,例如桥表和平面表,或者只是一个沿袭表。实际上取决于数据更改的频率以及您是否需要轻松完成这些更改。所有这些选项都应该更快,而不是仅仅依赖于父子 ID 列。

于 2012-01-27T10:44:08.543 回答