Общее правило здесь заключается в том, что серверные обходы обходятся дорого (по сравнению с тем, сколько времени занимает типичный запрос), поэтому руководящий принцип заключается в том, что вы хотите минимизировать их. По сути, каждое соединение «один ко многим» потенциально умножает ваш результирующий набор, поэтому я подхожу к этому так, чтобы соединение продолжалось до тех пор, пока результирующий набор не станет слишком большим или время выполнения запроса не станет слишком большим (обычно примерно 1-5 секунд). *
В зависимости от вашей платформы вы можете или не сможете выполнять запросы параллельно. Это ключевой фактор в том, что вы должны делать, потому что, если вы можете выполнять только один запрос за раз, барьер для разбивки запроса намного выше.
Иногда стоит хранить определенные относительно постоянные данные в памяти (например, информацию о стране) или выполнять их как отдельный запрос, но, по моему опыту, это довольно необычно.
Гораздо чаще встречается необходимость исправления систем с ужасной производительностью, в значительной степени из-за выполнения отдельных запросов (особенно коррелированных запросов) вместо объединений.