【问题标题】:Modeling data in MongoDB for a chat application在 MongoDB 中为聊天应用程序建模数据
【发布时间】:2017-08-16 18:42:10
【问题描述】:

我想使用 MongoDB 将聊天消息存储为聊天应用程序的一部分。该数据库将用于向加入频道的用户显示聊天记录。

我正在尝试确定在数据库中对这些数据建模的最佳方式。该应用程序是一个简单的聊天应用程序,其中包含许多用户可以聊天的频道。以下是我考虑过的几个选项:

  • Messages 集合,其中包含每条消息的文档。这很容易实现,但是对于任何重要的使用,都会创建许多文档。
  • Channels 集合,其中包含每个频道的文档。这将导致更少的文档。消息将作为数组存储在频道文档中。

哪些选项是首选,为什么?这里没有列出更好的选择吗?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    有很多很多方法可以对这样的东西进行建模。没有通用的“最佳方法”,因为它实际上取决于您计划如何使用数据、应用程序将如何运行等。但是,您的方法需要考虑一些事项。

    首先,拥有大量文档不是问题。这就是 Mongo 所做的——它非常适合存储大量文档。我是模块化的坚定拥护者,因为它使事情变得更加灵活。我通过尽可能分离数据,然后根据需要使用引用来填充数据库,从而在我的数据库中体现这种心态。

    这意味着你必须做更多的人口,但最终它可以防止你陷入困境,让自己不得不以某种方式做事。

    因此,特别是对于您的示例,一个好方法是结合您上面提到的内容:拥有一个 Messages 集合,它为每条消息创建一个文档。然后有一个 Channels 集合,它存储一组消息 ID(不是消息本身)。

    为什么这很有用?我假设您将要加载一个频道,但不是其中的所有 2,000 条消息。您可能想加载前 50 个,然后通过无限滚动或其他方式加载更多。

    这允许您获取 Channel 文档,然后填充前 50 条消息。然后,如果需要,您可以一次递增地获取 50 多条消息。

    如果您将所有消息存储在该数组中,您的 Channel 文档将会变得非常非常大。

    这也允许用户在不以任何方式编辑频道文档的情况下编辑他们的消息 - 这非常重要!

    拥有单独的消息模式还允许您执行诸如从单个用户获取所有消息之类的操作。您可能希望在消息中引用用户 ID。

    在对这样的数据进行建模时需要考虑很多事情,但要考虑的重要事项是“我需要如何获取这些数据?”和“我需要如何修改这些数据?”然后弄清楚您当前的格式是否使其中一件事情变得困难。

    【讨论】:

    • 很好的答案,谢谢。我担心的一个问题是 MongoDB 是否会在单个集合中存储大量文档时遇到问题,但正如您所建议的那样,这似乎不是问题。
    • 不,很多文件都不是问题。拥有大量文档比拥有一些非常大的文档要好得多。大型文档意味着您必须获取整个内容,这意味着您的 HTTP 响应中的有效负载很大(这显然意味着加载时间很长)。许多小文档是要走的路!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2016-12-20
    • 2016-06-28
    • 1970-01-01
    • 2019-02-23
    • 2019-05-29
    相关资源
    最近更新 更多