0

我正在构建一个 RSS 阅读器,它会在阅读帖子时记录(就像 Google Reader 所做的那样)。当我向下滚动时,它会在一定程度上将帖子标记为已读,方法是在“已读文章”表中插入行,该表记录了已读项目 ( ciid)、阅读该项目的用户 ( uid) 和阅读日期 ( dateRead)。

现在,我正在考虑如何提供“全部标记为已读”功能。如果只有 25 篇未读文章,那就足够简单了。我将查询 25 篇文章的主文章表——我有一个子查询来确定哪些文章未​​读——当前用户未读,收集ciid需要标记为已读的 s 并插入新的已读条目。但是,如果有 20,000 个条目未读怎么办?ciid检索 20,000 个未读条目、收集这些条目然后将 20,000 个插入命令发送回 MySQL 服务器似乎效率很低。

有没有更有效的方法来做到这一点,也许是直接处理所有这些的 SQL 查询?如果系统上只有一两个用户,我想我的低效方法不会有问题,但我希望系统能够相对较好地扩展。

4

1 回答 1

2

你可以做类似的事情

REPLACE INTO read_articles (uid, dateread, ciid) 
SELECT <user-id>, NOW(), id FROM articles

您必须在其中指定要插入的用户 ID。REPLACE INTO 将删除任何现有的日期读取。如果你不想要这种行为,你可以这样做

INSERT INTO read_articles (uid, dateread, ciid) 
SELECT <user-id>, NOW(), id FROM articles
ON DUPLICATE KEY UPDATE uid=uid;

但是,我不认为您采用的方法(按文章存储已读文章)是可扩展的。当用户单击mark all时,您可以将该事件的日期时间存储在 users 表中。所有早于最后标记日期的文章都被视为已读。

也许您应该只考虑表中最近 7 天的文章,即。定期删除超过一周的 read_articles 记录。您忽略所有超过 7 天的文章(因此实际上您假设它们已被阅读)。

于 2013-07-07T23:41:05.480 回答