Архитектура для предотвращения повторения данных в GraphQL

#graphql #apollo

Вопрос:

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

В качестве примера рассмотрим следующую псевдосхему:

 type Group {
  name: String
  members: [Person]
}
type Person {
  name: String
  email: String
  avatar: Avatar
  follows: [Person]
  followedBy: [Person]
  contacts: [Person]
  groups: [Group]
  bookmarks: [Bookmark]
  sentMessages: [Message]
  receivedMessages: [Message]
}
type Message {
  text: String
  author: Person
  recipients: [Person]
}
type Bookmark {
  message: Message
}
 

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

В моей реальной реализации около 80% каждого запроса GraphQL (в байтах) является избыточным, и, учитывая, что клиент выполняет множество различных запросов в одном и том же пространстве, более 90% всех передаваемых и обрабатываемых данных являются избыточными.

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

Я использую Apollo как для клиента, так и для сервера GraphQL.

Ответ №1:

Используйте/реализуйте разбиение на страницы (вместо просто массивов) для отношений — таким образом, вы можете запрашивать count / total (отображать его без обработки массива) и только массив идентификаторов — обычно нет необходимости запрашивать/присоединять таблицу персон (БД) вообще.

Визуализируйте список Person компонентов (реагируйте?), используя id только переданную опору … только отрисованные Person выборки для получения более подробной информации (если они не кэшированы, используйте пакетирование для объединения запросов) потребляются/отображаются внутри.

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

1. Спасибо за ваш ответ. На самом деле мы используем разбиение на страницы там, где это имеет смысл, я просто не думал, что это имеет значение для этого конкретного вопроса. Я рассматривал возможность просто отправки идентификатора/ссылки и разделения вложенного человека в отдельный поисковый запрос, это просто не кажется очень графическим.

2. Если вы знаете что-нибудь написанное на эту тему, я был бы очень признателен за указатель.

3. GraphQL помогает при переполнении, apollo помогает при повторном использовании уже [избыточных]извлеченных данных … ограничения на разбиение на страницы помогают при злоупотреблении [переполнением] (извлечение де-факто неиспользуемых данных, извлечено 1xx, отображено 1x) … позволяет отображать вполне полезные данные, такие как » за которыми следуют x, y, z (аватары информация) и 1xx другие (счетчик)».