Nested Sets in MySQL (phpDbTree) vs. XML

Snook

Новичок
Nested Sets in MySQL (phpDbTree) vs. XML

Добрый день (ночь).
Вобщем у меня стал такой вопрос.
Необходимо реализовать комментарии на посты|новости|статьи (далее посты) в древовидной структуре. Т.е. чтобы было видно кто кому отвечает.

Отобрал поидее всего 2 варианта:
1. Nested sets где root элемент, первый уровень сами посты, второй и далее комментарии.
2. Обычная таблица с постами. Комментарии хранить в XML (в базе отдельной колонкой, либо на винте по файлам) соответственно с сохранением структуры

Остальные варианты как бы изврат и больше не загонялся не над чем.

Плюсы первого метода - Удобство хранения, извлечения данных.
Плюсы второго метода и тут же минус первого - Когда набирается много постов, много комментариев, таблица дерева будет иметь мноого записей. + к тому эта таблица постоянно увеличивается и увеличивается нагрузка при извлечении и изменении данных.
В случае хранения в XML, те посты которые старые они как бы и не забивают своими комментариями таблицу дерева т.к. там и не хранятся. Соответственно нагрузка со временем не так резко увеличивается как в первом случае. Думаю понятно объяснил...

Что касается недостатков второго метода то это наверно что надо каждый раз парсить XML. Но если документ будет небольшой (до 100 комментариев) то поидее должно быстро работать с использованием DOM. + К этому поидее кеш никто не отменял. В случает с dbtree тоже кеш не отменяли, но таблица то всёравно быыыстро растет. И даже вставка будет занимать много времени. Почему я так подумал про время - потому что дома у dbtree (http://dev.e-taller.net/dbtree/) лежат скрины в бенчмарками http://dev.e-taller.net/dbtree/benchmark02.png и весьма неутешительными результатами. С 1500 записями вставка занимает 12 сек. Так 1500 это 100 посто с 10-20 комментариев. А что будет когда вырастем до 10 или 10К....

Вобщем кто что думает по этому поводу и какие можете предложить решения.
 

Vallar_ultra

Любитель выпить :)
Nested sets - это теперь религия такая что-ли?!

>С 1500 записями вставка занимает 12 сек.

Логично, посмотри ЧТО такое этот формат хранения древовидных стр-р....

берешь - делаешь обычное дерево, id | pid | id_новостей или какой-там тебе приспичило фигни | коммент

как из такой стр-ры сделать выборку надеюсь объяснять не надо?
 

Snook

Новичок
Причём тут религия.

Нет не надо объяснять. Просто наверно быстрее будет распарсить XML чем построить структуру комментариев на странице из такой структуры данных как ты предложил.
А насчёт Nested Sets выводится проще простого, делаешь order by cleft и всё готово.
Я вот не хотел браться тест писать но вот тока что начал, попробую посмотрю как будет с XML.
 

Vallar_ultra

Любитель выпить :)
>Просто наверно быстрее будет распарсить XML чем построить структуру комментариев на странице из такой структуры данных как ты предложил

Т.е. одним проходом упихать в нужную тебе стр-ру, закэшить её до следующей вставки или обновления/удаления и апдейтиить только кэш для тебя дольше чем каждый раз запущать xml-парсер, разбирать это удовольствие в древовидную стр-ру, а при добавлении, изменении или удалении коммента переписывать xml быстрее?????
 

Snook

Новичок
>> а при добавлении, изменении или удалении коммента переписывать xml быстрее?????
Т.е. при использовании БД не потребуется якобы обновлять эти данные :)

>> Т.е. одним проходом упихать в нужную тебе стр-ру, закэшить её до следующей вставки или обновления/удаления и апдейтиить только кэш для тебя дольше чем каждый раз

А чем не применим этот ход мыслей при использовании XML? Т.е. представь что ты говорил о XML, будет какая нить разница? :)


Другой вопрос что вот щас попробовал написать скрипт простенький которые с помощью DOM создает XML документ якобы с комментариями и попинать его с помощью ab - всего 6 запросов в секунду... некрасиво. Медленно это добро работает..
 

Vallar_ultra

Любитель выпить :)
Snook
В поиск, тут такое кол-во примеров на тему того: почему хранить данные в xml вместо database плохо и не фен-шуй!

-~{}~ 17.04.07 01:53:

>Т.е. при использовании БД не потребуется якобы обновлять эти данные

Ты напишешь скрипт на ПеХаПе который будет работать быстрее на обновление чем база?! сможешь - с меня коньяк = )
 

Wicked

Новичок
Остальные варианты как бы изврат и больше не загонялся не над чем.
улыбнуло :) т.е. по-твоему
2. Обычная таблица с постами. Комментарии хранить в XML (в базе отдельной колонкой, либо на винте по файлам) соответственно с сохранением структуры
— не изврат?

Плюсы второго метода и тут же минус первого - Когда набирается много постов, много комментариев, таблица дерева будет иметь мноого записей.
много - это сколько?
+ к тому эта таблица постоянно увеличивается
батюшки!
и увеличивается нагрузка при извлечении и изменении данных.
при извлечении? и что, сильно увеличивается? f:confused:

при изменении да, у nested sets с этим есть проблемы. Но достаточно сделать вместо одного дерева лес деревьев (по дереву на каждый пост), и проблема решается.

И в этих условиях "С 1500 записями вставка занимает 12 сек." интерпретируется не как "1500 это 100 посто с 10-20 комментариев.", а как "1500 это 1 пост с 1500 комментариями". При этом 12сек - это вставка не одного комментария, а всех 1500 за раз. Как часто тебе потребуется такая операция? Никогда.

PS: «premature optimization is the root of all evil» c Knuth
 

Snook

Новичок
Автор оригинала: Wicked
улыбнуло :) т.е. по-твоему
— не изврат?
Ну если по твоему изарвт работа с XML файлами то я в танке. Единственное что после теста оказалось что это медленно, но медленно это не значит изврат.

Автор оригинала: Wicked
при изменении да, у nested sets с этим есть проблемы. Но достаточно сделать вместо одного дерева лес деревьев (по дереву на каждый пост), и проблема решается.
О таком варианте я тоже думал. Просто в этом случае придётся переделать немного какой то из существующих классов для работы с этими самыми деревьями, потому что они воспринимают всю таблицу как одно дерево.
Может есть ужё что то готовое?

Поидее подправить тот же класс проще чем делать что то новое...
 

Vallar_ultra

Любитель выпить :)
Wicked
>при изменении да, у nested sets с этим есть проблемы. Но достаточно сделать вместо одного дерева лес деревьев (по дереву на каждый пост), и проблема решается.

Ээээ, и позволить РНР-скрипту создавать свои таблици под хранение каждого дерева?


Snook
>Ну если по твоему изарвт работа с XML файлами то я в танке. Единственное что после теста оказалось что это медленно, но медленно это не значит изврат.

Ты в танке. Шлем давать?
 

Фанат

oncle terrible
Команда форума
Ну, ну очевидно человек бредит.
Причем сам этого не сознает.
Разговаривать с такими бесполезно.
 

Snook

Новичок
Автор оригинала: Vallar_ultra
Ээээ, и позволить РНР-скрипту создавать свои таблици под хранение каждого дерева?
Зачем создавать таблицы, можно просто в одной таблице добавить ещё tree_id (news_id ну или что угоддно), и для каждого tree_id будет свое дерево.

Автор оригинала: Vallar_ultra
Ты в танке. Шлем давать?
Давай.

-~{}~ 17.04.07 11:39:

Автор оригинала: Фанат
Ну, ну очевидно человек бредит.
Причем сам этого не сознает.
Разговаривать с такими бесполезно.
Тыкни пальцем где кто бредит...
 

Vallar_ultra

Любитель выпить :)
Snook
Мля... тебя же ТАК беспокоил размер таблицы.... твой приславутый tree_id - это вообще-то ключ на комментируемую сущность.

Шлем не дам, т.к. боюсь что ты останешся после этого в танке на всегда.
 

Фанат

oncle terrible
Команда форума
увеличивается нагрузка при извлечении и изменении данных.
бред.
если по твоему изарвт работа с XML файлами то я в танке. Единственное что после теста оказалось что это медленно
бред.
причем даже собственным глазам не веришь.
клиника
 

Snook

Новичок
Автор оригинала: Фанат
бред.

бред.
причем даже собственным глазам не веришь.
клиника
Втыкни плз сначала - http://dev.e-taller.net/dbtree/benchmark02.png

Насчёт скорости то по твоему 6 запросов в секунду на документе который просто генерит XML документ и выводит его это нормально? Естественно я не на мегасервере тестил но всёравно это мало.
 

Vallar_ultra

Любитель выпить :)
все. санитары в студию! больному пора делать прививку от бешенства.
 

Фанат

oncle terrible
Команда форума
Тебе сказали уже, дуремару, что нестед сетс - это не синоним деревьев в бд.
В фак отправился, бегом. читать про деревья
 

Snook

Новичок
Автор оригинала: Vallar_ultra
Snook
Мля... тебя же ТАК беспокоил размер таблицы.... твой приславутый tree_id - это вообще-то ключ на комментируемую сущность.

Шлем не дам, т.к. боюсь что ты останешся после этого в танке на всегда.
Понятно что такое tree_id.
Меня беспокоил не размер таблицы, а быстродействие. В случае если это будет одно дерево на все сущности, то при добавлении элемента в это дерево надо обновлять большую часть веток, а есл поточнее то изменить cleft и crigрt у всех элементов которые правее парента вставки. Т.е. обвновляются не только комментарии для данной сущность в всё (условно всё) дерево.
Если делать с tree_id то при добавлении коментария на сущность никакие другие сущности не затрагиваются. И получается не 1 дерево с 1000 ветвей а например 100 деревьев по 10 ветвей.
Соответственно получаем быстродействие дерева с 10 ветвями а не с 1000.

А шлем давай, я его на полку поставлю :).
 

Фанат

oncle terrible
Команда форума
Vallar_ultra
Не попридержать ли тебе язычок, а? А то ведь и прищемить его можно
 

Snook

Новичок
Автор оригинала: Wicked
жесть :)
какие такие 6 запросов в секунду? :)
Вроде бы выше писал...
Сделал просто скрипт. Создает DOMDocument, пихает туда пару десятков узлов и выводит на экран.
потом сделал ab -n 1000 URL, получил результат 6 запросов в секунду. так понятно?
 
Сверху