我对MongoDB数据库设计有疑问 据我所知(我不确定我是否正确),没有必要使用集合之间的关系。例如,我为用户收集了他们的电子邮件集合,并且我希望将电子邮件模板发送给用户 我应该使用我的旧模式避免冗余并设计3个这样的集合:
Users: ID,Name,Email
Templates: ID,Contents
EmailSent: UserID,TemplateID
或者应该像这样使用Nosql范例:
Users: ID,Name,Email
Templates: ID,Contents
EmailSent: UserID,Contents
差异仅在电子邮件发送集合中。我正在寻找一个明确的答案,根据MongoDB设计架构,而不是个人意见
答案 0 :(得分:1)
在这种特殊情况下,我不会从已发送的电子邮件中引用已使用的模板,因为已发送的电子邮件已发送且无法再更改。在发送电子邮件后更改模板时,接收器收件箱中已有的电子邮件不会更改。但是,当您查看应用程序中的电子邮件时,即使不是生成电子邮件时处于活动状态的模板,也会显示新模板。这将为您的用户提供误导性信息。
在更一般的情况下,问题嵌入与引用没有相关的解决方案。虽然由于缺少数据库上的JOIN,MongoDB通常更喜欢嵌入而不是引用,但是当许多文档嵌入相同数据的副本并且数据发生变化时,嵌入会导致问题。在这种情况下,您必须按原样保留数据(在某些情况下可能有意义,例如此处)或更新嵌入数据时更新所有文档。这将是一项昂贵的操作。
您不会通过引用而不是嵌入来进行昂贵的批量更新操作。但是,它会使完整文档的检索更加昂贵,因为您必须执行多个后续查询。
您选择哪个选项取决于您预期的常规用例:
如果您希望使用子文档进行频繁操作并更新子文档是一种罕见的操作,则可以选择嵌入。
当子文档变化频繁且请求很少时,引用将是更明智的策略。