Почитал немного по диагонали, так что не обижайтесь если совет совет будет перекликаться с вашими излияниями. У вас есть общий перечень элементов и его подмножество - перечень, доступный некому пользователю(по ролям или правам доступа - не важно). п.1) Если эти права доступа хранятся в БД - то просто тащите из БД только то что потенциально необходимо данному клиенту. К слову эти данные довольно статичны, так что можно их спокойно кешировать. п.2) по поводу "всего 300кб". Да, для одного пользователя они закешируются, но первый запуск будет долгим, а для другого нет. и при 100к юников эти 300Кб будут отдаваться первое время каждому, хотя есть риск что они не нужны. п.3) Где хранятся эти изображения? если в базе, то мы опять получаем лишнюю нагрузку на сервак для данных, которые ему не нужны. На мой взгляд одно из главных правил для таких задач по нагрузке на БД - никогда не тащите лишних данных. Пусть лучше база их отфильтрует, чем вы сначала здоровенный пакет данных будете тащить на сервер приложения, затем выяснять какие нужны, а какие нет, затем всю это свалку бросить клиенту "авось пригодится".