Сократите количество SQL-запросов с помощью ссылок на falcor-router
Предположим, у меня есть два маршрута прохождения
route: 'users[{ranges}]'
а также
route: 'UserById[{integers:ids}]["name","email"]'
в то время как users
возвращает ссылки на UserById
-route. Если я тогда сгенерирую запрос
get('users[0..10]["name","email"]')
против этого, маршрутизатор сначала оценит users[0..10]
часть, которая будет выполнять SELECT id FROM users LIMIT 10
в базе данных и вернуть соответствующие идентификаторы. Затем маршрутизатор будет использовать эти идентификаторы вместе с конкретным маршрутом для заполнения фактических значений. Без аккуратного кэширования в реализации UserService (которую необходимо повторить для любого подобного случая, например, адресов, типов затрат и т. П.), Это произведет по крайней мере два запроса к моему постоянному бэкэнду, если более традиционный подход использует один RESTful конечная точка
GET /users/?offset=0&limit=10
скорее всего, будет доволен одним.
Существует ли общий передовой опыт, как оптимизировать запросы к базе данных в этом сценарии, например, с помощью некоторого умного кеша между маршрутизатором и внутренними службами? Возврат полной информации уже в users
Маршрут модели запрещен, поскольку у наших пользователей могут быть графические ссылки на друзей, которые сами являются пользователями.
2 ответа
Не будет ли иметь общий маршрут пользователей по индексу и маршрут имени пользователя и электронной почты по индексу, что позволит вам обрабатывать get('users[0..10]["name","email"]')
запрос с одним запросом БД?
Например
route: 'users[{ranges}]'
а также
route: 'users[{ranges}]["name", "email"]'
Второй маршрут, поскольку он более конкретный, вернет все, что вам нужно для get('users[0..10]["name","email"]')
запрос только с одним запросом БД, в то время как пользовательские запросы по любым дополнительным полям (помимо имени и адреса электронной почты) будут переходить к первому маршруту.
На этот вопрос здесь отвечает Джафар Хуссейн со ссылкой на документацию:
Маршрутизатор подходит в качестве абстракции над уровнем сервиса или REST API. Использование Маршрутизатора через API этих типов обеспечивает достаточно гибкости, чтобы избежать обходов клиента без введения тяжелых абстракций. Сервисно-ориентированные архитектуры распространены в системах, которые предназначены для масштабируемости. Эти системы обычно хранят данные в разных источниках данных и предоставляют их через различные сервисы. Например, Netflix использует маршрутизатор перед своей микросервисной архитектурой.
Редко идеально использовать маршрутизатор для прямого доступа к одной базе данных SQL. Приложения, использующие одно хранилище SQL, часто пытаются создать один SQL-запрос для каждого запроса сервера. Работа маршрутизатора заключается в разделении запросов для различных разделов документа JSON Graph на отдельные обработчики и отправке отдельных запросов службам для получения запрошенных данных. Как следствие, у маршрутизатора редко бывает достаточно контекста для создания одного оптимизированного SQL-запроса. В настоящее время мы изучаем различные варианты поддержки этого типа шаблона доступа к данным в Falcor в будущем.
Сейчас я исследую себя, используя маршрутизатор для сбора частичных запросов к базе данных, затем сканируя результаты JSON Graph, чтобы объединить эти частичные запросы, выполнить их как один для базы данных, а затем снова сканируя график, чтобы разместить значения в правильных путях., Это определенно возможно при использовании ArangoDB и AQL LET
заявления, хотя это немного сложно. Я не знаю о SQL.
Если вы ищете более простое решение, вы можете кэшировать сопоставление индекса с идентификатором, чтобы попытаться минимизировать доступ к базе данных. Ответ Джеймса Конклинга тоже хорош.