Проблема дизайна класса C # для mongodb - PullRequest
1 голос
/ 20 сентября 2011

У меня проблема с дизайном класса 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": "some@some.com"
}

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

1 Ответ

1 голос
/ 20 сентября 2011

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

...