Модель списка смежности + навигация по сайту - PullRequest
0 голосов
/ 24 января 2012

Я использую модель списка смежности, чтобы найти подкатегории на моем веб-сайте.У меня есть рабочий код PHP, чтобы найти все категории и подкатегории, но сейчас я не могу понять, как использовать это для создания навигационной системы.Вот как будет работать сайт, очень просто:

Строка URL Будет основная категория, за которой следуют уровни

index.php? Category =имя-категории & level1 = подкатегория & level2 = другая подкатегория & 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);

        }

    }

1 Ответ

0 голосов
/ 27 января 2012

Сначала посмотрите этот вопрос для опций о том, как представлять иерархические данные в базе данных. .

Список смежностей великолепен своей простотой и делает изменения простыми, но может быть ужасным, потому что онна практике приводит к рекурсивному коду, как, например, ваша функция выше, что снижает производительность под нагрузкой.Наилучший подход при отсутствии изменения модели данных - это с использованием переменных сеанса MySQL для извлечения всей иерархии в одном запросе , что возвращает все необходимые данные за один вызов базы данных.Даже это, хотя и приводит к низкой производительности под нагрузкой - меньше, чем рекурсивная функция - но все же не хорошо;и я пишу из опыта :).

Если бы это был я, я бы использовал «Вложенные наборы», «Список смежности» в сочетании с некоторыми денормализацией, такими как «Таблица мостов» и «Плоский стол», или просто «Таблица линейности».На самом деле зависит от того, как часто данные изменяются, и нужно ли вам легко выполнять эти изменения.Все эти параметры должны работать намного быстрее, а не полагаться только на столбцы ID родитель-потомок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...