Как избавиться от зависимых запросов?

Одностраничное приложение.
Обрабатываем переход по адресу: site.ru/spb/museums/best

1. Получаем объект города api.site.ru?city=spb, берем из него cityId: 123
2. Получаем объект категории api.site.ru?categories=museums, берем из него categoriesId: 456
3. Получаем список лучших музеев Питера api.site.ru/museums?city=123&categories=456&type=best

В итоге имеем парочку транзитных запросов, которые усложняют код фронтэнда и замедляют ответ.

С одной стороны, можно получать сразу при загрузке список всех городов, категорий и проч., но если списки будут большими, то это может затормозить первую загрузку.

Можно хранить урезанные списки соответствий url — id, что отсрочит первую проблему, но усложнит бэкенд и фронтенд.

Можно придумать какую-нибудь штуку на фронтенде, которая будет в фоне подгружать списки городов и категорий и откладывать выполнение задач, которым требуются данные из них, если они еще не загружены. Это сильно усложнит фронтенд.

Можно переделать бэкенд, чтобы он понимал запросы вида api.site.ru/museums?city=spb&categories=museums&type=best, но тогда придется постоянно делать запросы по нескольким таблицам и возрастет нагрузка на сервер, чего очень не хочется.

Какие еще есть варианты? Как сделать правильно? Как подобные проблемы решаются в fullstack-фреймворках
  • Вопрос задан
  • 3256 просмотров
Пригласить эксперта
Ответы на вопрос 5
@Masterme
доработайте апи чтобы оно понимало запросы вида
api.site.ru/museums?city=spb&categories=museums&type=best
Ответ написан
Andrbez
@Andrbez
Procrastination
api.site.ru?city=123&categories=456
Ответ написан
Если данные редко меняются, то дёргайте всё одним запросом и кешируйте.
Ответ написан
Комментировать
AMar4enko
@AMar4enko
Вам уже правильно сказали, что надо сделать отдельный API-метод для этой ситуации. По-сути это REST-метод получения коллекции с фильтром.
В качестве фильтра у вас будут выступать город и категория.
Для города и категории у вас хранится alias и id, с фронта вам прилетает alias.
Вы проверяете, есть ли у вас в кеше сохраненные id для переданных алиасов города и категории. Если нет, то строите большой запрос с джойнами, который фильтрует по альясам. В результате выполнения вы помимо информации по музеям получите id города и категории, которые вы кладете в кеш. Последующие запросы возьмут id из кеша и запрос будет к одной таблице без джойнов с фильтром по конкретным id.
Ответ написан
Комментировать
ruFelix
@ruFelix
Предсказание будущего по руке, таро, кофе.
@tamtakoe вам @Masterme всё верно сказал, если джойны не подходят идеологически сделайте три простых селекта подряд, вас никто не заставляет делать один запрос. И база их отлично закеширует, чего скорее всего не будет с джойнами.

А ещё лучше будет если вы расширите исходный набор данных клиента, так что бы он мог сразу сделать api.site.ru/museums?city=123&categories=456&type=best
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы