[статья] Работа с DBTree

Макс

Старожил PHPClub
[статья] Работа с DBTree

http://max.phpclub.net/index.php?cid=6
Статья по работе с DBTree - класс suid-а (хранение деревьев в БД по методу Nested Sets).

Перед тем как отсылать ее Диме Лебедеву хотелось бы ваши замечания выслушать.

ЗЫ
кстати, если мне писать не дано - так прямо и скажите, чтобы я впредь не напрягался.
 

tony2001

TeaM PHPClub
>кстати, если мне писать не дано - так прямо и скажите, чтобы я впредь не напрягался.
ты себе льстишь =)
все отлично.

в суть не вникал - я не разбирался с DBTree, но все остальное - ок.
 

Alexandre

PHPПенсионер
теоретически - все ОК,
а практически - я пользуюсь своим (двухпроходным) алгоритмом по парсингу дерева.
 

idencial

Одинаковый
1.
При самом первом входе в узел нужно "оставить" цифру в его правом углу и при последнем выходе из узла нужно оставить цифру в правом углу.
Кажись здесь опечатался
Когда входишь оставляешь в левом углу

2. Видимо хотел использовать $field_names, но забыл (или я что-то не понял)

И вопрос: с чем связан тот факт, что у suid-а общий ключ по трем полям, а у тебя по 1.
Как будет лучше работать?
 

Макс

Старожил PHPClub
idencial
спасибо за замечания.
1. исправил
2. исправил
индекс конечно же правильный у suid-а
 

idencial

Одинаковый
индекс конечно же правильный у suid-а
А чем он лучше?
В статье Jelco, например он предлагает сделать индекс по одному из смещений (правое, левое)

2tony2001
А ты как деревья хранишь? Собственный класс для работы с вложеннымимножествами или что-то еще?

2Alexandre
Что за двухпроходный алгоритм?
Парсинг дерева, а хранишь как? nested sets ot not?
 

Макс

Старожил PHPClub
А чем он лучше?
Для чего вообще индексы создают ? Для ускорения выборки из таблицы.
Исходя из чего создается тот или иной индекс ? Исходя из запросов, которые выполняются.
При индексе (cat_left, cat_right, cat_level) все запросы можно подогнать под этот него. Специально этим я не занимался, так как в моих задачах в дереве было не более 500 узлов
 

idencial

Одинаковый
Просто когда индекс cat_left, например, я пишу
.... where cat_left=cat_right-1
и получаю от него выгоду

Какже должен выглядеть запрос, который бы давал большое приемущество при индексе (cat_left, cat_right, cat_level)?
 

idencial

Одинаковый
Спасибо, я разобрался.
Т.е надо учитывать что не будут работать индексы с просто cat_right и (cat_left & cat_lev), т.е нужно чтобы столбцы образовывали крайний слева префикс этого индекса
 

Кром

Новичок
У меня мелкие придирки:

1.
$table="categories";
$query="SELECT * FROM emp ORDER BY cleft ASC";

2.
cid int(10) unsigned NOT NULL auto_increment,
$id_name="pcid";

И писать лучше в таком ключе:
Давайте создадим файл insert.php и в него запишем то-то и то-то.

Теперь создадим файл index.php в котором будем делать выборку
Туда пишем соответственно
require_once ... плюс все то, что нужно для работы с CDataBase
потом:
$dbh = new CDataBase("", "localhost", "root", "");
и сам код
$query = "SELECT * FROM categories ORDER BY cleft ASC";
и т.д.
Это, я думаю, более наглядно для новичков.
 

Макс

Старожил PHPClub
Кром
1 и 2 исправил
а вот насчет стиля написания - чесно говоря, меня раздражают статьи, написанные в таком стиле и мне сложно так писать.

idencial
да, все верно
 

Rin

*
Баг в классе dbtree от su1d в методе insert()

[sql]UPDATE IGNORE ...[/sql]

Смотрим документацию по mySQL.
"Если указывается ключевое слово IGNORE, то команда обновления не будет прервана, даже если при обновлении возникнет ошибка дублирования ключей. Строки, из-за которых возникают конфликтные ситуации, обновлены не будут."
 

inTox

вёбных дел мастер
Maxim Matyukhin
спасибо, помогло разобраться, хотя и раньше читывал об Nested Sets. наверное попробую перейти с архитектуры id - pid... Хотя еще подумаю.
 

Rin

*
Добавление к предыдущему моему сообщению.

Если на поля таблицы БД (cat_left, cat_right, cat_level) - сделан уникальный индекс, то "IGNORE" нужно убрать из SQL-запроса и добавить в конце "ORDER BY cat_left DESC"
 

StUV

Rotaredom
Maxim Matyukhin
немного оффтопа:
имхо, цвет комментсов в пхп-коде неплохо бы было изменить
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Для того чтобы, допустим, раздел 4 сделать подразделом раздела 10, надо сделать очень много mysql-запросов, я правильно понимаю?
 

Ramzes

Новичок
имхо, пока сам класс DBTree "в глубокой бете" статью выкладывать нельзя, хотя теоретическую часть по теории деревьев оставить можно :))
 

Макс

Старожил PHPClub
Ramzes
пояснишь свое мнение ?
AFAIK все кроме moveAll работает.
 
Сверху