我正在寻找用于不断变化的数据的分页方法(每分钟大约1-3次更新)。
我有一个具有以下结构的会话列表
conversation : id, user_id, last_message, last_active
最活跃的会话每分钟更改1到3次,因此只要注册更改,last_active
列就会更新。用户可以进行100多次对话。
我遇到的问题是在last_active
值发生变化时对数据进行分页。
如果数据是静态的,您只需使用“ORDER BY DESC last_active LIMIT n,15'”进行分页。查询MySQL。但是因为last_active不断变化,所以项目的顺序可能会发生变化,因此永远不会出现在列表中(或多次显示)。
例如,如果每页限制为3,我的数据如下所示:
{id : 1, last_active : 10:14:41}
{id : 2, last_active : 10:14:31}
{id : 3, last_active : 10:13:55}
[Page - 1]
{id : 4, last_active : 10:13:30}
{id : 5, last_active : 10:12:06}
{id : 6, last_active : 10:11:10}
[Page - 2]
{id : 7, last_active : 10:10:20}
{id : 8, last_active : 10:10:06}
{id : 9, last_active : 10:09:22}
[Page - 3]
现在,当用户在第二页上时,如果对id = 7
执行了更新,则会通过ORDER BY
子句将其推送到查询的顶部,并且它永远不会显示在第3页。
组织这个的最佳方法是什么,以便我可以对这些数据进行分页而不会丢失行或复制它们?
答案 0 :(得分:2)
我看到了几种方法。问题是您需要定义用户的期望:
1)我希望我的数据始终是最新的。在这种情况下,我希望并理解第2页是最新的,我之前看过的第1页可能已经改变。如果我希望我的数据真正是最新的,我会好的。
2)我不太关心第二个结果,如果例如#7从未显示,我可能会被抛弃,因为它在某个时刻切换了页面。在这种情况下,我想显示第2页的结果,该结果在我发出初始第1页请求时是有效的。这将涉及缓存或添加一些其他字段。这可能是不方便的,除了如果用户对方便性/清晰度而不是确切的数据库数据更感兴趣的概率,那么我怀疑它们是否会一直逐页地说,20,为了找到一个项目,意味着您只需要在初始提取时缓存项目的前几页。
然后调整代码以从这些缓存的结果中获取1)分页是2-5和2)缓存的时间不是太长(比如10分钟 - 我们不希望有人点击第1页,如果第1页在午休时间在那里坐了一个小时)。
我认为大多数最终用户都属于#2类别。如果他们没有那么他们可能是技术不够混淆,你也可以添加一个注释。