|
|
|
| Здравствуйте.
Недавно я столкнулся с проблеммой хранения деревьев в базе данных. Естественно начал поиски в интернете и набрёл на интересную статью http://phpclub.ru/detail/article/db_tree.
Всё бы и хорошё, но я столкнулся с проблеммной добовления ветвей в уже существующее дерево. В классе, который там описан, данная функция отсутствует, а в SQL я недостаточно силён. Может кто подскажет, как по всем правилам добавлять ветви в нужное мне место. | |
|
|
|
|
|
|
|
для: pengo
(03.08.2006 в 11:48)
| | хотя вот есть там такое:
function insert($ID, $data)
Метод для вставки узла в дерево. Параметры:
$ID - идентификатор родительского узла
$data - массив с обновленными данными. (параметры left, right и level вставлять не нужно)
|
но как это использовать в программе? | |
|
|
|
|
|
|
|
для: pengo
(03.08.2006 в 11:53)
| | Я бы посоветовал измененный класс DBtree
>но как это использовать в программе?
function insert(0, "Второй элемент"); // Где 0 ID родителя
|
| |
|
|
|
|
|
|
|
для: pengo
(03.08.2006 в 11:48)
| | Зачем всё усложнять, можно просто использовать одну таблицу в которой имеется первичный ключ и вторичный ключ, ссылающийся на первичный и добавлять новые записи по мере необходимости. | |
|
|
|
|
|
|
|
для: cheops
(03.08.2006 в 12:20)
| | >Зачем всё усложнять, можно просто использовать одну таблицу в которой имеется первичный ключ и вторичный ключ, ссылающийся на первичный и добавлять новые записи по мере необходимости
Я тоже к этому склоняюсь.
Может тогда подскажите, как на PHP организовать рекурсивную процедуру для вывода потомков для указанного родителя. | |
|
|
|
|
|
|
|
для: pengo
(03.08.2006 в 12:27)
| | С удовольствием, только уточните пожалуйста формат - как их выводить? Лестнично? | |
|
|
|
|
|
|
|
для: cheops
(03.08.2006 в 12:31)
| | наверное лестнично. В принципе с выводом можно будет самому поиграться. Буду весьма признателен.
Есчё, если можно, SQL-дамп таблицы. | |
|
|
|
|
|
|
|
для: pengo
(03.08.2006 в 12:39)
| | Пусть у нас имеется таблица, которая содержит первичный ключ id и вторичный ключ parent, который содержит значение id родителя (если это корневой каталог и родителя нет - принимает значение 0). Тогда функция рекурсивного спуска может выглядять так
<?php
function recurse($id, $count)
{
$count += 5;
$query = "SELECT * FROM tbl WHERE parent = $id";
$tbl = mysql_query();
if(!$tbl) exit("Ошибка синтаксиса ".mysql_error());
if(mysql_num_rows($tbl) > 0)
{
while($table = mysql_fetch_array($tbl))
{
echo str_repeat("&nbps;", $count).$table['name']."<br>";
recurse($table['id'], $count);
}
}
}
recurse(0, 0, $count);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(03.08.2006 в 13:54)
| | спасибо! | |
|
|
|
|
|
|
|
для: cheops
(03.08.2006 в 13:54)
| | а почему
ведь функция принимает только два параметра? | |
|
|
|
|
|
|
|
для: pengo
(03.08.2006 в 14:13)
| | Конечно же имеется ввиду вызов
| |
|
|
|
|
|
|
|
для: cheops
(03.08.2006 в 16:57)
| | Уважаемый cheops, а если мне необходимо спуститься по дереву не больше чем на 5 вложений. Как тогда организовать функцию. | |
|
|
|
|
|
|
|
для: pengo
(04.08.2006 в 12:20)
| | Проверяёте значение $count внутри функции - если оно больше 25, покидайте функцию при помощи оператора return. | |
|
|
|
|
|
|
|
для: cheops
(03.08.2006 в 13:54)
| |
// поправленый вариант
echo str_repeat(" ", $count).$table['name']."<br>";
| Я так понимаю это дерево можно применять для организауии каталогов любого уровня вложенности. А можно ли это дело как-то оптимизировать, чтоб не нагружать сильно базу.
И вообще как такие деревья оптимизируют?
И в итоге что быстрее и лучше. Куча маленьких запросов или один большой? Что быстрее базу завалит? | |
|
|
|
|
|
|
|
для: cheops
(03.08.2006 в 12:20)
| | Чтобы избежать рекурсии. | |
|
|
|
|
|
|
|
для: Loki
(03.08.2006 в 13:59)
| | Насколько я знаю, чтобы избежать рекурсии, придёться использовать вложенные процедуры в SQL-запросах. | |
|
|
|
|
|
|
|
для: pengo
(04.08.2006 в 10:14)
| | есть варианты. Как я уже сказал, можно использовать nested sets, можно завести поле со структурой дерева, можно рекурсию переложить целиком на php, оставив всего один запрос к базе, а можно использовать несколько левых объединений. Так что можно и без вложенных процедур:) | |
|
|
|
|
|
|
|
для: Loki
(04.08.2006 в 13:21)
| | > рекурсию переложить целиком на php оставив всего один запрос к базе
:)
с тем же успехом можно вообще базой не пользоваться. А хранить в тектовом файле. | |
|
|
|
|
|
|
|
для: Axxil
(04.08.2006 в 13:24)
| | на самом деле
select id, parent_id, name from tbl
|
а таблица может иметь еще сотню полей, так что с тем же успехом не получится:) | |
|
|
|