MongoDB数据库设计,冗余重要吗?
我有一个关于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,
据我所知(我不确定我是否正确),没有必要使用集合之间的关系。例如,我为用户收集了他们的电子邮件,并且我想将这些电子邮件模板发送给用户。
我是否应该使用我的旧范式来避免冗余,并像这样设计3个集合:
Users: ID,Name,Email
Templates: ID,Contents
EmailSent: UserID,TemplateID
或者应该像这样使用Nosql范式:
Users: ID,Name,Email
Templates: ID,Contents
EmailSent: UserID,Contents
区别仅在于发送的电子邮件收集。根据MongoDB设计架构,我正在寻找一个明确的答案,而不是个人意见。在这种特殊情况下,我不会引用发送的电子邮件中使用的模板,因为发送的电子邮件已发送,无法再更改。发送电子邮件后更改模板时,收件人收件箱中已存在的电子邮件不会更改。但是,当您在应用程序中查看电子邮件时,它将与新模板一起出现,即使该模板不是生成电子邮件时处于活动状态的模板。这会给你的用户提供误导性的信息 在更一般的情况下,对于嵌入与引用的问题,没有现成的解决方案。虽然MongoDB通常更喜欢嵌入而不是引用,因为缺少数据库上的连接,但当许多文档嵌入相同数据的副本并且数据发生更改时,嵌入会导致问题。在这种情况下,您要么必须保持数据的原样(在某些情况下这是有意义的,比如这里),要么在更新嵌入数据时更新所有文档。这将是一个昂贵的手术 您将不会使用引用而不是嵌入来进行代价高昂的大规模更新操作。然而,这会使检索完整文档的成本更高,因为您必须执行多个后续查询 您选择的选项取决于您预期的常规用例:
- 当您希望对子文档进行请求是一项频繁的操作,而更新子文档是一项罕见的操作时,您可以选择嵌入
- 当子文档更改非常频繁且请求很少时,引用将是更明智的策略