具有多个嵌入文档的文档设计

时间:2013-12-11 14:17:46

标签: mongodb database nosql

我有关于MongoDB的架构问题。我有一个包含6个不同相关实体的User表。

public class Profile
{
    public List<Entity1> {get;set;}
    public List<Entity2> {get;set;}
    public List<Entity3> {get;set;}
    public List<Entity4> {get;set;}
    public List<Entity5> {get;set;}
    public List<Entity6> {get;set;}
}

当我显示个人资料页面时,我必须显示与个人资料相关的所有数据。阅读MongoDB教程后,我的初步设计是将所有六个文档嵌入到Profile文档中。但我担心,它可能超过文件大小。所以目前我有6个单独的集合,每个集合实体都有一个ProfileId(索引)。在Profile视图中,我基于ProfileId进行了6次不同的数据库调用,并显示了所有结果。

public class Entity1
{
  public int ProfileId {get;set;}
  ......
  ........
}

这可以接受吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

mongo 2.4开始,最大文档大小为16MB,如果没有任何BLOB或其他东西,则相当多。因此,如果您总是想要检索整个配置文件,那么嵌入所有列表绝对是您的首选。

在不知道您的用例的情况下,我通常会遇到由于查询过多而构建在mongo之上的应用程序变慢,特别是如果您正在使用远程数据库。请记住,mongo不支持连接,因此访问7个集合实际上意味着7次往返!

因此,我将从嵌入式解决方案开始,并不时测量一些文档大小以检查大小。如果16MB真的不够,你可能会有一个单一的实体列表变得太大 - 在这种情况下,我只会将这个单一列表提取到它自己的集合中。

如果您希望获得最大的灵活性,例如在评估文档大小时能够轻松切换,您可以另外将数据存储到其他6个实体集合,就像您现在所做的那样,但却从未阅读过它们。如果以后必须切换,只需更改相应的查询并从Profile集合中删除嵌入的字段。