![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 02.12.2022
Сообщений: 3
|
![]()
Всем привет. Решаю задачу. (PHP, MySQL, Redis)
а) Есть сотрудники и отделы. Вложенность отделов друг в друга не ограничивается. Внутри отдела могут быть как сотрудники, так и отделы (небинарное дерево). б) Из этих же сотрудников формируют группы. Вложенность групп друг в друга не ограничивается. Внутри группы могут быть как сотрудники, так и группы (небинарное дерево). Все аналогично отделам. Задача такая: 1) Выбирают сотрудника - нужно определить - выбран ли его отдел полностью или частично и это же нужно определить до самого верха иерархии. отдел1 -- выбран частично отдел11 -- выбран частично сотрудник111 сотрудник112 -- выбран отдел12 -- выбран полностью сотрудник121 -- выбран отдел13 2) Выбирают отдел - нужно определить - выбран ли его отдел полностью или частично и это же нужно определить до самого верха иерархии. отдел1 -- выбран частично отдел11 отдел12 отдел13 -- выбран полностью В обоих случаях нужно это же определять и для групп (б): выбрали отдел с сотрудниками - нужно в группах определить, какие из них выбраны полностью, какие частично. Все сотрудники, их отделы и группы хранятся в MySql в разных таблицах. Как я решил эту задачу сейчас (язык PHP): Из БД беру отделы и сотрудников и собираю небинарное дерево (использую https://github.com/loophp/phptree). Это же делаю для групп. В этом дереве ищу нужный узел и отмечаю его выбранным. Потом обхожу дерево чтобы собрать данные по выбранным полностью/частично узлам. Выбираем сотрудника: отмечаем его выбранным (ставим флаг), переходим к его отделу (узел родитель в дереве), получаем его детей, смотрим выбраны они или нет. Если выбран хоть один - частично, если все-полностью. Если среди детей есть отдел, то чтобы определить выбран он или нет в него не спускаемся, просто просто смотрим его флаг (выбран/не выбран) Дальше собираем статистику - обходим дерево и собираем все выбранные полностью отделы, частично выбранные, и выбранных сотрудников. На основе выбранных сотрудников в дереве групп собираю такую же инфу по выбранным полностью/частично. Для того чтобы не дергать каждый раз БД храню деревью в редисе. Какие проблемы в текущем решении: Каждый раз деревья надо доставать из БД (и рекурсивно индексировать в дерево) или редиса (и так же превращать в объекты) Если Выбирать надо сразу 10 отделов, то это кратно увеличивает количество обходов. По сути это все аналогично TreeView Как бы вы решали эту проблему? Использовали ли деревья или плоские структуры? Какие? Где бы хранили сотрудников с отделами и группами, чтобы уменьшить накладные расходы или вообще иметь возможность обходиться только функционалом хранилища? Возможно какие-то иные алгоритмы? Любые мысли приветствуются! |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 19.12.2007
Сообщений: 50
|
![]()
то есть выбираем сотрудника и надо опредилить отдел и надотделы где тот состоит?
А как БД организовали? Для чего конкретно эта аппликашка? |
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 02.12.2022
Сообщений: 3
|
![]()
Отделы и подотделы определить очень просто.
Главная проблема в том, чтобы определить какие из отделов выбраны полностью, а какие не полностью. И одновременно по выбранным сотрудникам из первого дерева (отделы) тоже самое проделать со вторым деревом (группы). Для чего: есть приложение, там выводим орг структуру предприятия - список отделов, проваливаемся в отдел, видим что там и так до самого низа. В этом же приложении выводим сотрудников предприятия по группам. Если выбрали сотрудника(ков)/отдел(лы), то далее гуляя по иерархии должны видеть какие отделы полностью выбраны, а какие частично. И если перейти в структуру групп - должны видеть это же. В БД сотрдуники, группы и отделы лежат по отдельным таблицам. У сотрудника есть ссылка на его группу и отдел. У отдела есть ссылка на его отдел, у группы есть ссылка на ее группу. В сторону nested sets, adjacency list и прочее для реляционной БД смотрел, это не подходит именно их за того, что надо помимо самой иерархии вычислять, какие группы/оделы выбраны полностью, а какие частично. Это уже работающее приложение. |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 19.12.2007
Сообщений: 50
|
![]()
что значит целиком или полностью? можно выбрать несколько человек? или учитываюся пердыдущие выборы?
На каком стеке реализуете? |
![]() |
![]() |
![]() |
#5 |
Новичок
Джуниор
Регистрация: 02.12.2022
Сообщений: 3
|
![]()
Если в отделе 10 человек, и выбраны все 10, то отдел выбран полностью, если выбраны от одного до десяти, то отдел выбран частично.
По стеку в первом сообщении вроде бы все описал: храню в MySql, деревья собираю кодом на php, и кеширую в редис. Кроме того указал и библиотеку, через которую работаю с дереовом: https://github.com/loophp/phptree Последний раз редактировалось Павел26; 04.12.2022 в 12:43. |
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выполнить программное моделирование алгоритма поиска кодовых комбинаций и алгоритма кодирования методом Хаффмана. | Мария34 | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 06.06.2017 00:15 |
Код алгоритма игры VBA | Nkeyka | Помощь студентам | 0 | 28.05.2012 14:55 |
Выбор алгоритма для вычисления определителя матрицы 6х6 | Беллая | Помощь студентам | 2 | 28.08.2010 23:59 |
Выбор алгоритма | GBTA | Общие вопросы C/C++ | 0 | 10.07.2010 19:54 |
доработка алгоритма... | Sota | Помощь студентам | 2 | 13.06.2008 15:45 |