Простой ответ: нет эффективного способа. Не стоит читать эту статью, я просто написал, я просто не хотел, чтобы его выбросить;)
Big O нотация
Ну, я определенно был не самый умный студент вернулся в университет, но то, что Я помню, что у нас был «Big O Notation», когда дело дошло до сложности.
Итак, давайте попробуем обсудить, что вы пытаетесь сделать. У меня есть один массив Users
размера n и другой массив Departments
размера m.
Что вы хотите - это связь между Users
и Departmens
, и, как вы заявили, вам «нужно распечатать всех пользователей в массиве пользователей вместе со своими подразделениями». Таким образом, у вас есть хотя бы сложность n (так как вам нужны все пользователи в массиве Users
).
Теперь мы рассмотрим массив departments
. Как мы можем видеть из вашего примера, Джон в HR, а также в Финансах. Таким образом, пользователь может работать для нескольких отделов. Это означает, какой позор, что нам всегда нужно перебирать весь departments
, чтобы убедиться, что мы не пропустили один из отделов, на котором работает пользователь. Мы помним, что массив departments
имеет размер m.
Итак, для каждого пользователя мы должны пройти через m элементов в departments
. Для первого пользователя м элементов для второго пользователя м элементов и т. Д. Поскольку у нас есть n пользователей, наша сложность O(n*m)
.
Это, как вы могли заметить, никогда не было эффективным! И в мире нет функции массива, даже на другом языке, что могло бы сделать ее более эффективной.
Или, конечно, я не знаю всех ваших прецедентов. Если вам нужно составить этот список только один раз, я предлагаю вам сделать это таким образом. Каждая «оптимизация» может привести к ошибкам и сделать ваш код более сложным для отладки.
Если вы не знакомы со сложностью в Big O нотации, подумайте об этом следующее, я называю это
База способ
У вас есть одна таблица со всеми пользователями и одну таблицу со всеми ведомства. Поскольку один пользователь может находиться во многих отделах, а один отдел может иметь много пользователей, у вас будет таблица соединений, например user_id | department_id
, назовем ее users_to_departments
. Конечно, вы можете подумать, что ваша таблица users_to_departments
будет определенно меньше, чем n*m
. Но чтобы заполнить его, сначала нужно добавить всех пользователей в таблицу users
, а затем, заполнив таблицу departments
, вам нужно будет найти идентификатор пользователя в users
.
Но остановитесь, вы сказали, что имена пользователей уникальны! Поэтому используйте это поле «имя» в качестве того, что я назвал user_id
, и здесь мы идем, мы спасли нас от поиска каждого пользователя в таблице users
.
Теперь вы можете сделать простой SELECT * FROM users_to_departments ud JOIN users u ON u.id = ud.user_id JOIN departments d ON d.id = ud.department_id ORDER BY ud.user_id, ud.department_id
, чтобы получить список. Просто помните, что пользователь будет в списке x
раз, когда в x
отделах.
Заключение
И, если вы спросите меня, я не думаю, что это будет быстрее, так как вы должны передать все данные из веб-сервиса в базе данных, запрос из базы данных и трансформировать свой ответ. Для меня это звучит только более склонно к ошибкам и даже не более эффективно.
это эти данные уже в дБ? похоже, было бы лучше создать запрос, который группирует их –
нет .. данные находятся в массивах. Он исходит из API – Jake
также, святой дерьмо, 30000 отделов? действительно? Я не знал, что такой бизнес может существовать с таким количеством отделов –