数据库设计"喜欢"在社交网络(MongoDB)

时间:2014-08-08 03:08:19

标签: node.js mongodb architecture database nosql

我正在使用MongoDB构建照片/视频共享社交网络。社交网络具有提要,配置文件和关注者模型。对于我的“社交Feed”设计,我基本上采用了与this article类似的方法。具体来说,当用户发布故事时,我使用了带有桶方法的扇出。

我的问题是用户“喜欢”某个故事。我目前也在使用扇出写入方法,它基本上为每个用户的提要增加/减少故事的“像计数”。我认为这可能是一个糟糕的设计,因为用户“喜欢”比他们发布更频繁。用户可以通过喜欢和不喜欢流行的帖子来快速饱和服务器。

你们这里推荐的设计模式是什么?我应该在阅读时使用扇出吗?继续使用Fan-out写入后台工作人员?如果解决方案是“后台工作人员”,您建议将什么方法用于后台工作人员?我正在使用Node.js。

感谢任何帮助!

谢谢, 亨利

1 个答案:

答案 0 :(得分:4)

我认为最好的方法是: 1.增加 - 减少数据库中的计数器以跟踪喜欢的数量 2.插入名为“like”的集合,每个集合都像一个单独的文档,在那里您可以跟踪喜欢故事的用户的ID和喜欢的故事的ID。

然后,如果您只需要喜欢的数量,那么您可以访问计数器数据而且速度非常快,相反,如果您需要知道您喜欢的位置将在哪里查询名为“喜欢”的故事ID查询并获取所有喜欢这个故事的用户ID。

我在同一个集合中讨论的文件将是这样的:

{_id: 'dfggsdjtsdgrhtd'
'story_id': 'ertyerdtyfret',
'user_id': 'sdrtyurertyuwert'}

您可以将计数器存储在故事的文档中:

{
...
likes: 56
}

您还可以在故事的文档中跟踪最后的喜欢(例如1000.最后因为mongodb的文档大小有限到16 MB,如果您的应用程序扩展太多,您将遇到在单个文档中存储潜在无限数据的问题)。通过这种方法,您可以轻松查询“喜欢”收藏并获得最后的喜欢。

当某人不喜欢故事时,你可以简单地从“喜欢”的集合中删除类似的文档,或者,作为更好的方法,(例如:当某人的故事被喜欢时你发送通知),只需存储在那个不受欢迎的文档中,因此,如果相同的用户再次喜欢它,您将检查已经插入了类似的内容,并且您不会发送另一个通知。

例如: 第一次插入:

{_id: 'dfggsdjtsdgrhtd'
'story_id': 'ertyerdtyfret',
'user_id': 'sdrtyurertyuwert'
 active: true}

当不喜欢更新此

{_id: 'dfggsdjtsdgrhtd'
    'story_id': 'ertyerdtyfret',
    'user_id': 'sdrtyurertyuwert'
     active: false}

当添加每个like时,检查是否存在具有相同故事ID和相同用户ID的现有文档。如果有,如果有效,则表示用户已经喜欢并且不喜欢该故事,这样如果它再次被喜欢,您将不会发送已经发送的通知!

相关问题