MongoDB - должен ли мой пользовательский документ содержать список идентификаторов проектов? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть коллекции users и projects. Каждый проект связан ровно с одним пользователем.

Мой вопрос: должен ли каждый пользователь иметь список идентификаторов проектов?

Если я хочу получить все проекты определенного c пользователя , какой вариант более эффективен и оптимален:

  1. Создайте индекс коллекции проектов в свойстве id пользователя. чем просто запрос на свойство идентификатора пользователя.
  2. Создайте индекс для коллекции проектов по свойству идентификатора проекта. чем, если пользователь хранит идентификаторы своих проектов, просто запросите коллекцию проектов для этих c идентификаторов.

Какой вариант выбрать? Может есть третий вариант лучше? Преимущество первого варианта в том, что мне не нужно обновлять список проектов в пользовательском документе при удалении / добавлении проектов.

Спасибо!

1 Ответ

0 голосов
/ 06 мая 2020

Каждый проект связан точно с одним пользователем.

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.

...