【问题标题】:How would you model an Email app in MongoDB?您将如何在 MongoDB 中为电子邮件应用程序建模?
【发布时间】:2011-07-30 08:54:38
【问题描述】:

您将如何在 MongoDB 中为电子邮件应用程序(如 gmail)建模?你会为Conversation 建模吗? Inbox / OutBox?还是mail

谢谢

【问题讨论】:

标签: mongodb data-modeling nosql


【解决方案1】:

Gmail 使用标签的概念(如 stackoverflow 上的标签)。这意味着收件箱、发送邮件、加星标等正常的电子邮件对象,只是用指定的标签标记。所以,只有EmailLabels

您可以使用 gmail 中的搜索来查看它,例如 label:inboxlabel:Starred

我想推荐一个相当简单的设计:

Email
    {
      _id
      Title,
      Body,
      Status {read, unread},
      Labels { name, type(system, custom) },
      Replies {...},
      ..
    }

Labels
    {
      _id,
      name,
      settings {
              ShowInLabelsList (show, hide, showIfUnread),
              ShowInMessageList (show, hide),
              ..
               }
     }

当然我错过了一些东西,但我想可以从上面的架构开始,如果需要的话,可以在将来添加更多功能。

更新:

对于“对话视图”,我猜所有回复都显示到嵌套集合Replies(我已经更新了我的架构)。逻辑如下:

收到新邮件后,您需要检查是否已经存在同名的电子邮件(当然需要删除“重新”等),还需要检查收件人列表中已发送电子邮件的用户。如果上述条件为真,则只需将新电子邮件添加到 Replies 的嵌套集合中,否则添加到电子邮件集合中。

【讨论】:

  • @Bugai13:不,Henry 谈到了“电子邮件线程”,即按主题对邮件进行分组(这可能比“按主题分组”要复杂一些)。
  • 谢谢,你会在回复里放什么?实际邮件或...实际邮件的_id?
  • @Henry:这是 mongodb,嵌入,嵌入......所以,我会将实际邮件放入 Replies 集合中。回复它与父电子邮件相同的文档集合(mb 除了Replies)。
  • @Bugai 哦,那你真的是在为对话建模。怎么样......将所有对话嵌入到邮箱中?是不是太疯狂了?
  • @Henry 我也很难知道要嵌入什么。看来我们正在使用的限制是文档大小。它有一个 16mb 的硬限制,但我猜如果你加载整个东西,一个 15mb 的邮箱会很慢。我见过人们推荐每次对话收集。我正在考虑如上所述进行对话集合,但是您必须将每个对话限制为 16mb(应该是合理的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多