|
|
|
| Здравствуйте.
Подскажите, пожалуйста, метод или направление – куда двигаться или оптимизаровать структуру базы для реализации древовидной структуры сайта.
***************
Что есть:
База содержит разделы сайта. Разделы древовидно структурированы. В базе это реализовано следующим образом:
Раздел имеет 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
Глубина первичного раздела для документа заранее неизвестна.
Количество первичных разделов для документов тоже неизвестно.
Хочется обойтись без рекурсии (это почти критично – и так запросов получается много)
Сейчас пока это сделано одним запросом с помощью кучи левых соединений. Выглядит это ужасно, и к тому же, имеет фиксированную «глубину», что плохо.
Подскажите, пожалуйста, куда копать и как быть?? | |
|
|
|
|
|
|
|
для: 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 - первичный ключ текущего документа. Или требуется что-то другое? | |
|
|
|
|
|
|
|
для: cheops
(12.10.2006 в 12:24)
| | Не совсем так.
Требуется получить всю ветку дерева до "корня" независимо от длинны этой ветки и не зная длинну заранее. | |
|
|
|
|
|
|
|
для: nikk
(12.10.2006 в 13:26)
| | А дерево разделов очень большое?
Насколько сложно его целиком загружать в память? | |
|
|
|
|
|
|
|
для: Trianon
(12.10.2006 в 16:01)
| | Не совсем понял вопрос. ..
Дерево в среднем из 4-5 шагов.
Насколько сложно загружать в память?? Не понял вопроса. | |
|
|
|
|
|
|
|
для: nikk
(13.10.2006 в 23:53)
| | Это длина пути, как я понимаю, 4-5 шагов.
Я хотел спросить сколько примерно записей в таблице Razdel? | |
|
|
|
|
|
|
|
для: Trianon
(14.10.2006 в 14:50)
| | >Я хотел спросить сколько примерно записей в таблице Razdel?
Много.
В будущем будет порядка сотен пяти ... не пожалуй 1000-2000 а то и больше
Теперь я понял ваш вопрос. Загружать в память дерево целиком нереально.
В структуре предпринята попытка рассматривать сущность Razdel как некий универсальный контейнер, ссылающийся на другие сущности. поэтому экземпляров Razdel-а получается много | |
|
|
|