Вход на сайт
Mysql +PHP пару вопросов...
NEW 04.04.06 14:14
Привет всем. Сижу - ломаю голову . Как умно, быстро и наименьшими затратами ресурсов решить вот такую задачку:
Есть куча народу, собранных в пирамиду. Т.е. реферальная система. Один привел другого итп..
Есть база типа :
ID Name Refer
Так вот у меня проблема - как красиво и без ососбых затрат каждому пользователю вывести его структуру. Типа такой и тако находится на первом уровне, такой и такой на втором и так далее..
Пока есть только один вариант. Делаю выборку где Refer = ID(текущего пользователя). Имеем первый уровень... Потом берем полученный результат - делаем по каждой найденой записи опять поиск - получаем второй уровень итд... И всё это рекурсисей... Но насколько я представляю - при очень большой ветке - время вычислений будет большим и нагрузка на сервер тоже будет немалая.. вот теперь вопрос - есть ли решенее попроще ?
Есть куча народу, собранных в пирамиду. Т.е. реферальная система. Один привел другого итп..
Есть база типа :
ID Name Refer
Так вот у меня проблема - как красиво и без ососбых затрат каждому пользователю вывести его структуру. Типа такой и тако находится на первом уровне, такой и такой на втором и так далее..
Пока есть только один вариант. Делаю выборку где Refer = ID(текущего пользователя). Имеем первый уровень... Потом берем полученный результат - делаем по каждой найденой записи опять поиск - получаем второй уровень итд... И всё это рекурсисей... Но насколько я представляю - при очень большой ветке - время вычислений будет большим и нагрузка на сервер тоже будет немалая.. вот теперь вопрос - есть ли решенее попроще ?
---(¿) ---
Стань карлсоном - купи себе вентилятор
Стань карлсоном - купи себе вентилятор
NEW 04.04.06 14:33
в ответ Tomasson 04.04.06 14:28
NEW 04.04.06 14:35
в ответ Alexden 04.04.06 14:14
NEW 04.04.06 14:57
в ответ digital_pilot 04.04.06 14:35
NEW 04.04.06 14:58
в ответ Tomasson 04.04.06 14:44
NEW 04.04.06 15:09
в ответ Alexden 04.04.06 14:58
посмотри в Zend Studio: http://www.zend.com/de/products/zend_studio
Типичный случай. Возможно уже сделали такой элемент.
Надо будет только указать источник и несколько атрибутов.
Типичный случай. Возможно уже сделали такой элемент.
Надо будет только указать источник и несколько атрибутов.
NEW 04.04.06 15:31
Читать треды лень, напишу, что я использую в этом случае.
Делаю таблицу сущностей безо всяких ссылок, делаю таблицу связей, содержащую ID (сущности), ParentID и количество детей первого уровня. Для построения дерева (или части дерева, где корневым элементом будет сущность с заданным ID) читаю в память таблицу сущностей, читаю в память таблицу связей, в общем, строю два списка. Даже если таблицы огромные, за счёт того, что нет никаких джойнов всё быстро в память засасывается. Далее, допустим, в тривью отображаю всё, загоняю корневым узлом элемент из списка с заданным ID, далее находжу в таблице связей соответствующую запись. Далее в цикле (у нас есть количество детей) к узлу аналогично прицепляю дететей.
С бинарным поиском прикрученным к спискам всё очень быстро происходит без лишных поисков. Можно ещё более оптимизировать и остановиться на чтении непосредственных дететeй, и только когда пользователей откроет узел, для его детей дочитывать необходимую информацию. Для сбора статистики ветка, ессно, должна быть полностью построена.
Делаю таблицу сущностей безо всяких ссылок, делаю таблицу связей, содержащую ID (сущности), ParentID и количество детей первого уровня. Для построения дерева (или части дерева, где корневым элементом будет сущность с заданным ID) читаю в память таблицу сущностей, читаю в память таблицу связей, в общем, строю два списка. Даже если таблицы огромные, за счёт того, что нет никаких джойнов всё быстро в память засасывается. Далее, допустим, в тривью отображаю всё, загоняю корневым узлом элемент из списка с заданным ID, далее находжу в таблице связей соответствующую запись. Далее в цикле (у нас есть количество детей) к узлу аналогично прицепляю дететей.
С бинарным поиском прикрученным к спискам всё очень быстро происходит без лишных поисков. Можно ещё более оптимизировать и остановиться на чтении непосредственных дететeй, и только когда пользователей откроет узел, для его детей дочитывать необходимую информацию. Для сбора статистики ветка, ессно, должна быть полностью построена.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 04.04.06 16:20
в ответ voxel3d 04.04.06 15:31
А что ты делаешь в случае сбоев по питанию ?
Раз уж инфа должна быть в базе - надо и работать непосредствненно с базой. А производительность - выбор базы, количества процов и памяти... В любом случае делать руками и поддерживать эмулятор ISAM/VSAM - не рентабельно...

Раз уж инфа должна быть в базе - надо и работать непосредствненно с базой. А производительность - выбор базы, количества процов и памяти... В любом случае делать руками и поддерживать эмулятор ISAM/VSAM - не рентабельно...

NEW 04.04.06 16:26
в ответ Murr 04.04.06 16:20
Здрасьте, приплыли. Ну, а, что Вы делаете в случае сбоя питания, когда используете дотнетовский датасет? Он, ведь, о ужас, не ориентирован на постоянное соединение!
И клиент, получается, не работает всё время непосредственно с базой.


Dropbox - средство синхронизации и бэкапа файлов.
NEW 04.04.06 16:37
в ответ voxel3d 04.04.06 16:26
P.S. Вообще то начинаю подумывать об том, чтобы поменять методику работы - сначала сбрасывать в промежуточные таблицы - там только на запись - операция + инфо, а процессить - уже потом, отдельными потоками. Благо сейчас скорость не критична, а потеря - смертельна...

NEW 04.04.06 16:47
в ответ Murr 04.04.06 16:32
В предложенной мною схеме у потомков при построении дерева ничего не обновляется. Если после построения дерева и отображения его в визуальном элементе предусматриваются изменения дерева, то политика обновления может быть любая, хоть непосредственно при уходе с узла, никто же не заставляет непременно при закрытии программы информацию записывать. Поэтому как там оно вс╦ запитывается: от дизеля или из розетки, безразлично.
Dropbox - средство синхронизации и бэкапа файлов.
04.04.06 18:46
Есть, причём разные. И чтобы выбрать правильное надо знать какие операции тебе нужны. Например удаление поддеревьев тебе необходимо? Или только добавление отдельных узлов и быстрая выборка?
ЗЫ отвечу может быть только после выходного.
в ответ Alexden 04.04.06 14:14
В ответ на:
вот теперь вопрос - есть ли решенее попроще ?
вот теперь вопрос - есть ли решенее попроще ?
Есть, причём разные. И чтобы выбрать правильное надо знать какие операции тебе нужны. Например удаление поддеревьев тебе необходимо? Или только добавление отдельных узлов и быстрая выборка?
ЗЫ отвечу может быть только после выходного.