cyb*_*ach 2 database architecture mongodb nosql node.js
我正在使用 MongoDB 构建照片/视频共享社交网络。该社交网络具有提要、个人资料和关注者模型。对于我的“社交提要”设计,我基本上遵循了与本文类似的方法。具体来说,当用户发布故事时,我使用扇出写入桶方法。
我的问题是当用户“喜欢”一个故事时。我目前也在使用写时扇出方法,该方法基本上为每个用户的提要增加/减少故事的“喜欢计数”。我认为这可能是一个糟糕的设计,因为用户“喜欢”比他们发布的频率更高。用户可以通过喜欢和不喜欢热门帖子来快速使服务器饱和。
你们在这里推荐什么设计模式?我应该在读取时使用扇出吗?继续在后台工作人员写入时使用扇出?如果解决方案是“后台工作人员”,您建议后台工作人员使用什么方法?正在使用 Node.js。
任何帮助表示赞赏!
谢谢,亨利
我认为最好的方法是: 1. 增加或减少数据库中的计数器以跟踪喜欢的数量 2. 插入名为“喜欢”的集合中,每个喜欢作为单个文档,在其中跟踪用户的 id谁喜欢这个故事和喜欢的故事的id。
然后,如果您只需要喜欢的数量,您可以访问计数器数据,而且速度非常快,相反,如果您需要知道喜欢的来源,您将查询名为“喜欢”的集合,通过故事 ID 查询并获取所有用户的 ID谁喜欢这个故事。
我在类似集合中谈论的文件将是这样的:
{_id: 'dfggsdjtsdgrhtd'
'story_id': 'ertyerdtyfret',
'user_id': 'sdrtyurertyuwert'}
Run Code Online (Sandbox Code Playgroud)
您可以将计数器存储在故事的文档本身中:
{
...
likes: 56
}
Run Code Online (Sandbox Code Playgroud)
您还可以跟踪故事文档中的最后一个赞(例如 1000.last,因为 mongodb 的文档大小限制为 16 mb,如果您的应用程序扩展得如此之多,您将遇到在单个文档中存储潜在无限数据的问题)。使用这种方法,您可以轻松查询“喜欢”集合并获得最后的喜欢。
当有人不喜欢某个故事时,您可以简单地从“喜欢”集合中删除喜欢的文档,或者,作为更好的方法,(例如:您在喜欢某人的故事时发送通知),只需将其存储在不喜欢的文档中,以便如果它将再次被同一用户点赞,您将检查该点赞是否已插入,并且您不会再发送通知。
示例:第一次插入:
{_id: 'dfggsdjtsdgrhtd'
'story_id': 'ertyerdtyfret',
'user_id': 'sdrtyurertyuwert'
active: true}
Run Code Online (Sandbox Code Playgroud)
当不喜欢更新到这个
{_id: 'dfggsdjtsdgrhtd'
'story_id': 'ertyerdtyfret',
'user_id': 'sdrtyurertyuwert'
active: false}
Run Code Online (Sandbox Code Playgroud)
添加每个赞后,检查是否存在具有相同故事 ID 和相同用户 ID 的现有文档。如果有,如果 active 为 false,则表示用户已经喜欢和不喜欢该故事,因此如果它再次被喜欢,您将不会发送已发送的通知!
| 归档时间: |
|
| 查看次数: |
3365 次 |
| 最近记录: |