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

安茹

我已经对以下主题进行了一些研究,我想从经验丰富的开发人员那里获得建议,以查看我的解决方案是否是最佳解决方案。

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

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

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字段上的索引。

您可以在此处了解更多信息

谢谢阅读 !

这是我在寻找解决方案时找到的一些链接:

为像Facebook这样的通知开发数据库架构

如何使用Express + Mongo Rest API实施即时通知系统?

将所有用户的通知存储在一个集合/表下是否更好,还是为每个用户提供自己的集合/表来存储通知?

教授79

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

  1. 关于通知过程-看起来不错-但是如果用户使用多个设备(平板电脑,电话等)该怎么办-需要在每个设备中包含设备ID和状态数组

  2. 索引一旦创建,将由数据库引擎维护

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类似于关系数据库的模型的类或结构?

来自分类Dev

如何返回JSON数据,类似于XML从数据库asp.net返回数据的方式

来自分类Dev

OrientDB中的哪种数据库类型类似于neo4j的图形数据库

来自分类Dev

OrientDB中的哪种数据库类型类似于neo4j的图形数据库

来自分类Dev

最终一致的文档存储数据库类似于cassandra

来自分类Dev

在MySQL数据库中插入类似于50小时的小时值?

来自分类Dev

从标签区域获取值(类似于stackoverflow)并将其保存在数据库中

来自分类Dev

如何确保[BsonId]字段的名称类似于数据库中的属性名称,而不是`_id`

来自分类Dev

c#使用类似于SQL WHERE子句的EF过滤数据库结果

来自分类Dev

我如何在我的数据库中获取一个类似于字段的值?

来自分类Dev

合并两张纸上的数据以形成综合输出(类似于数据库外部联接)

来自分类Dev

Mongoose 模式更新不是由 Mongodb 数据库获取的

来自分类Dev

SSMS的IntelliSense是否具有类似于Visual Studio XML文档注释/支持数据库对象摘要的功能?

来自分类Dev

将电话联系人与MySQL数据库进行比较的有效方法是什么?(类似于WhatsApp)

来自分类Dev

当用户在搜索栏中键入类似于使用模型的数据库表的方式时,如何过滤数组结果?

来自分类Dev

将电话联系人与MySQL数据库进行比较的有效方法是什么?(类似于WhatsApp)

来自分类Dev

在使用Mongoose查询Mongo数据库中的集合时,如何查找类似于查询项的值?

来自分类Dev

数据库连接模式

来自分类Dev

类似于字典的JSON模式

来自分类Dev

hasManyThrough()或类似的数据库模型

来自分类Dev

类似于Gson的Scala库

来自分类Dev

数据库模式与数据库表空间?

来自分类Dev

自动从数据库查找数据模式

来自分类Dev

MongoDB数据库消失了

来自分类Dev

MongoDB动态数据库

来自分类Dev

数据库NoSQL(MongoDB)

来自分类Dev

MongoDB数据库消失了

来自分类Dev

部署 MongoDB 数据库

来自分类Dev

MongoDB 数据库设计

Related 相关文章

  1. 1

    类似于关系数据库的模型的类或结构?

  2. 2

    如何返回JSON数据,类似于XML从数据库asp.net返回数据的方式

  3. 3

    OrientDB中的哪种数据库类型类似于neo4j的图形数据库

  4. 4

    OrientDB中的哪种数据库类型类似于neo4j的图形数据库

  5. 5

    最终一致的文档存储数据库类似于cassandra

  6. 6

    在MySQL数据库中插入类似于50小时的小时值?

  7. 7

    从标签区域获取值(类似于stackoverflow)并将其保存在数据库中

  8. 8

    如何确保[BsonId]字段的名称类似于数据库中的属性名称,而不是`_id`

  9. 9

    c#使用类似于SQL WHERE子句的EF过滤数据库结果

  10. 10

    我如何在我的数据库中获取一个类似于字段的值?

  11. 11

    合并两张纸上的数据以形成综合输出(类似于数据库外部联接)

  12. 12

    Mongoose 模式更新不是由 Mongodb 数据库获取的

  13. 13

    SSMS的IntelliSense是否具有类似于Visual Studio XML文档注释/支持数据库对象摘要的功能?

  14. 14

    将电话联系人与MySQL数据库进行比较的有效方法是什么?(类似于WhatsApp)

  15. 15

    当用户在搜索栏中键入类似于使用模型的数据库表的方式时,如何过滤数组结果?

  16. 16

    将电话联系人与MySQL数据库进行比较的有效方法是什么?(类似于WhatsApp)

  17. 17

    在使用Mongoose查询Mongo数据库中的集合时,如何查找类似于查询项的值?

  18. 18

    数据库连接模式

  19. 19

    类似于字典的JSON模式

  20. 20

    hasManyThrough()或类似的数据库模型

  21. 21

    类似于Gson的Scala库

  22. 22

    数据库模式与数据库表空间?

  23. 23

    自动从数据库查找数据模式

  24. 24

    MongoDB数据库消失了

  25. 25

    MongoDB动态数据库

  26. 26

    数据库NoSQL(MongoDB)

  27. 27

    MongoDB数据库消失了

  28. 28

    部署 MongoDB 数据库

  29. 29

    MongoDB 数据库设计

热门标签

归档