仅实施公众和关注者新闻Feed

时间:2017-04-22 19:29:28

标签: node.js architecture rethinkdb news-feed

我想实现一个新闻Feed,用户可以在其中发布私人(共享)和公共活动。两者之间的区别在于公共活动显示在所有用户的新闻Feed中,私人活动会显示给我的所有关注者新闻Feed。

我一直在阅读有关实施新闻Feed的一些资源,而且我遇到了this开源项目。

从文档中引用

Next up we want to start publishing this activity on several feeds. First of all we want to insert it into your personal feed, and then into your followers' feeds

现在这适用于私人活动,我将活动发布到作者自己的Feed以及我的所有关注者Feed。 但问题是活动是公开的。在这种情况下,我必须将其发布到用户自己的Feed以及系统中的所有其他用户,以便此活动显示在他们的Feed中。 假设系统中有100万用户,则需要发布到100万个订阅源(可能是100万个DB记录)。我认为这不正确。

我想把其他收藏中的公共活动分开,这些活动对所有人都是可见的。此解决方案的此问题是假设我想要检索用户的Feed,而不是如何将来自用户的关注者的数据与公共Feed相结合。

考虑这个例子。

用户A有10个关注者,他们共发布了10个活动。因此,用户A的Feed有10个来自他的粉丝的活动。现在有用户B没有跟随用户A.用户B还发布了2项公共活动。现在,用户A的订阅源应该有12个活动(10个来自关注者+ 2个来自用户B公共活动),所以我将来自这两个收集的数据组合起来,并在组合结果集上实现排序,过滤等。

其他信息: platform: node.js DB: rethinkdb

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是设置一个包含私有和公共供稿的notifications表,其索引位于for

要插入私人通知:

r.table('notifications')
 .insert({'for': ['user', 'sonia'], message: "you've got mail"})

要插入公告:

r.table('notifications')
 .insert({'for': ['public'], message: 'hello, world'})

同时,使用getAll选择要订阅的通知:

r.table('notifications')
 .getAll(['public'], ['user', 'sonia'], {index: 'for'})
 .changes()

如果您的通知存储在多个表中,则可以使用union将它们合并为一个更改源,例如:

r.table('notifications').getAll('sonia', {index: 'for'})
 .union(r.table('public_notifications'))
 .changes()