2013-03-15 2 views
1

У меня есть таблица базы данных, например «предметы». У меня есть график этих элементов, отсортированный по полю ascended_at (datetime). Мне нужно сделать pagination api для такой временной шкалы. Итак, первый мой вариант был:Точная разбивка на страницы по дате времени

HTTP GET /items/timeline?page=[PAGE_NUM] 

который стреляет

SELECT * FROM items LIMIT 10 OFFSET [0, 10, 20, ...] ORDER BY ascended_at; 

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

HTTP GET /items/timeline?page=[PAGE_NUM]&from_asc_at=123123123 

который стреляет

SELECT * FROM items WHERE ascended_at <= [asc_at_parameter] LIMIT 10 OFFSET [0, 10, 20, ...] ORDER BY ascended_at; 

, но это не точно, потому что можно иметь два элемента с одинаковой ascended_at, и вы можете увидеть то же самое элемент на двух разных страницах (но не должен).

Итак, мой вопрос: каковы возможные решения для этого?

  • Использовать идентификатор (потому что он уникален)? Но что, если он не упорядочен по ID?
  • Любые идеи больше?

ответ

0

Если ваши идентификаторы предметов автоматически увеличиваются, вы можете проверить, что будет следующим значением «автоинкремент» при первом получении предметов (до разбивки на страницы).

Сохраните это значение настойчиво (возможно, в сеансе var) до следующего поиска и добавьте в ваш SQL-запрос фильтр < {maximumID}, чтобы улучшить «стабильность набора результатов», когда пользователь разбивается на страницы (все новые элементы, созданные между начальным поиск и разбиение на страницы не будут получены).

EDIT

Для обработки вещи делеции, вы должны сделать «мягкие удалений»: не сразу удалить элемент из БД, но хранить дату удаления в поле даты и времени, так что элементы все еще существуют в DB на некоторое время.

Когда будет произведен новый поиск, вы будете хранить в сеансе текущее время сервера и добавить критерии (например, date_deleted IS NULL OR date_deleted > {searchDate}), чтобы все элементы, удаленные после поиска, по-прежнему отображались для этого конкретного поиска.

Вам нужно будет создать запланированное задание, чтобы «действительно» удалить элементы из БД после некоторой задержки.

+0

Мне кажется, что он не обрабатывает удаление элементов –

Смежные вопросы