"加载更多评论"按钮 - >防止由于数据库

时间:2017-05-21 08:04:26

标签: mysql

我正在编写一个用户可以阅读和撰写评论的应用程序。

当评论数量超过一定限度时,"加载更多内容"显示按钮,并存储已加载注释的偏移量。

每当用户写入或删除自己的注释时,我都会更新此偏移量,以便不会加载任何重复项,也不会遗漏任何注释。

但是我忘记了数据库发生变化的情况,因为其他用户添加/删除了评论。

所以偏移方法似乎不可靠,所以有没有办法解决这个问题,可能是通过保存最后一条评论的id并将其作为某种"偏移"?

我的查询中的WHERE子句如下:

WHERE x = ? ORDER BY y = ?(x和y都不是ID,y不是唯一的)

1 个答案:

答案 0 :(得分:1)

您可以使用时间戳列或甚至主键本身来执行此操作,具体取决于您如何设置它。以下是使用主键的示例,如果它是AUTO_INCREMENT整数。

CREATE TABLE `comments` (
    `comment_id` int NOT NULL AUTO_INCREMENT,
    `thread_id` int NOT NULL, 
    `comment` text,
    PRIMARY KEY (`comment_id`),
    FOREIGN KEY (`thread_id`) REFERENCES `threads` (`thread_id`)
);

在该表定义中,您有一个AUTO_INCREMENT int主键。您还有一个thread_id,它是threads表的外键。最后,您在comment中有评论。

首次加载某个帖子的页面时,您需要执行以下操作:

SELECT comment_id, comment 
FROM comments 
WHERE thread_id = 123 
ORDER BY comment_id
LIMIT 10; 

这意味着您将为您的int PK为您的给定帖子选择10条评论(在这种情况下为123)。现在,当您显示此内容时,您需要以某种方式保存最大的comment_id。在这种情况下说它是10。然后,单击“加载更多注释”按钮将此最大comment_id传递给服务器。服务器现在将执行以下操作:

SELECT comment_id, comment
FROM comments
WHERE thread_id = 123 AND comment_id > 10 -- 10 is the value you passed in as your largest previously loaded comment_id
ORDER BY comment_id
LIMIT 10;

现在您还有一组十条评论,其中您知道所有评论都不可能与之前显示的评论重复,并且您永远不会跳过任何评论,因为它们总是按升序排序{{1} }键。

如果您现在回头查看用于加载初始注释集的查询,您会发现它与加载其他注释的查询几乎相同,因此您实际上可以对两者使用相同的查询。最初加载评论时,只需将int作为最大0

如果您没有像这样工作的主键,您也可以使用comment_id列执行相同的操作,并且您不希望将其更改为这样工作。您只需按timestamp列对结果进行排序,然后将最后加载的评论的timestamp传递给“加载更多评论”功能。为了避免跳过同时发布的评论,您可以使用具有六位小数秒精度的timestamp。将timestamp列创建为timestamp。然后,您的时间戳将被记录为TIMESTAMP(6)之类的内容,其中第二个之后的最后六位数是一小部分。有了这么高的精度,你几乎不可能同时记录评论。

当然,您仍然可以在相同的时间戳记录两条或更多条评论,但这不太可能。这使得2014-09-08 17:51:04.123456 AUTO_INCREMENT成为更好的解决方案。最后一个选项是使用基于时间的int,因为它们包含一种机制,通过在事件发生在同一微秒时稍微调整值来确保唯一性。它们仍然按时间排序。这个问题是MySQL对UUID没有很好的支持。