【发布时间】:2016-06-27 05:06:06
【问题描述】:
我对以下主题进行了一些研究,我想从更有经验的开发人员那里获得建议,看看我的解决方案是否是最好的。
如果您不知道 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 来自集合 Messages。 Receiver_ID 字段已编入索引。
因此,当用户启动或刷新视图时,我查询集合 Notifications 并将字段 Receiver_ID(已编入索引)设置为实际 User_ID 查找他可能收到的所有消息。如果他收到了消息,我查询 Messages 集合以找到关于他收到的消息的所有信息(带有 Message_ID 由上一个查询获得的 Notifications em>)。
之后,我删除集合 Notifications 上的文档(如果他还没有打开消息,我将 Message_ID 存储在设备本地) .
要将文档添加到 Notifications 和 Messages 集合,在用户发送新消息时完成。
Notifications 集合中的字段 Receiver_ID 已编入索引以加快查询速度。如果我正确理解 MongoDB 的索引,写入操作会有点慢,但读取速度会好很多。但是为了确定,Receiver_ID 索引将在新文档添加到集合 Notifications 时自动更新,或者我必须手动更新它?
这是解决这个问题的最佳解决方案还是有更好的解决方案?
编辑:我遇到了另一个问题: Receiver_ID 字段已编入索引,因此我可以更快地查询 Notifications 集合。这样做让我得到 Message_ID 但之后,我需要查询 Messages 集合以检索有关消息的所有信息。我是否还应该在集合消息中索引字段 Message_ID,知道此集合将存储所有发送过的消息并且可能需要一些时间才能找到相应的消息? 或者字段 _id 是由 Mongo 自动索引的,所以我不需要这样做?
EDIT 2:关于第二个EDIT的问题,我发现我不需要索引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?
【问题讨论】:
标签: mongodb notifications