MongoDB:Snapchat类似数据库的通知模式

时间:2016-03-11 20:04:47

标签: mongodb notifications

我已就以下主题做过一些研究,我想从更有经验的开发人员那里获得建议,看看我的解决方案是否是最好的。

如果您不知道Snapchat是什么,它是一个移动应用程序,可让您与朋友分享照片。

我感兴趣的是应用程序的通知部分,用户检查他是否收到了新照片。它看起来像这样:

snapchat notification view

我想要做的是找到最好的方法来检查,当用户打开应用程序或刷新视图时,如果他使用 MongoDB 收到了新图像/消息。

经过一些研究,最好的解决方案是在我的Mongo数据库中有三个集合:

User : User_ID
       Username
       PasswordHash
       ...

User_ID是唯一的并由MongoDB生成

Messages: Message_ID
          Message_Content
          ...

其中 Message_ID 是唯一的并由MongoDB生成。该集合可以存储其他信息,如图像URL(存储在BLOB中的图像)等。

Notifications : Notification_ID
                Sender_ID
                Receiver_ID (index)
                Message_ID

Notification_ID是唯一的并由MongoDB生成。 Sender_ID和Receiver_ID是集合 User 中的User_ID。 Message_ID 来自集合消息 Receiver_ID 字段已编入索引。

因此,当用户启动或刷新视图时,我查询集合 Notifications ,并将字段 Receiver_ID (已编入索引)设置为实际 User_ID < / em>查找他可能收到的所有邮件。如果他收到了消息,我查询消息集合以查找有关他收到的消息的所有信息(使用上一个查询获得的 Message_ID 通知)。

之后,我删除了 Notifications 集合上的文档(如果他尚未打开消息,我将 Message_ID 存储在设备上) 。

要将文档添加到通知消息集合中,可在用户发送新消息时完成。

来自通知集合的字段 Receiver_ID 被编入索引以更快地进行查询。如果我正确理解MongoDB的索引,写操作有点慢,但读取速度要好得多。但只是为了确定, Receiver_ID 索引会在新文档添加到集合通知时自动更新,或者我必须手动更新它?

这是解决这个问题的最佳解决方案还是有更好的解决方案?

编辑:我还有另一个问题: Receiver_ID 字段已编制索引,因此我可以更快地查询 Notifications 集合。这样做让我得到 Message_ID ,但之后,我需要查询 Messages 集合,以便检索有关该消息的所有信息。我是否还应该在集合消息中索引 Message_ID 字段,知道此集合将存储所有已发送的消息,并且可能需要一些时间才能找到相应的消息? 或者字段_id是否被Mongo自动索引,所以我不需要这样做?

编辑2:关于第二次编辑的问题,我发现我不需要索引 Message_ID ,因为默认情况下所有_id都被编入索引。

  

MongoDB在创建集合时为所有集合创建_id索引,这是_id字段上的升序唯一索引。您无法删除_id字段上的索引。

您可以详细了解here

感谢阅读!

以下是我在寻找解决方案时发现的一些链接:

Develop Database Schema for Notify like facebook

How to implement instant notification system using Express + Mongo Rest API?

Is it better to store notifications of all users under one collection / table OR rather provide each user his own collection / table to store notifications?

1 个答案:

答案 0 :(得分:3)

提供的研究看起来令人印象深刻!

  1. 关于通知流程 - 看起来没问题 - 但是如果用户使用多个设备(平板电脑,手机等?) - 每个设备需要包含设备ID和状态数组

  2. 创建的索引将由数据库引擎维护