именно этот момент я имел ввидуАвтор оригинала: Maxim Matyukhin
пояснишь свое мнение ?
AFAIK все кроме moveAll работает.
// SAMPLE DB TABLE STRUCTURE:
//
// 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)
// );
//
// This is believed to be the optimal Nested Sets use case. Use `one-to-one`
// relations on `cat_id` field between this `structure` table and
// another `data` table in your database.
опыт показывает, что структуру с обходом дерева лучше хранить отдельно от
данных, т.к. в этом случае при обновлении таблицы очень долго обновляются
индексы, да и данные могут сделать невозможным формат записи фиксированной
длины, что тоже кардинально скажется на скорости.
Самой оптимальной структурой по-моему будет:
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)
);
В итоге MySQL за многими запросами даже не будет обращаться к файлу с данными.
Ему будет хватать файла с индексами. А когда уже пройдёт всё фильтрование в
таблице с деревом, по примари-кею быстро произойдёт линкование с остальными
данными.

//подкатегория текущей
$dbh->query("begin");
$treepath[$clevel+1][]=$id=$Tree->insert ($treepath[$clevel][$level_enum],array());
if ($dbh->query("INSERT into $tableitems (id, code, name, timestamp) VALUES ('$id', '$str[1]', '$str[2]', '".time()."')"))
$dbh->query("commit");
else $dbh->query("rollback");
а самому попробовать ?Но будет ли это работать?
function delete($ID) {
if(!(list($leftId, $rightId, $level) = $this->getNodeInfo($ID))) die("phpDbTree error: ".$this->db->error());
$this->db->query('BEGIN');
// Deleting record
$this->sql = 'DELETE FROM '.$this->table.' WHERE '.$this->id.'=\''.$ID.'\'';
if(!$this->db->query($this->sql)) {
$this->db->query('ROLLBACK');
die("phpDbTree error: ".$this->db->error());
}
// Clearing blank spaces in a tree
$this->sql = 'UPDATE '.$this->table.' SET '
. $this->left.'=IF('.$this->left.' BETWEEN '.$leftId.' AND '.$rightId.','.$this->left.'-1,'.$this->left.'),'
. $this->right.'=IF('.$this->right.' BETWEEN '.$leftId.' AND '.$rightId.','.$this->right.'-1,'.$this->right.'),'
. $this->level.'=IF('.$this->left.' BETWEEN '.$leftId.' AND '.$rightId.','.$this->level.'-1,'.$this->level.'),'
. $this->left.'=IF('.$this->left.'>'.$rightId.','.$this->left.'-2,'.$this->left.'),'
. $this->right.'=IF('.$this->right.'>'.$rightId.','.$this->right.'-2,'.$this->right.') '
. 'WHERE '.$this->right.'>'.$leftId
;
if(!$this->db->query($this->sql)) {
$this->db->query('ROLLBACK');
die("phpDbTree error: ".$this->db->error());
}
$this->db->query('COMMIT');
return true;
}
Спасибо, попробую обязательно, как только поставлю муську 4.Автор оригинала: Maxim Matyukhin
а самому попробовать ?