#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 другие (счетчик)».