在MongoDB中为聊天应用程序建模数据

时间:2017-03-24 00:01:59

标签: mongodb

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

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

  • 包含每封邮件的文档的Messages集合。这很容易实现,但是如果有任何重要的用法,将会创建许多文档。
  • 包含每个频道的文档的Channels集合。这将导致更少的文档。消息将作为数组存储在频道文档中。

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

1 个答案:

答案 0 :(得分:3)

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

首先,拥有大量文件不是问题。这就是Mongo所做的 - 它在存储大量文件方面非常出色。我是模块化的坚定拥护者,因为它使事情变得更加灵活。我通过尽可能地分离数据,然后根据需要使用引用来反映我的数据库中的心态。

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

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

为什么这有用?我假设您要加载频道,但不是所有2,000条信息都在其中。您可能想要加载前50个,然后通过无限滚动或其他东西加载更多。

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

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

这也允许用户编辑他们的消息而无需以任何方式编辑频道文档 - 这非常重要!

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

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

相关问题