Должен или могу ли я получать данные для дочернего преобразователя в родительском?

#graphql #graphql-js #express-graphql

Вопрос:

Я только начинаю с graphql, так что это может быть глупый вопрос, но у меня следующая ситуация: у меня есть объект, назовем его car, у него есть различные свойства, среди них журнал драйверов или что-то еще. Когда я запрашиваю конкретный car и мне также нужны журналы, преобразователь запускается и возвращает записи журнала из базы данных, используя родительский идентификатор. Но когда я запрашиваю несколько машин, преобразователь для записей журнала будет запускаться для каждой возвращаемой машины.

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

Есть ли какой-либо способ выполнить это в graphql? Я думаю, что более эффективно запускать один запрос и фильтровать результаты вместо выполнения одного запроса для каждого запрашиваемого объекта. Или я переоцениваю это, и я должен просто запрашивать базу данных для каждой записи? Я думаю, что мне нужно знать: есть ли способ узнать от родительского преобразователя, нужно ли мне разрешать данные в дочернем преобразователе и могу ли я получить эти данные в родительском и передать их дочернему преобразователю.

Комментарии:

1. избыточная выборка плоха, она не более эффективна, поскольку требует больше ресурсов (памяти)… вы можете извлекать дочерние данные в родительском, когда это требуется (запрашивается), не всегда

2. Я понимаю, что чрезмерная выборка — это плохо, но в этом случае я бы не стал делать чрезмерную выборку. Я бы проверил, нужны ли мне данные журнала, проверив, запрашивается ли поле журнала. Если это не требуется, я бы не извлекал данные.

3. Это звучит как проблема N 1, использование загрузчика данных помогло бы в вашем сценарии

4. извините, забыл отметить это как ответ. Я новичок в graphql и не знал о n 1, пока не столкнулся с этим здесь. В итоге я реализовал некоторые предварительные просмотры и условную предварительную выборку. Следующей остановкой будет добавление загрузчика данных. Спасибо за ответ.

Ответ №1:

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

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

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

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

Комментарии:

1. github.com/graphql/dataloader