mongodb的C#类设计问题

时间:2011-09-20 08:19:28

标签: mongodb class-design mongodb-.net-driver

我在mongodb的C#类设计中遇到了一个问题,假设有两个类:

public class Group
{
    public Group()
    {
        Users = new List<User>();
    }
    public ObjectId Id { get; set; }
    public List<User> Users { get; set; }
}

public class User
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

并且在mongodb中有两个与它们对应的单独集合,模式是这样的:

Group:
{
    "_id" : ObjectId("4e7839d90a2248d934c182bd"),
    "Name" : "Group1",
    "Users" : [ 
        {"_id": ObjectId("4e7839d90a2248d934c154af"), "Name": "User1"}
      ]
}
User:
{
    "_id" : ObjectId("4e7839d90a2248d934c154af"),
    "Name" : "User1",
"Email": "some@some.com"
}

根据Mongodb的一些设计原则,每当我想在一个组中显示每个用户的名字时,我就会在组集合中嵌入一些用户的字段,因此只需要一个查询,但是当插入一个Group对象时,所有将插入每个User对象中的字段,例如上面:也将插入电子邮件,这会破坏初始架构并占用更多空间。那么如何在插入Group对象时剪切用户的电子邮件,你们有什么好主意吗?

1 个答案:

答案 0 :(得分:1)

这是因为在对数据进行非规范化时,您需要为每个已经被标准化的对象创建单独的类。对于User中的Group,您需要创建与此类似的单独的类:

public class GroupUser
{
   public ObjectId Id {get;set;}

   public string Name {get;set;}
}

然后你的Group课程将如下所示:

public class Group
{
  public Group()
  {
    Users = new List<GroupUser>();
  }
  public ObjectId Id { get; set; }
  public List<GroupUser> Users { get; set; }
}

当您插入新的Group时,您需要将数据从常规用户映射到非规范化GroupUser。因此,非规范化通常会导致大量的映射和额外的类。但它允许我们在数据库加载数据时实现高性能。