我已就以下主题做过一些研究,我想从更有经验的开发人员那里获得建议,看看我的解决方案是否是最好的。
如果您不知道Snapchat是什么,它是一个移动应用程序,可让您与朋友分享照片。
我感兴趣的是应用程序的通知部分,用户检查他是否收到了新照片。它看起来像这样:
我想要做的是找到最好的方法来检查,当用户打开应用程序或刷新视图时,如果他使用 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?
答案 0 :(得分:3)
关于通知流程 - 看起来没问题 - 但是如果用户使用多个设备(平板电脑,手机等?) - 每个设备需要包含设备ID和状态数组
创建的索引将由数据库引擎维护