我已经对以下主题进行了一些研究,我想从经验丰富的开发人员那里获得建议,以查看我的解决方案是否是最佳解决方案。
如果您不知道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字段建立索引。
因此,当用户启动或刷新视图时,我使用字段Receiver_ID(已建立索引)设置为实际的User_ID来查询集合Notifications,以查找他可能已收到的所有消息。如果他已经收到消息,我将查询Messages集合以查找有关他收到的消息的所有信息(使用上一个查询中的Notifications获得的Message_ID)。
之后,我删除集合通知上的文档(如果他尚未打开消息,则将Message_ID本地存储在设备上)。
要将文档添加到“通知和消息”集合中,需要在用户发送新消息时完成。
本场Receiver_ID从通知集合索引来更快地查询。如果我正确理解MongoDB的索引,写操作会变慢一些,但读取速度会好很多。但是请确保,当将新文档添加到集合Notifications中时,Receiver_ID索引将自动更新,否则我将不得不手动更新它?
是解决此问题的最佳解决方案还是有更好的解决方案?
编辑:我遇到了另一个问题:对Receiver_ID字段进行了索引,因此我可以更快地查询Notifications集合。这样做让我获得了Message_ID,但是在那之后,我需要查询Messages集合以便检索有关该消息的所有信息。我是否也应该在集合消息中为字段Message_ID编制索引,知道该集合将存储曾经发送过的所有消息,并且可能需要一些时间才能找到相应的消息?还是_id字段是Mongo自动索引的,所以我不需要这样做?
编辑2:关于第二次编辑的问题,我发现我不需要索引Message_ID,因为默认情况下所有_id都已索引。
创建集合时,MongoDB将为所有集合创建_id索引,该索引是_id字段上的升序唯一索引。您不能删除_id字段上的索引。
您可以在此处了解更多信息
谢谢阅读 !
这是我在寻找解决方案时找到的一些链接:
提供的研究令人印象深刻!
关于通知过程-看起来不错-但是如果用户使用多个设备(平板电脑,电话等)该怎么办-需要在每个设备中包含设备ID和状态数组
索引一旦创建,将由数据库引擎维护
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句