Forum Webscript.Ru

Программирование => PHP => Тема начата: golden-den от 22 Февраля 2006, 21:24:23

Название: dbTree
Отправлено: golden-den от 22 Февраля 2006, 21:24:23
Решил попробовать работать с классом dbtree

Автор этого класса пишет:

опыт показывает, что структуру с обходом дерева лучше хранить отдельно от
данных, т.к. в этом случае при обновлении таблицы очень долго обновляются
индексы, да и данные могут сделать невозможным формат записи фиксированной
длины, что тоже кардинально скажется на скорости.
Самой оптимальной структурой по-моему будет:

CREATE TABLE categories (
cat_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
cat_left INT UNSIGNED NOT NULL,
cat_right INT UNSIGNED NOT NULL,
cat_level INT UNSIGNED NOT NULL,
PRIMARY KEY(cat_id)
KEY (cat_left, cat_right, cat_level)
);


Что значит структуру хранить отдельно?
Что отдельная таблица со ВСЕМИ свойствами ВСЕХ объектов, а связь при этом по полю cat_id?
Название: dbTree
Отправлено: for_i_0 от 22 Февраля 2006, 21:43:32
golden-den
ИМХО в прямом смысле, отдельно в отдельной таблице со связуешими полями с данной таблицей.
Название: dbTree
Отправлено: Макс от 23 Февраля 2006, 11:26:16
Цитировать
golden-den:
Что отдельная таблица со ВСЕМИ свойствами ВСЕХ объектов, а связь при этом по полю cat_id?

не совсем ясно что имеется ввиду под "всеми объектами".
Допустим у тебя есть древовидная структура категорий. У категории есть имя и еще какие-то поля, не имеющие прямого отношения к дереву.
Тогда создаешь одну таблицу как в этом примере и вторую:
CREATE TABLE category_names (
   cat_id int unsigned not null primary key,
   name varchar(128),
   .... // другие поля
);
Сначалов вставляешь данные в categories, получаешь идентификатор вставленной записи и потом вставляешь данные о категории :
INSERT INTO category_names (cat_id, name) VALUES($cat_id, $name);

Если у тебя на сайте есть еще какое-то дерево (например дерево комментариев) то для него свои 2 таблицы.

Это всего лишь рекомендация. Я например раньше деревья хранил в одной таблице - мне так было проще (особенно когда mysql был без поддержки транзакций).
Название: dbTree
Отправлено: golden-den от 23 Февраля 2006, 12:02:59
Макс
я это и имел ввиду.
спасибо
Название: dbTree
Отправлено: golden-den от 23 Февраля 2006, 12:04:56
вопрос как раз по коду dbTree
в методе getNodeInfo($ID) (да и в других)
есть выражение

return array((int)$Data[$this->left], (int)$Data[$this->right], (int)$Data[$this->level]);


что означает (int)$data?
Название: dbTree
Отправлено: Макс от 23 Февраля 2006, 18:20:10
приведение значения $Data[$this->left] к int-у