2011-09-20 2 views
1

У меня проблема в C дизайн # класса для MongoDB, предположим, что существует два класса:C дизайн # класс вопрос для MongoDB

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": "[email protected]" 
} 

в соответствии с некоторыми принципами дизайна MongoDB, каждый раз, когда я хочу, чтобы отобразить имя каждого пользователя в группе, так что я встраивать поля некоторых пользователей в коллекции группы, таким образом, только одиночный один запрос необходим, но при вставке Объект Group, все поля в каждом объекте пользователя будут вставлены ed, например, выше: электронное письмо также будет вставлено, что уничтожит исходную схему и займет больше места. так как я могу вырезать адрес электронной почты пользователя при вставке объекта Group, у вас, ребята, есть хорошая идея?

ответ

1

Это потому, что при денормализации данных вам нужно создать отдельный класс для каждого denormilized объекта. В вашем случае для 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 необходимо сопоставить данные от обычного пользователя до denormalized GroupUser. Таким образом, денормализация обычно приводит к большому количеству картографирования и дополнительных классов. Но это позволяет нам достичь высокой производительности при загрузке данных из базы данных.

+0

Спасибо, Андрей, ваш ответ отличный –

+0

@lotus_misser: добро пожаловать. –