1

数据库表articles包含 10.000 行(文章)我想获取一篇随机文章,将其标记为已读并且永远不会再获取它,所以我的下一个获取请求应该返回除那篇之外的随机文章。像我这样的用户有成千上万,他们都在使用这张表。

我该如何实施?如何标记这些文章,以及如何仅搜索未读文章?

我试图relatedUsersArticles表中创建列,该列填充了与已阅读文章的用户对象的关系。我正在使用搜索查询:relatedUsers.objectId!=currentUserId但是当此列获得 2+relatedUsers 时,此解决方案停止工作,因为数据库返回文章,其中至少有一个 relatedUser,其 objectId 不等于currentUserId(表示所有用户)。

我现在正在使用 Backendless.com,但如果我猜,该解决方案应该适用于任何数据库,包括 backendless。如果不是,那么我应该为此使用哪种数据库?

4

2 回答 2

2

你现在可以做的是:

  1. 创建一个以UserArticle字段命名的表articleIduserId
  2. 添加用户或文章时,还应分别向该表添加与所有文章或用户的关系;这样,您的UserArticle表格将包含文章和尚未阅读这些文章的用户之间的关系
  3. 为了让用户获得随机未读文章,您:
    1. UserArticle从哪里检索项目userId = yourCurrentUserId
    2. 随机选择其中一个并通过其 ID 检索一篇文章
    3. UserArticle从byarticleId和中删除选中的文章userId,表示用户已阅读该文章

这种方法最适合您的情况。它涉及的请求不止一个,但现在您的要求不能更好地满足。

此外,我们(Backendless 团队)正在研究类似 的关键字contains,使用该关键字您将只能与 Users 表建立关系,并且不会在一个请求中阅读文章,因此建议的方法是非常临时的。

于 2015-11-16T19:25:12.313 回答
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);

where$article_id指的是在上一步中检索到的文章。

注意:这对于竞态条件应该没问题,除非单个用户可以有多个同时连接到数据库的请求相同的信息。处理这种情况需要更多关于正在使用的数据库的知识。

于 2015-11-14T18:56:04.163 回答