Подскажите как лучше организовать данные

M7
На сайте с 30.11.2012
Offline
65
405

Хочу сделать каталог неограниченной глубины вложенности. Каким образом лучше организовать хранение данных?

Вижу 2 варианта

1. Держать все в базе

Id, parent_id, Kat_url, kat name

Главная категория / Подкатегория 1 / Подкатегория 2

При такой вложенности имея на входе данные "Подкатегории2" чтобы получить данные Подкатегории 1 и Главной категории необходимо сделать 3 запроса к базе. Это не есть гуд

2. Держать все в базе, но периодически формировать функцию, которая работает на основе оператора case


function get_kat_info($url)
{
switch ($url)
{
case "kategoria2":
$main_url="glavnaya_kategoria";
$sub_url="podkategoria1";
$main_title="Главная категория";
$sub_title=" Подкатегория 1";
break;
}
}

Какой вариант лучше? Понимаю что в идеале первый, но при большей вложенности увеличивается к-во запросов к базе, а при посещаемом ресурсе сервер будет "подвисать"..

edka
На сайте с 17.01.2010
Offline
208
#1

Можно сделать дополнительную таблицу с категориями и связями между ними.

Новая категория будет добавляться в таблицу и в одном из столбцов можно перечислять все другие категории с которыми она связана. Тогда можно все делать одним запросом к этой новой таблице.

Но если категории будут удаляться или меняться, придется скриптом пробегаться по таблице и вносить изменения в зависимые строки.

M7
На сайте с 30.11.2012
Offline
65
#2

По-моему гениально. Так и сделаю. Спасибо

Новая категория будет добавляться в таблицу и в одном из столбцов можно перечислять все другие категории с которыми она связана. Тогда можно все делать одним запросом к этой новой таблице.
S
На сайте с 23.05.2004
Offline
315
#3

для деревьев придуманы nested set. Поищите в яндексе , куча примеров как реализаций на пхп так и на тригерах в базе.

Это просто подпись.
rbbumfirst
На сайте с 03.04.2009
Offline
87
#4
Stek:
для деревьев придуманы nested set. Поищите в яндексе , куча примеров как реализаций на пхп так и на тригерах в базе.

Полностью поддерживаю. Использую деревья в нескольких проектах.

Web developer (http://rudov.com). разработка на Go, ReactJS, React Native

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий