Сохраняйте повторяемость разбивки на страницы при выполнении операций изменения
-
01-07-2019 - |
Вопрос
Если кто-то хочет разбить результаты на страницы из источника данных, поддерживающего разбиение на страницы, мы должны перейти к процессу:
- определение размера страницы - это количество результатов, которые должны отображаться на странице;
- извлекайте каждую страницу, запрошенную пользователем, используя смещение = номер страницы (на основе 0) * размер страницы
- покажите результаты выбранной страницы.
Все это работает просто отлично, не принимая во внимание тот факт, что операция может повлиять на серверную систему, которая испортит разбиение на страницы.Я говорю о том, что кто-то вставляет данные между выборками страниц или удаляет данные.
page_size = 10;
get page 0 -> results from 0 to 9;
user inserts a record that due to the query being executed goes to page 0 - the one just shown;
get page 1 -> results from 10 to 19 - the first results on the page is the result on the old page 0.
Описанное поведение может привести зрителя в замешательство.Знаете ли вы какое-нибудь практическое решение для решения этой проблемы?
Решение
На этот счет существует несколько философских школ.
- данные обновляются, пусть так и будет
- Вы могли бы реализовать какой-то метод кэширования, который будет содержать весь результирующий набор (это может быть не вариант при работе с действительно большими наборами данных)
- Вы могли бы выполнить сравнение для каждой операции с страницей и уведомить пользователя, если общее количество записей изменится
.
Другие советы
Если обновления, которые вас интересуют, - это в первую очередь новые вставки (например, сам StackOverflow, похоже, страдает от этой проблемы при перелистывании вопросов и поступлении новых вопросов), один из способов справиться с этим - зафиксировать временную метку при выполнении первого запроса разбивки на страницы, а затем ограничить результаты запросов для последующих страниц элементами, которые существовали до этой временной метки.
Пока пользователи понимают, что базовые данные постоянно меняются, они не будут сбиты с толку.Так что просто сделай это простым способом.
Вы могли бы кэшировать первые несколько страниц результата и использовать их для последующих просмотров, но тогда результаты будут не синхронизированы с базой данных, что еще больше сбивает с толку.