MongoDB数据库设计,冗余重要吗?

MongoDB数据库设计,冗余重要吗?,mongodb,database-design,Mongodb,Database Design,我有一个关于MongoDB数据库设计的问题。 据我所知(我不确定我是否正确),没有必要使用集合之间的关系。例如,我为用户收集了他们的电子邮件,并且我想将这些电子邮件模板发送给用户。 我是否应该使用我的旧范式来避免冗余,并像这样设计3个集合: Users: ID,Name,Email Templates: ID,Contents EmailSent: UserID,TemplateID 或者应该像这样使用Nosql范式: Users: ID,Name,Email Templates: ID,

我有一个关于MongoDB数据库设计的问题。
据我所知(我不确定我是否正确),没有必要使用集合之间的关系。例如,我为用户收集了他们的电子邮件,并且我想将这些电子邮件模板发送给用户。
我是否应该使用我的旧范式来避免冗余,并像这样设计3个集合:

Users:  ID,Name,Email
Templates: ID,Contents
EmailSent: UserID,TemplateID
或者应该像这样使用Nosql范式:

Users:  ID,Name,Email
Templates: ID,Contents
EmailSent: UserID,Contents

区别仅在于发送的电子邮件收集。根据MongoDB设计架构,我正在寻找一个明确的答案,而不是个人意见。在这种特殊情况下,我不会引用发送的电子邮件中使用的模板,因为发送的电子邮件已发送,无法再更改。发送电子邮件后更改模板时,收件人收件箱中已存在的电子邮件不会更改。但是,当您在应用程序中查看电子邮件时,它将与新模板一起出现,即使该模板不是生成电子邮件时处于活动状态的模板。这会给你的用户提供误导性的信息

在更一般的情况下,对于嵌入与引用的问题,没有现成的解决方案。虽然MongoDB通常更喜欢嵌入而不是引用,因为缺少数据库上的连接,但当许多文档嵌入相同数据的副本并且数据发生更改时,嵌入会导致问题。在这种情况下,您要么必须保持数据的原样(在某些情况下这是有意义的,比如这里),要么在更新嵌入数据时更新所有文档。这将是一个昂贵的手术

您将不会使用引用而不是嵌入来进行代价高昂的大规模更新操作。然而,这会使检索完整文档的成本更高,因为您必须执行多个后续查询

您选择的选项取决于您预期的常规用例:

  • 当您希望对子文档进行请求是一项频繁的操作,而更新子文档是一项罕见的操作时,您可以选择嵌入

  • 当子文档更改非常频繁且请求很少时,引用将是更明智的策略


NoSQL是一种非常广泛的数据库类型。因此,对于MongoDB可能有一个具体的答案(也许您应该用MongoDB标记您的问题),但对于NoSQL通常没有。MongoDB的最佳选择可能对Cassandra、Neo4J、CouchBase等不太适用。我同意DNA。我冒昧地将问题中的“NoSQL”替换为“MongoDB”,因为这将为您提供更多有用的答案。我还将“Table”替换为“Collection”,因为这是MongoDB中正确的术语。