【问题标题】:MongoDB : Snapchat like notification schema for the databaseMongoDB:数据库的类似 Snapchat 的通知模式
【发布时间】: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 来自集合 MessagesReceiver_ID 字段已编入索引。

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

之后,我删除集合 Notifications 上的文档(如果他还没有打开消息,我将 Message_ID 存储在设备本地) .

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

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?

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?

【问题讨论】:

    标签: mongodb notifications


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答!我没有考虑多设备案例,所以我会弄清楚并编辑我的主要帖子。我会稍等一下,看看是否有其他人要添加,然后我会将您的答案标记为已接受。祝你有美好的一天
    • 我忘了问的最后一件事是,Receiver_ID 已编入索引,它们用于检索 Message_ID,但一旦我获得此 Message_ID,我仍然需要查询 Messages 集合,我是否也应该索引此字段?因为 Messages 集合将存储曾经发送的每条消息。谢谢
    • 将此直接添加到问题中:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多