• 数据换页问题的总结


    对于前端展现来说,如果一个页面中需要展现的数据条数过多,就必须设计分页查询功能,最常见的做法是采用pageIndex和pageSize参数来一页一页的拉取数据。然而实际的业务情况往往要复杂的多,一旦在分页过程中,原有数据的条数或者排序发生变化,就无法按照原有的页码获得相应的数据。

    简单总结一下,换页问题一般有如下几种情况:

    第一种情况 -- 最简单的情况

    • 特征:新增数据出现原有数据的尾部,不影响原有各页数据的页码。
    • 典型示例:时间正序分页查询
    • 分页方案:这是一种最简单的情况,用pageIndex+pageSize即可顺序获取每页数据,无需特殊处理。
    • 备注:这种理想情况比较少见

    第二种情况 -- 稍微复杂一点

    • 特征:新增数据增加于原有数据的前面,影响原有各页的页码
    • 典型示例:时间倒序分页查询
    • 分页方案:不要使用pageIndex参数来获取分页数据,而是为每个数据项增加一个排序标识字段pageStamp,里面存储一个有序的唯一标识,例如timestamp值。换页时根据上次取到的分页数据最后一个项目的pageStamp,继续向下获取小于这个pageStamp的n条数据。这个方案的优点在于,如果有需要,还可以根据上次取得的分页数据的第一个项目中的pageStamp标识,向上方获取大于该pageStamp的n条数据。
    • 备注:返回评论列表,回复列表等时间逆序的数据时很有用。

    第三种情况 -- 借助于类缓存的版本机制

    • 特征:数据排序定时变化,每次重排,各页数据全变
    • 典型示例:热度排行榜;数据源分散,需要先汇总后排序的数据列表。
    • 分页方案:每次排序结果都保留,以pageStamp标识版本。取第一页数据时,前端获得这个pageStamp标识。换页过程中把这个版本标识继续传递给服务端,只获取该版本的分页数据,也就不会分页混乱。
    • 备注:这种方式理论上可以适用于任何情况,但是如果数据条数很多,一般会根据业务需求指定一个限制,每个版本的排序数据中只保留固定的条数。一般情况下,不需要长期保留所有版本的数据,采用类似于缓存的过期机制处理即可。

    第四种情况 -- 无法采用任何正常的换页方案

      • 特征:数据排序实时变化,无法用页码分页。
      • 典型示例:可以实时更新排序的用户个性化推荐引擎。
      • 分页方案:存储曾经给该用户展示过的数据列表,作为过滤依据。从当前最新排序数据中,获得过滤列表以外的、足够条数的数据返回。
      • 备注:*必须* 根据业务特点,慎重设计过滤列表的存储方案,过滤方式等,谋求资源和性能上的最佳比例。

  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/csliwei/p/8094097.html
Copyright © 2020-2023  润新知