Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: опять про деревья

Сообщения:  [1-7] 

 
 автор: nikk   (14.10.2006 в 19:04)   письмо автору
 
   для: Trianon   (14.10.2006 в 14:50)
 

>Я хотел спросить сколько примерно записей в таблице Razdel?
Много.
В будущем будет порядка сотен пяти ... не пожалуй 1000-2000 а то и больше

Теперь я понял ваш вопрос. Загружать в память дерево целиком нереально.
В структуре предпринята попытка рассматривать сущность Razdel как некий универсальный контейнер, ссылающийся на другие сущности. поэтому экземпляров Razdel-а получается много

   
 
 автор: Trianon   (14.10.2006 в 14:50)   письмо автору
 
   для: nikk   (13.10.2006 в 23:53)
 

Это длина пути, как я понимаю, 4-5 шагов.
Я хотел спросить сколько примерно записей в таблице Razdel?

   
 
 автор: nikk   (13.10.2006 в 23:53)   письмо автору
 
   для: Trianon   (12.10.2006 в 16:01)
 

Не совсем понял вопрос. ..
Дерево в среднем из 4-5 шагов.

Насколько сложно загружать в память?? Не понял вопроса.

   
 
 автор: Trianon   (12.10.2006 в 16:01)   письмо автору
 
   для: nikk   (12.10.2006 в 13:26)
 

А дерево разделов очень большое?
Насколько сложно его целиком загружать в память?

   
 
 автор: nikk   (12.10.2006 в 13:26)   письмо автору
 
   для: cheops   (12.10.2006 в 12:24)
 

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

   
 
 автор: cheops   (12.10.2006 в 12:24)   письмо автору
 
   для: nikk   (12.10.2006 в 01:55)
 

Хм... что не очень понятно зачем требуется рекурсия. Вам нужно просто для документа получить названия разделов в которые он входит? Просто осуществите запрос
SELECT Razdel.*
FROM Razdel, Doc_Razdel
WHERE Razdel.ID = Doc_Razdel.Razdel_ID AND
Doc_Razdel.Doc_DocID = 45

где 45 - первичный ключ текущего документа. Или требуется что-то другое?

   
 
 автор: nikk   (12.10.2006 в 01:55)   письмо автору
 
 

Здравствуйте.
Подскажите, пожалуйста, метод или направление – куда двигаться или оптимизаровать структуру базы для реализации древовидной структуры сайта.
***************
Что есть:
База содержит разделы сайта. Разделы древовидно структурированы. В базе это реализовано следующим образом:
Раздел имеет ID и ID родителя – parentID
Вот дамп:

-- 
-- Структура таблицы `Razdel`
-- 
CREATE TABLE IF NOT EXISTS `Razdel` (
  `ID` int(11) NOT NULL default '0',
  `ParentID` int(11) default NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Далее база содержит документы. Документы могут входить в 1 или несколько разделов. Поэтому между сущностями Документ и Раздел реализована связь много-ко-многим с помощью дополнительной таблицы `Doc_Razdel`


-- 
-- Структура таблицы `Doc`
-- 
CREATE TABLE IF NOT EXISTS `Doc` (
  `DocID` int(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


-- 
-- Структура таблицы `Doc_Razdel`
-- 

CREATE TABLE IF NOT EXISTS `Doc_Razdel` (
  `Doc_DocID` int(10) NOT NULL default '0',
  `Razdel_ID` int(10) NOT NULL default '0',
  PRIMARY KEY  (`Doc_DocID`,`Razdel_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Добавим в базу данные для примера:


-- Дамп данных таблицы `Doc_Razdel`
INSERT INTO `Doc_Razdel` (`Doc_DocID`, `Razdel_ID`) VALUES (1, 1);
INSERT INTO `Doc_Razdel` (`Doc_DocID`, `Razdel_ID`) VALUES (2, 3); 
INSERT INTO `Doc_Razdel` (`Doc_DocID`, `Razdel_ID`) VALUES (3, 1);
INSERT INTO `Doc_Razdel` (`Doc_DocID`, `Razdel_ID`) VALUES (3, 3); 
-- 
-- Дамп данных таблицы `Doc`
INSERT INTO `Doc` (`DocID`) VALUES (1);
INSERT INTO `Doc` (`DocID`) VALUES (2);
INSERT INTO `Doc` (`DocID`) VALUES (3);
-- 
-- Дамп данных таблицы `Razdel`
INSERT INTO `Razdel` (`ID`, `ParentID`) VALUES (0, NULL);
INSERT INTO `Razdel` (`ID`, `ParentID`) VALUES (1, 0);
INSERT INTO `Razdel` (`ID`, `ParentID`) VALUES (2, 0);
INSERT INTO `Razdel` (`ID`, `ParentID`) VALUES (3, 2); 




Задача:
С наименьшими затратами выдергивать из базы информацию о расположении документа в дереве разделов.
Т.е.
Для Документа 2 должно выйти
– Раздел 0
– Раздел 2
- Раздел 3 -
- Документ 2
А для документа 3 должны получиться 2 ветки дерева:
– Раздел 0
– Раздел 2
- Раздел 3 -
- Документ 3
-------и ------------
– Раздел 0
- Раздел 1 -
- Документ 3

Глубина первичного раздела для документа заранее неизвестна.
Количество первичных разделов для документов тоже неизвестно.
Хочется обойтись без рекурсии (это почти критично – и так запросов получается много)
Сейчас пока это сделано одним запросом с помощью кучи левых соединений. Выглядит это ужасно, и к тому же, имеет фиксированную «глубину», что плохо.


Подскажите, пожалуйста, куда копать и как быть??

   

Сообщения:  [1-7] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования