我在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对象时剪切用户的电子邮件,你们有什么好主意吗?
答案 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
。因此,非规范化通常会导致大量的映射和额外的类。但它允许我们在数据库加载数据时实现高性能。