Вы правы - использование объединения позволит вам сделать один запрос к базе данных вместо 101.
Проблема в том, что на практике у вас не было бы просто одного объединения - ваша модель данных обзора может включать ассоциации с любым количеством других моделей, каждая из которых требует своего собственного предложения соединения. Не только это, но эти модели могут иметь отношения к другим моделям сами. Попытка создать один запрос SQL, который будет учитывать все возможные запросы GraphQL, становится не только сложной, но и чрезмерно дорогой. Клиент может запрашивать только обзоры, не имеющие ни одной из связанных моделей, но запрос для получения этих обзоров теперь включает в себя 30 дополнительных ненужных представлений. Этот запрос мог занять меньше секунды, но теперь занимает 10.
Также учтите, что отношения между типами могут быть круговыми:
{
reviews {
author {
reviews {
author
}
}
}
}
В этом случае глубина запроса не определена невозможно создать один запрос SQL, который бы удовлетворил любой возможный запрос GraphQL.
Использование библиотеки, такой как dataloader , позволяет нам уменьшить N + 1 проблема, связанная с пакетной обработкой, при этом любой отдельный запрос SQL должен быть максимально скудным. Тем не менее, вы все равно будете в конечном итоге с несколькими запросами. Альтернативный подход заключается в использовании объекта GraphQLResolveInfo, переданного резолверу, чтобы определить, какие поля были запрошены в первую очередь. Тогда, если хотите, вы можете делать только необходимые объединения в своем запросе. Однако анализ объекта info
и построение такого рода запросов может оказаться сложной задачей, особенно после того, как вы начнете работать с глубоко вложенными ассоциациями. С другой стороны, dataloader
является более простым и интуитивно понятным решением.