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

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

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


Dropbox - средство синхронизации и бэкапа файлов.
NEW 04.04.06 16:32
in Antwort voxel3d 04.04.06 16:26
У меня то как раз все понятно - откатываются незаконченные транзакции...
В данной ситуации - те, которые производили замену инфы у потомков...

В данной ситуации - те, которые производили замену инфы у потомков...

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

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