数据库表articles
包含10.000行(文章)
我想得到一篇随机文章,将其标记为已读并且永远不会再次获得,
所以我的下一个get请求应该返回除了那个之外的随机文章。
像我这样的成千上万的用户都在使用这个表。
我该如何实现?如何标记这些文章,以及如何仅搜索未读文章?
我试图在relatedUsers
表中创建列Articles
,该列填充了与读取该文章的用户对象的关系。我正在使用搜索查询:relatedUsers.objectId!=currentUserId
但是当此列获得2+ relatedUsers时,此解决方案停止工作,因为数据库返回的文章至少有一个relatedUser,其objectId不等于currentUserId
(表示所有用户)。
我现在正在使用Backendless.com,但如果我猜,该解决方案应该适用于任何数据库,包括backendless。如果没有,那么我应该使用哪种数据库?
答案 0 :(得分:2)
你现在可以做的是:
UserArticle
和articleId
userId
的表格
UserArticle
表将包含文章和尚未阅读这些文章的用户之间的关系UserArticle
userId = yourCurrentUserId
UserArticle
和articleId
移除userId
中的所选文章,表示该用户已阅读该文章这种方法最适合您的情况。它涉及多个请求,但目前您的要求不能更好。
此外,我们(Backendless团队)正在开发一个像contains
这样的关键字,使用它可以只与Users表有关系并且不会在一个请求中读取文章,所以建议的方法是很暂时。
答案 1 :(得分:1)
获取随机数取决于数据库。但基本的想法是有一个名为UserArticles
的表,每个用户一行,每篇文章已经读过(可能还有其他信息,如时间)。
然后,你可以这样做:
select a.*
from articles a
where not exists (select 1
from userarticles ua
where a.article_id = ua.article_id and ua.user_id = $user_id
)
order by rand()
limit 1;
order by rand() limit 1
肯定与数据库有关。但是,它让您了解如何解决问题。
选择文章后,您将此信息插入UserArticles
:
insert into UserArticles(user_id, article_id)
values ($user_id, $article_id);
其中$article_id
指的是上一步中检索到的文章。
注意:对于竞争条件,这应该没问题,除非单个用户可以同时与数据库建立多个连接,要求提供相同的信息。处理该案例需要更多地了解正在使用的数据库。