169 похожих чатов

Доброго времени суток! Долгое время я задумывался над решением пагинации

через курсоры.

Базовое решение основано на LIMIT/OFFSET.
Плюсы:
- Можно указывать сторону сортировку (DESC/ASC) на конкретную колонку.
Минусы:
- Данные при смещении могут повторяться

Реализация на Primary Key/Timestamp
Плюсы:
- Объекты не будут повторятся
- Курсор остаётся актуальным длительное время

Минусы:
- Невозможно использовать сортировку по колонке не являющиеся ключом (PK/Timestamp)

Конечно понимаю что второй вариант используют в основном в какой-нибудь ленте или списке сообщений. Мне второй вариант нравится больше, но минус перекрывает плюсы.

Так какой будет эталонный вариант реализации будет? Может я чего не учёл.

1 ответов

4 просмотра

Релеевские курсоры - хорошая спека: https://facebook.github.io/relay/graphql/connections.htm . Реализовать можно сортировку по любьым УНИКАЛЬНЫМ полю/полям. Тут чутка инфы, почему нужны уникальные поля для курсора https://github.com/graphql-compose/graphql-compose-connection/issues/33 В этой же репко можно посмотреть реализацию этой спеки. Суть работы: - вы сортируете свой коннекш по какому-то уникальному полю или набору уникальных полей. К примеру захотели сортировать по дате создания и айдишнику (кардиналить даты создания тупо не хватает, т.к. может быть создано много записей в одну секунду. Поэтому еще к дате надо приклеить ID, чтоб реально получать уникальные курсоры): sort: CREATED_AT_AND_ID_DESC - далее когда возвращаете результаты, для каждой записи в курсор вы должны положить значения согласно той сортировки, которую использовалась в запросе(в моем примере `base64({ createAt: ‘2020-01-12 10:03:15’, id: 1745 })`) - когда вы хотите получить следующую порцию данных в коннекшене, вы графкуэль запросе должны передать КУРСОР и ту же СОРТИРОВКУ: cursor: base64({ createAt: ‘2020-01-12 10:03:15’, id: 1745 }), sort: CREATED_AT_AND_ID_DESC - на стороне сервера когда поймали курсок должны правильно сконструировать запрос в базу согласно КУРСОРА и СОРТИРОВКИ, в моем случае WHERE createdAt <= ‘2020-01-12 10:03:15’ AND id < 1745 ORDER BY createdAt DESC, id DESC

Похожие вопросы

Обсуждают сегодня

какие клиентские датасеты в лазаре умеют объединяться в master-detail? нужно забрать на клиент запись из одной таблицы и выборку из другой связанной один-ко-многим, отредактир...
Igor
19
А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Подскажите, сейчас что то есть (JS модуль какой-нибудь), что можно использовать для: 1) переваривания javascript codа из html fileа, т.е. разбивки, на переменные, команды, бло...
Iar De
32
Мне интересно, скорее людей здесь используют D, Rust, C/C++ для решения реальных прикладных задач за деньги?)
Evil Satanson
43
кто поможет крякнуть чит? (реверс инжиринг) чтобы разблокировать премиум версию
Mёdkinson Medvezhkin
39
/////////////////////////////////////// TChart / TLineSeries - сохранение данных (текстовый файл) /////////////////////////////////////// добрый день / работа с графиком: 1....
livontiy
14
Делал сайт заказчику в 2018г. Прилетела претензия на фотку в примерах работ от copydefend (ооо "фортуна технолоджис") на 36к рублей 🙈 Конторка эта образовалась в 2023 г, и 13...
Alexander Andreev
10
давайте за механические клавиатуры потрём, мне тут неучтенных денег упало и их можно потратить на что-то такое, вот думаю про dark project kd87a, кто-то имеет что-то подобное?
Oleg Nosov
24
Вопрос по организации кода. Пилю свой велосипед логгер Есть у меня множество уровней сообщений. Я набрасываю сообщения в стринглист, а когда они нужны, вызываю их через функц...
Serjone
21
А что, надо по другому как-то?
rσσт@ανα∂αмιασ
10
Карта сайта