从不向同一个用户显示同一个文档两次

never show same document to same user twice

我有一个服务器存储内容 5,000 个文件。假设我有 100 万用户,他们都按照自己的节奏查询 50 个新文档,直到看到所有内容。

我想确保每个用户只看到内容并与之互动一次,再也不会像 Tinder 那样。

我的第一个想法是用看过文档的用户的用户 ID 列表标记每个文档。然而,这个列表会变得很长……就像每个文档有 100 万个用户 ID 的列表——但这听起来真的会降低查询性能。

对于我如何才能 return 只向用户提供一次内容而不再重复,有没有人有更好的想法。

p.s 我正计划用 mongoDB

进行构建

p.p.s 我考虑制作一个 'document-ids-seen' 的列表并将其附加到用户的文档中,然后该用户进行的每个查询 'filter' 输出匹配的结果'document-ids-seen',但同样的挑战,查询长度会随着用户不断交互和引入新内容而线性增长。

我只是想如果我在每个文档上都加上时间戳,我可以完全避免内容与用户交互的多对多关系,因此只在之后查询更多文档一个特定的时间戳 'X'.

其中 'X' 可以存储在我的 'users' table 中。

所以当打开应用程序时,我会同步我的 'users' table,然后在时间戳 'X' 之后发出查询,然后当结果返回时,我会更新我的'users' table 再次使用我的新时间戳 X.

或者 'x' 不能是时间戳,'x' 可能只是一个自动递增的 id

解决方案取决于"at their own pace"的确切含义。

您的第二个 post 建议时间安排由用户决定,但她将按照您的应用程序确定的顺序向她展示文档,例如按照新闻创建时间戳的顺序获取新闻项。在这种情况下,你的时间戳或自增解决方案将起作用,并且它对数据量和查询复杂度的影响很小。

但是,如果用户还可以选择要查看的文档,这将不再有效,因为已查看的文档可能分散在整个文档集中。有效处理此问题的解决方案包括两个设计思想:

(a) 想象一下,在给定的时间点,大多数用户会查看整个文档集中的一小部分还是大部分。如果预期特定用户只对一小部分文档感兴趣,则该用户查看过的文档数将相当少。 (例如,假设文档是关于 IT 的,一个用户只想查看 MongoDB 个文档,而另一个用户主要想查看 Linux 个文档。)如果所有用户都对大部分或全部文档感兴趣,那么计数特定用户 未查看 的文档数量会很小。 (例如,每个人都试图关注的一组新闻。)根据具体情况,只存储每个用户的 viewed/not 个已查看文档 ID 的小列表,这也将简化对仍待查看的文档的查询已查看。

(b) 对于每个用户,不要存储单个文档 ID(已查看或未查看)的列表,而是存储此类 ID 间隔的列表。例如,如果您存储尚未查看的文档的 ID,并且一些文档被添加到数据库中,那么,当用户打开时,她的最高间隔将从 (someLowerId, formerHighestId) 更新为 (someLowerId, currentHighestId)。当用户查看文档时,包含其 ID 的间隔从 (lowId, highId) 拆分为 (lowId, viewedId - 1), (viewedId + 1, highId),其中一个或两个间隔可能为空。包括或排除这样的间隔也将简化查询,而不是列出单个 ID。