MongoDB (Mongoid) отношение «многие ко многим» с дополнительными данными (дополнительные поля) - PullRequest
4 голосов
/ 26 июля 2011

Допустим, мои модели - Пользователь и Проект.Каждому пользователю может быть назначено много проектов, и каждому проекту может быть назначено много пользователей.Это типичное отношение «многие ко многим» и может быть сохранено как ( source ):

# The user document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
  "project_ids" : [ ObjectId("4d3ed089fb60ab534684b7f2") ]
}

# The project document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7f2"),
  "user_ids" : [ ObjectId("4d3ed089fb60ab534684b7e9") ]
}

Проблема в том, что я хотел бы назначить больше данных, описывающих это отношение, например, рольчто пользователь имеет в проекте (администратор, менеджер и т. д.).В РСУБД я бы просто добавил дополнительный столбец в таблицу соединений.В MongoDB я действительно не знаю, как это сделать.

Должен ли я создать дополнительный встроенный документ в пользовательском или проектном?Я думал о чем-то вроде этого:

# The project document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7f2"),
  "assigned_users" : [
    { user_id: ObjectId("4d3ed089fb60ab534684b7e9"), role: "admin" },
    ...
  ]
}

Но я думаю, что запрос для получения всех пользовательских проектов станет довольно сложным, верно?

Я использую Mongoid, но был бы благодарендля любого общего решения (а затем я выясню, как сопоставить это с Mongoid;) Кроме того, я не могу изменить базу данных на RDBMS.

1 Ответ

3 голосов
/ 26 июля 2011

Как насчет хранения всего, что вы знаете о User в коллекции Users?

{
  "_id": ObjectID("..."),
  "projects": [
    { "role": "admin", "project_id": ObjectId("...") },
    { "role": "manager", "project_id": ObjectId("...") }
  ]
}

Запросы будут выполняться для коллекции Users.

// find all admins on a project, for example
db.Users.find( { "projects" : 
                  { "role" : "admin", "project_id": ObjectId("...") } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...