Подтвердить что ты не робот

Как реализовать курсоры для разбивки на страницы в api

Это похоже на вопрос, на который нет ответов. Я прочитал все о том, как использовать курсоры с твиттером, facebook и disqus api, а также эту статью о том, как disqus обычно создавал свои курсоры, но я все еще не могу понять, как они работают и как реализовать подобное решение в моих собственных проектах. Может ли кто-то конкретно объяснить различные методы и концепции, стоящие за ними?

4b9b3361

Ответ 1

Давайте сначала поймем, почему смещение нумерации сбоев для больших наборов данных на примере.

Клиенты предоставляют два параметра ограничения для количества результатов и смещения и для смещения страницы. Например, при смещении = 40, ограничении = 20 мы можем указать базе данных вернуть следующие 20 элементов, пропустив первые 40.

Недостатки:

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

Как Курсоры решают это?

Разбиение на основе курсора работает, возвращая указатель на определенный элемент в наборе данных. При последующих запросах сервер возвращает результаты после указанного указателя.

Мы будем использовать параметры next_cursor вместе с limit в качестве параметров, предоставленных клиентом в этом случае.

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

SELECT * FROM users
WHERE team_id = %team_id
ORDER BY id DESC
LIMIT %limit

Где предел равен пределу плюс один, чтобы получить еще один результат, чем количество, указанное клиентом. Дополнительный результат не возвращается в наборе результатов, но мы используем идентификатор значения в качестве next_cursor.

Ответ от сервера будет:

{
   "users": [...],
   "next_cursor": "1234",  # the user id of the extra result
}

Затем клиент предоставит next_cursor в качестве курсора во втором запросе.

SELECT * FROM users
WHERE team_id = %team_id
AND id <= %cursor
ORDER BY id DESC
LIMIT %limit

С этим мы обратились к недостаткам пагинации на основе смещения:

  • Вместо того, чтобы окно вычислялось с нуля для каждого запроса на основе общего количества элементов, всегда выбирались следующие строки подсчета после определенной контрольной точки. Если элементы записываются в набор данных с высокой частотой, общая позиция курсора в наборе может измениться, но окно разбивки на страницы корректируется соответствующим образом.
  • Это будет хорошо масштабироваться для больших наборов данных. Мы использовали предложение WHERE для извлечения строк со значениями идентификатора, меньшими, чем последний идентификатор на предыдущей странице. Это позволяет нам использовать индекс для столбца, и базе данных не нужно читать какие-либо строки, которые мы уже видели.

Для подробного объяснения вы можете посетить эту замечательную инженерную статью из slack!

Ответ 2

В общем случае вы должны передать текущий номер или номер страницы в запросе в качестве параметра. Другим обычным параметром является размер партии страницы. Затем на стороне сервера вы выбираете и возвращаете правильный набор данных, например, с SQL-запросом.

Ответ 3

Вот статья о разбиении на страницы: разбиение на страницы-в реальном времени на основе данных на основе курсора

Курсоры - нам нужно иметь хотя бы один столбец с уникальными последовательными значениями для реализации разбиения на страницы на основе курсора. Это может быть похоже на параметр Twitters max_id или Facebook после параметра.

Ответ 4

В некоторых подключениях Graph API по умолчанию используются курсоры. Вы можете использовать параметры "limit" и "before" / "after" в своем вызове. Если вы все еще не поняли, вы можете разместить здесь свой код, и я могу объяснить его.