2016-08-07 120 views
0

我有一个新闻表。我们称这个表为news。一群用户不断地将新行插入news。当前正在浏览新闻Feed的用户(来自news表的数据)。我怎样才能使分页一致,记住一个事实,即当用户浏览第一页时,其他用户在其中插入更多数据。因此,如果第一页有18条新闻,那么我需要使用OFFSET 18,但在这种情况下,我将检索错误的数据,因为已经插入了新消息。Postgres:动态偏移量

如何正确执行分页?

+0

是否按新闻插入时间戳排序分页?该行是否有唯一的ID? –

+0

@ClodoaldoNeto,行具有uid和插入时间戳。我应该使分页基于插入时间戳而不是偏移量?我不确定,是否有可能拥有多个具有唯一时间戳的行?我的意思是,如果它在单个表格中,每ms可以插入比一行更快的速度吗? – stkvtflw

回答

1

在应用程序客户端中填充页面的最新和最旧的行时间戳记。如果它是一个Web应用程序,则nextprevious链接会是这样的:

<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 
) 

在同一毫秒内发生两次插入是不太可能的。

+0

我使用GUID v4,所以'>'操作符不适用。 – stkvtflw

+0

@stkvtflw错误修复 –