Древовидное меню с помощью MySQL

  • Автор темы Perf2k2
  • Дата начала

Perf2k2

Guest
Древовидное меню с помощью MySQL

Здравствуйте. У меня тут проблем-ка образовалась. Мне нужно сделать древовидное меню.
В связи с этим вопрос: как бы это изобразить?
Только не надо отсылать меня к UltraTree и т.д. Я на этом форуме уже нашел тему, где все это обсуждается - там как раз речь шла о
деревьях. Я поставил UT, у меня все хорошо заработало, только мне не понятно как этот скрипт устроен. Не хочу пользоваться тем,
чего я не понимаю. И вторая проблема: UT предназначен для неограниченной вложенности, а мне нужна всего лишь одноразовая вложность,
типа такого:
Авто
- Автосеривисы
- Автосалоны
и т.д.
Я пробовал сам сделать, только все мои попытки заканчивались одним и тем же - браузер не выдавал ничего, потому что не заканчивал грузиться.
Вообщем у меня мой скрипт выполнялся минут 7 на локалке. Многовато :)
Как ни пробовал - и с 20 запрсами к базе и с одним (работал с массивом полученным) - эффект нулевой. Совсем отчаялся. Помогите.

Таблица вида:
cid | name | parent

cid - id категории
name - имя
parent - id родителя данной категории, если 0 - эта категория сама родитель.
 

alpes

Весь мир на ладони
>Вообщем у меня мой скрипт выполнялся минут 7 на локалке

А индексы расcтавлены?
 

Perf2k2

Guest
alpes, в таблице записей - 7 штук. Что с индексом, что без - для 7 записей он ничего не значит. По-моему это все из-за моего извращенского кодинга.
 

Zaval

Новичок
Из простого...
Используй сам принцип, вытянул из старого.
PHP:
// ВЫЗОВ --> start_menu("menu"); где menu - название таблицы в БД

function start_menu($from) {
	$res=mysql_query("SELECT id,sub_id,url,name FROM ".$from."
  WHERE sub_id=0") or die(err_str(1002));
	while($row=mysql_fetch_array($res))
  {
		menu($row['id'],$row['name'],"",$from);
	}
}
function menu($id, $name, $url, $from) {
	$res = mysql_query("SELECT id, sub_id, url, name FROM ".$from."
  WHERE sub_id = $id") or die(err_str(1002));
 	if (mysql_num_rows($res) > 0)
  {
  echo "<LI><A HREF=\"#\" ONCLICK=\"return false\">&nbsp;".$name."</A></LI><UL>";
		while($row = mysql_fetch_array($res))
    {
			menu($row['id'], $row['name'], $row['url'], $from);
		}
  	echo "</ul>";
 	}
 	else
 	{
    echo "<LI><A HREF=\"".$url."\" target=\"io\">".$name."</A></LI>";
 	}
}
 

Crazy

Developer
Древовидное МЕНЮ обычно подразумевает достаточно небольшое количество элементов и в большинстве случаев реализуется просто: древовидную структуру сериализуем в строку и момещает в текстовое поле, а то и в файл.

Для простых проблем нужно стараться использовать простые решения...
 

Perf2k2

Guest
Zaval, спасибо, буду пробовать, разбираться. Если чето не понятно будет, спрошу.

Crazy, каталог ссылок делаю. Поэтому надо чтобы они в БД хранились - чтобы удобно было делать связь между таблицами каталогов и сайтов, а также удобную сортировку.
 

Crazy

Developer
Если ты делаешь не меню, а двухуровневый каталог, то решение очевидно: два таблицы (первый и второй уровни) и никаких деревьев.
 

Crazy

Developer
SeazoN, зачем ДЕРЕВО, т.е. структуру данных с произворльной глубиной, использовать для представления строго двухуровневых данных?

Из пушки по воробьям?
 

Crazy

Developer
Автор оригинала: SeazoN
сначала двухуровневые, потом захочется больше, но будет поздно
С таким подходом нужно сразу на J2EE переходить -- ВДРУГ потом захочется БОЛЬШЕГО, но будет уже поздно. :D
 

Perf2k2

Guest
Если ты делаешь не меню, а двухуровневый каталог, то решение очевидно: два таблицы (первый и

второй уровни) и никаких деревьев.
Мда... Чето я не подумал... Ладно, поздняк метаться. Мне кажется, что с двумя таблицами посложней будет работать, нежели с одной. Да и не любля я когда много таблиц.
 

Perf2k2

Guest
Zaval Да, мне тоже так кажется. Еще раз спасибо за код.
Crazy, а что такое J2EE?
 

Crazy

Developer
Автор оригинала: Perf2k2
Мне кажется, что с двумя таблицами посложней будет работать, нежели с одной.
:) Если б было так, то СУБД вообще поддерживали бы по одной таблице на базу -- чтобы программисты не уродовались. :)
 

Absurd

Guest
2 MY mind не стоит использовать кучу запросов с рекурсивными
вызовами. Особенно в интерпретируемых языках наподобие
PHP. Существует структура данных, позволяющая вытянуть
древовидный отчет с помощью одного-единственного
SELECT'а.

Если интересно, зрите сюда:
http://www.codenet.ru/db/trees/
 

Crazy

Developer
Absurd, какой смысл давить на интерпретируемость, если основное время съест SQL-сервер?
 

Absurd

Guest
Автор оригинала: Crazy
Absurd, какой смысл давить на интерпретируемость, если основное время съест SQL-сервер?
Вообще мне лень разбираться каким образом
организована уборка мусора в PHP, какой размер
занимают переменные типа массив и строка,
используется ли интеллектуальное ленивое-опережающее вычисление выражений либо по тупое прямолинейное вычисление оных, насколько интерпретатор стремится избегать лишних копирований, реализованы ли ассоциативные массивы как хэш-списки либо как
красно-черные деревья, etc.

Но какой смысл делать рекурсивную функцию, если можно ее не делать, а выполнить один лишь SELECT?
Кроме того, результат этого SELECTа можно элементарно раскидать по разным страницам с помощью LIMIT.
 

Crazy

Developer
Шеф, мой вопрос касался интерпретируемости. Судя по тому, как настойчиво ты уводишь тему в сторону, конкретно этот термин был употреблен без особого смысла?

P.S. А сколько умных слов, употребленных без нужды -- это просто рекорд месяца... :) Особенно понравилось "интеллектуальное ленивое-опережающее вычисление". :) Красно-черные деревья... Люблю. :)
 
Сверху