Как пагинация курсора Relay обрабатывает большие наборы данных, когда он всегда выбирает весь набор данных? - PullRequest
1 голос
/ 27 сентября 2019

В настоящее время я работаю над проектом GraphQL, использующим Apollo Server / PostgresQL и Knex / Objection.

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

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

Но после проверки нескольких реализаций, таких как:

https://facebook.github.io/relay/graphql/connections.htm#sec-Pagination-algorithm https://github.com/Terminal-Systems/apollo-cursor-pagination

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

Даже в спецификации Relay, которую я связал, говорится, что вы начинаете с allEdges до нарезки в зависимости отдо или после аргументов.

Есть ли что-то, чего мне не хватает?Потому что я не понимаю, как этот подход мог бы быть лучше, чем нумерация страниц, основанная на смещении, но мне бы очень хотелось, чтобы мои ошибки доказали, что мои рассуждения ошибочны.

Приветствия и счастливая пятница!

1 Ответ

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

Спецификация Relay определяет выборку всех ребер, которые удовлетворяют предоставленным аргументам before и after, и затем нарезку данных в соответствии с аргументом first или last.И это действительно может быть заметно медленнее и занимать больше памяти при работе с большими таблицами.

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

Пагинация на основе курсора может быть реализована таким образом, что не требуется извлекать все строки.Есть библиотеки типа , эта , которые делают это.Я не могу сказать, будет ли это технически делать ваш сервер не «в соответствии со спецификацией», но я думаю, что если результат будет таким же, ваш сервер будет по-прежнему совместим с клиентами ретрансляции.Тем не менее, если вы не беспокоитесь о поддержке клиентов Relay на внешнем интерфейсе, нет необходимости реализовывать соединения в стиле Relay или любую другую часть спецификации Relay.Вы можете использовать пагинацию на основе курсора вне сервера, совместимого с Relay.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...