我有一个新闻表。我们称这个表为news
。一群用户不断地将新行插入news
。当前正在浏览新闻Feed的用户(来自news
表的数据)。我怎样才能使分页一致,记住一个事实,即当用户浏览第一页时,其他用户在其中插入更多数据。因此,如果第一页有18条新闻,那么我需要使用OFFSET 18
,但在这种情况下,我将检索错误的数据,因为已经插入了新消息。Postgres:动态偏移量
如何正确执行分页?
我有一个新闻表。我们称这个表为news
。一群用户不断地将新行插入news
。当前正在浏览新闻Feed的用户(来自news
表的数据)。我怎样才能使分页一致,记住一个事实,即当用户浏览第一页时,其他用户在其中插入更多数据。因此,如果第一页有18条新闻,那么我需要使用OFFSET 18
,但在这种情况下,我将检索错误的数据,因为已经插入了新消息。Postgres:动态偏移量
如何正确执行分页?
在应用程序客户端中填充页面的最新和最旧的行时间戳记。如果它是一个Web应用程序,则next
和previous
链接会是这样的:
<a href="/news?newest=2016-08-06+20%3A17%3A05.882252%2B00">Previous</a>
<a href="/news?oldest=2016-08-05+20%3A17%3A05.882252%2B00">Next</a>
然后通过从客户端接收到查询的一个值,另一个为null
:
(
select *
from (
select *
from news
where ts > :newest
order by ts
limit 20
) s
order by ts desc
)
union all
(
select *
from news
where ts < :oldest
order by ts desc
limit 20
)
在同一毫秒内发生两次插入是不太可能的。
我使用GUID v4,所以'>'操作符不适用。 – stkvtflw
@stkvtflw错误修复 –
是否按新闻插入时间戳排序分页?该行是否有唯一的ID? –
@ClodoaldoNeto,行具有uid和插入时间戳。我应该使分页基于插入时间戳而不是偏移量?我不确定,是否有可能拥有多个具有唯一时间戳的行?我的意思是,如果它在单个表格中,每ms可以插入比一行更快的速度吗? – stkvtflw