Forum Webscript.Ru
Программирование => PHP => Тема начата: 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?
-
golden-den
ИМХО в прямом смысле, отдельно в отдельной таблице со связуешими полями с данной таблицей.
-
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
в методе getNodeInfo($ID) (да и в других)
есть выражение
return array((int)$Data[$this->left], (int)$Data[$this->right], (int)$Data[$this->level]);
что означает (int)$data?
-
приведение значения $Data[$this->left] к int-у