Я должен реализовать пагинацию на основе курсора и немного запутался в том, как это сделать, учитывая, что первичный ключ моих сущностей не является автоинкрементом, как, например, Aerospike.
Наиболее очевидной альтернативой, когда оператор сравнения недоступен для первичного ключа в распределенной системе, где мы не используем автоинкремент, является использование метки времени. Но насколько это надежно?
То есть, два пользователя могут сделать загрузку в одно и то же время, что, по сути, нарушает логику пагинации на основе курсора.
Например, дайте мне следующие 10 элементов из определенной временной отметки, которая была отправлена в качестве курсора для получения следующих результатов. Когда эта временная метка содержит два сообщения, 1 сообщение может быть отброшено и пропущено, если оно не вписывается в предыдущий запрошенный диапазон подсчета (например, 10 сообщений, дублирующее сообщение которых будет находиться в местоположении 11).
Как обойти эту проблему?
Наиболее очевидным способом было бы иметь вторичное поле рядом с отметкой времени с дополнительным счетчиком, когда отметка времени уже существует, и обрабатывать дополнительную логику на уровне приложения, но все это, кажется, добавляет много раздувания.
Любое понимание высоко ценится!