GraphQL с логикой - PullRequest
       13

GraphQL с логикой

0 голосов
/ 27 сентября 2018

У меня следующая ситуация в схеме GraphQL:

type User {
  id: Float
  name: String
  cityId: Float
}

type City {
  id: Float
  country: String
}

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

После этого и пользователь, и город переходят к клиенту.Это, так сказать, внутреннее соединение, поэтому я хотел бы получить один запрос на загрузку подключенных данных.

Я не могу изменить схему, но я могу добавить библиотеки и т. Д. К клиенту или серверу.

Спасибо.

1 Ответ

0 голосов
/ 28 сентября 2018

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

Я бы предложил изменить вашу схему следующим образом.У меня недостаточно информации, если она удовлетворит ваши потребности.Но я бы предложил это.

type User {
 id: Float
 name: String
 city: City
 #for this city field there will be additional resolver binded to data loader
}
type City {
  id: Float
  country: String
}

Таким образом, запрос будет выглядеть следующим образом

query getUsers {
  users {
    id
    name
    city {
      id
      country
    }
  }
}

Можно использовать UserConnection из спецификации Relay, но давайте пока будем простыми.На стороне сервера вам нужно будет реализовать два средства распознавания ... сначала запрос на список пользователей, а затем преобразователь для поля города.Обратите внимание, что распознаватели имеют отдельный контекст.Во избежание проблем с N + 1 запросами и пакетных запросов к городским запросам к 1. Было бы полезно реализовать загрузчик данных для городов, чтобы уменьшить количество запросов к базе данных.Простая схема будет выглядеть следующим образом:

  1. Пользовательский преобразователь, извлекает пользователей и возвращает их в пользовательском преобразователе.CityId является частью полезной нагрузки для каждого использования
  2. Поскольку город является вторым уровнем набора выбора, вы получите каждого пользователя в первом аргументе в функции распознавателя.Вы будете использовать countryId для передачи его загрузчику данных стран
  3. Загрузчик данных стран будет группировать запросы для каждой страны вместе.Загрузчик данных преобразует countryIds в значения стран и возвращает их для каждого пользователя.
  4. Сервер GraphQL будет обрабатывать весь запрос, и каждый город будет назначен каждому пользователю

Этолучший подход, который я знаю, чтобы иметь дело с этим, и он также приведет вас к лучшей архитектуре вашей схемы, так как вы будете использовать нормализацию вашего магазина appollo, и, на мой взгляд, с этим форматом данных проще работать и во внешнем интерфейсе.Надеюсь, что я что-то не пропустил в вашем посте и эта информация будет вам полезна.Весь смысл в том, чтобы просто внедрить страну в пользователя, что приводит к проблеме запроса N + 1 и уменьшает проблему производительности проблемы N + 1 с загрузчиками данных.

...