Каждый проект связан точно с одним пользователем.
A user
может иметь несколько projects
(и проект связан только с одним пользователем). Это соотношение один-ко-многим .
Мой вопрос: должен ли каждый пользователь иметь список идентификаторов проектов?
Каждый user
должен хранить список своих projects
. Например:
user:
id: <some value>,
name: <some value>,
email: <some value>,
projects: [
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
...
]
Обратите внимание, что каждый project
- это вложенный документ (объект или встроенный документ) в массиве projects
. A project
имеет связанные детали, такие как projectId
, projectName
, et c ..
Если я хочу получить все проекты конкретного пользователя c, какой вариант более эффективен и оптимален:
a. Создайте индекс для коллекции проектов по свойству идентификатора пользователя. чем просто запросить свойство идентификатора пользователя.
б. Создайте индекс коллекции проектов по свойству id проекта. чем, если пользователь хранит свои идентификаторы проекта, просто запросите коллекцию проектов для этих c идентификаторов.
Я думаю, должна быть только одна коллекция , называемая user_projects
. Предполагая, что: (i) a user
может иметь от 0 до 100 проектов и (ii) детали a project
не слишком велики.
Это модель встраивания стороны «многие» отношения «1 к N» в «одну» сторону. Это рекомендуемый способ денормализации данных. Это дает преимущество в виде эффективных и быстрых запросов. Это упрощает транзакции, поскольку записи (вставки, обновления и удаления) будут выполняться atomi c с одной операцией с документом в той же коллекции.
О получении всех проектов для определенного c пользователя:
Вы будете использовать user
id
или name
(с уникальным индексом) для получения документа, и он будет быть очень быстрым запросом. Вы можете иметь индекс в массиве projects
(индексы в полях массива называются Multikey Indexes ) - в полях проекта. Например, имеет смысл индексировать projectId
или / и projectName
.
Вы можете получить все проекты для пользователя - это простой запрос, используя user
id
/ name
. Запрос projection позволяет отображать информацию, относящуюся к project
. Вы можете использовать метод find
или aggregate
для построения запроса. Вы можете запросить конкретный c project
для user
, используя projectId
или projectName
. Поскольку есть индексы для полей user
и project
, это будет эффективный запрос.
Итак, я рекомендую иметь единственную коллекцию user_projects
с информацией user
и встроенная в него информация projects
.