【问题标题】:Pagination Architecture分页架构
【发布时间】:2018-10-05 12:08:00
【问题描述】:

我最近才意识到,我认为万无一失的分页方法毕竟不是那么万无一失。我所说的万无一失的意思是分页或其结果满足以下两个条件:

  1. 最新帖子必须始终显示在索引页面上
  2. 每个帖子必须始终显示在同一页面上,以便将来可以访问

在我开始创建分页功能之前,我意识到如果我将index.php 视为page 1 并不断地向其附加新内容的页面,这将不会对用户非常友好。谁愿意在每次访问您的网站时看到相同的page 1 和相同的内容?任何人都不应该在每次访问您的网站时手动导航到新内容。

我对上述问题的解决方案是始终将index.php 视为最后一页。我曾认为这已经完全解决了问题,但我显然没有考虑清楚。尽管这种方法更好,因为最新的内容和最新的页面总是反映在 index.php 上,但我昨晚躺在床上时意识到,如果我总是将 index.php 填充到它的最大容量,比如 10 个帖子,那么剩余的帖子 ($postCount % 10) 将始终显示在 page 1 上,因此所有帖子仍将不断地来回移动 9 个位置。例如,如果只有 10 个帖子,所有帖子都会显示在 page 1,但一旦有人提交第 11 个帖子,所有帖子,但最旧或第 1 个帖子将显示在 page 2;此外,如果再发布 9 个帖子,最新的 10 个将显示在 page 2,最旧的 10 个将显示在 page 1 as expected; but, again, as soon as somebody publishes the 21st post, then the newest 10 would show up onpage 3, the next newest 10 would show up onpage 2, and the oldest post would obviously show up onpage 1`。

一个明显的“解决方案”或“修复”这个问题是不完全填充index.php 10 个帖子,而是在index.php 上显示剩余部分。但出于我希望是显而易见的原因,我不想这样做。

以前有没有人经历过并处理过这个问题? 如何设计架构,使index.php 始终是具有最新内容的最新页面,而帖子始终可以在同一页面上找到,而完全不移动?

任何帮助或见解将不胜感激!!!

【问题讨论】:

    标签: php architecture pagination


    【解决方案1】:

    最大的问题是:你真的需要“页面编号”吗?

    我最近采用的是有点不同的分页模式。我根据 边界条件: 和项目的 id 列出项目,该项目存在于下一页之外。

    假设您有一个包含项目41393534 的页面。上一页将是 4 项,即 41 之后,下一页将是 4 项,即 34 之前。所以你最终得到的链接是:

    • 首页:/list?limit=4
    • 下一页:/list?before=34&limit=4
    • 上一页:/list?after=41&limit=4
    • 最后一页:/list?after=0&limit=4

    在这种情况下,“下一页”将包含项目 33323029 ...您可以使用此页面中的 ID 来计算新的导航。

    主要的缺点是您在任何地方都没有“页面计数器”。但是你得到的是页面,它总是包含预期的元素(除非那些已经被删除),缓存内容的能力和“如果没有这样的元素怎么办”状态的内置处理。作为一个小奖励,由于不必使用offset,您还可以在 SQL 方面获得更好的性能。

    在处理 REST API 结构时,我个人开始使用这种方法。

    【讨论】:

    • 嗯.. 我很难理解相同的元素如何始终出现在您的方法的同一页面上? 此外,我得出的结论是,只要您在每个页面上显示固定数量的项目(例如 4 或 10 个)并保证每个项目始终保持在同一页面上,您就可以当有剩余页面(5 或 11 或其他)时,总是会有一个页面少于固定数量(少于 4 或 10)。 另一方面,我想包括分页的原因是为了更容易重新定位特定的帖子,或者更容易挖掘档案
    • [继续] ...至少在我实现搜索和过滤功能之前。但这将在我能够使用 MVP 验证产品的市场之后。
    • 我所描述的方法的要点是确保到页面的给定链接将始终包含相同的项目(您可以共享/书签/缓存该页面)。但这并不意味着您可以拥有不变的第 1 页、第 4 页或第 31 页,因为在这种分页形式中,您没有“枚举页面”的概念。而且我不知道这会如何影响档案/历史。
    • 我的问题的唯一实际“解决方案”似乎是在堆栈底部(在最后一页上)显示最新内容,或者显示具有最新内容的页面,即使它可能只有 1 个帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2019-01-29
    • 1970-01-01
    相关资源
    最近更新 更多