数据库中有某些记录(mysql,但不重要),它们是逐页显示或通过ajax加载的(这在任务中无关紧要)。
根据评分显示条目(按降序排列)。资源用户可以更改记录等级。
在移动到另一个页面或加载新页面时避免重复记录输出的最佳方法是什么?
例子。
假设我们在数据库中有以下记录列表:
条目 #1 - 评分 15
条目 #2 - 评分 14
条目 #3 - 评分 13
条目 #4 - 评分 12
条目 #5 - 评分 11
条目 #6 - 评分 0
假设页面一次显示 5 条记录。也就是说,当您第一次访问该页面时,我们将显示以下条目并按此顺序 - 第 1 号、第 2 号、第 3 号、第 4 号、第 5 号(按评分降序排列)。如果现在,当用户还在这个页面时,记录#6的评分改变了,比如变成20,那么记录#5会再次显示在第二页,这是不正确的。
解决此问题的最佳方法是什么?
我想到了一个变体,即每次传输已显示记录的数量和第二次 - 缓存,但两者似乎都不完全正确。他们如何在用户活跃度高的大型项目中解决此类问题?语言和数据库没有特别的作用,只有方法很有趣。
用户投票存储在单独的表中:
id user_id record_id 日期
记录表中分别记录:
身份证评分
有一个选项不将评分存储在记录表中,而是每次计算直到某个日期的投票数,但在我看来这种方法很糟糕,因为。将会有很大的负载,每次您都必须对所有可用记录进行排序。
1个选项。您可以缓存结果。(eg memcache). 如下。缓存 ID 使用时间戳。那些。我去了第一个并学习了时间戳。在我的下一次通话中,我得到了带有这个时间戳的缓存数据。当评级发生变化时,会使用新的时间戳组织一个新的缓存。如果您进一步采用这种方法,您可以只尝试受影响的页面。无论如何,这不是对实现的完整描述,而是一个可以开发的想法
选项 2。在单独的页面上存储带有时间戳的评分历史记录。再次确保将我们正在使用的时间戳传输到服务器(会话中的参数、cookie 或变量)。您还可以丢弃访问者当前正在使用的标签。并在皇冠上加上另一个脚本,清理没有人需要的历史。
但是,在我看来,所有这些都是不必要的复杂性。或者,最好向访问者显示:“我的朋友,评分已更改”?例如,以一种简单的方式,将访问页面上的记录的 sessionID 存储在您访问的页面上,如果它们中的任何一个在您访问的页面上,则发出一条消息......或者所有相同的 memcache。在其中,我们写入评级已更改的记录的 ID。打开新页面时,我们显示消息“帖子链接的评分已更改......这也会增加“查看深度”;)
有用于大型项目的工具。例如,我们有很多包含很多记录的表:ag-grid + OData。这些是适用于所有场合的现成的、经过验证的工具。
在所描述的示例中,我看到了两种解决方案:
1) 静力学。更新记录时,向用户发送评级已更改的通知。不要让新数据进入 - 制作一个更新表格的按钮,单击时会发生更新。
2) 动力学。显示记录时,将输出记录的Id保存在客户端。如果服务器上的评分已更新,则服务器向客户端发送通知,其中包含更新评分的记录的 Id 和评分值。如果此 ID 在显示的 ID 中,则更新客户端上的当前页面,否则忽略它。可以通过对服务器的另一个请求或在客户端代码(js、ts、...)的帮助下完成更新。
选项之一的选择取决于使用情况,例如,如果假设用户在某个时间点对评分进行快照,则第一个非常适合,如果您需要一个持续向上的页面,则第二个非常适合- 迄今为止的评级。您可以放置一个复选框:静态/动态并实现这两个选项。还有更多可能的用例。下一个问题将是加载服务器。
第一个,不像第二个,不需要服务器的浏览器通知,这是一个优点,如果动态更新不重要,那么你应该选择它。
顺便说一句,我不认为在第 2 页显示数字 5 是错误的,因为如果在它们的位置不显示记录,排序有什么用?