Отношения в MongoDB - PullRequest
       1

Отношения в MongoDB

0 голосов
/ 14 марта 2012

В новом проекте я решил использовать mongodb для основной базы данных, но мой неопытность с ним привела к некоторой путанице в том, как мне следует структурировать отношения между различными коллекциями.

В моем случаеУ меня есть коллекция пользователей, коллекция заметок и коллекция групп.Заметки могут быть открыты для разных пользователей и групп.Если пользователь является частью группы и эта группа имеет доступ для чтения к заметке, то и пользователь тоже.Если пользователь удален из группы, он больше не имеет доступа к заметке.Тем не менее, пользователь может иметь доступ к заметке на индивидуальной основе, и даже если они удалены из группы с доступом, они все равно могут видеть заметку.Надеюсь, это имеет смысл.

Проблема, с которой я сталкиваюсь, заключается в настройке разрешений, чтобы все это было возможно.Должны ли разрешения храниться в коллекции заметок?Если он хранится следующим образом:

note: {id: xxxx, followers:[{id:user1, permission:write},{id:groupA, permission:read}]}

Тогда в случае, когда user2 является частью группы A, мне нужно проверить, связаны ли они с узлом по их идентификатору, а если нет, то яМне нужно будет проверить каждую группу, которая может видеть эту заметку, и посмотреть на их участников, и если разные группы имеют разные разрешения, я должен получить самое высокое разрешение.Это не кажется эффективным.

Коллекция пользователей выглядит следующим образом:

user: {id:user1, projects:[xxxxx, xxxxx], groups:[xxxxx,xxxx...]}

Коллекция групп:

group: {id:groupA, projects:[xxxxx, xxxx...], users:[user2...]}

Я планировал связать документы группыс документами проекта и пользователя, так что если группа будет удалена из проекта, проект будет удален из группы.Похоже, что dbref - лучший способ сделать это.

Я просмотрел лучшие практики и чувствую, что общая структура у меня грязная, но я не могу придумать другой способ сделать это.

1 Ответ

1 голос
/ 23 марта 2012

Учитывая ваши требования, если в группах больше пользователей, чем в группах пользователей, вам следует рассмотреть возможность хранения group_ids внутри пользователя.

Вы можете объединить пользователей и группы в одну коллекцию, которая имеет две разные схемы и что-то вродеАтрибут is_group, но, возможно, однажды может произойти блокировка уровня коллекции, а приведенные ниже предоставят вам большую гибкость.

Чтобы выяснить, есть ли у пользователя доступ, вам нужно только запросить коллекцию проекта и посмотреть, есть ли идентификаторы группы.они являются членами массивов записи или чтения после получения документа проекта.

Проект:

{
  "_id": ObjectId,
  "write": [group_id, group_id, ...],
  "read": [group_id, group_id, ...]
}

Пользователь:

{
  "_id": ObjectId,
  "groups": []
}

Группа:

{
  "_id": ObjectId,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...