Как работать с отношениями "многие-ко-многим" в монго - PullRequest
1 голос
/ 19 июня 2020

Как лучше всего структурировать модели «многие ко многим» в схеме mon goose?

У меня есть две модели, которые связаны между собой отношениями «многие ко многим». Пользователи могут принадлежать ко многим организациям, и у организаций может быть много пользователей.

Параметры:

  1. Определите взаимосвязь в каждой модели , сославшись на другую модель
  2. Определите взаимосвязь в одна модель, ссылаясь на другую модель

Вариант 1

const UserSchema = new Schema({
  organiations: { type: Schema.Types.ObjectId, ref: "Organiation" }, // references organisation
})

mongoose.model("User", UserSchema)

const OrganiationSchema = new Schema({
  users: { type: Schema.Types.ObjectId, ref: "User" }, // references users
})

mongoose.model("Organiation", OrganiationSchema)

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

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

Это приводит меня к варианту 2, который должен иметь один источник истины, определяя отношения только в одной модели.

вариант 2:

const UserSchema = new Schema({
  organiations: { type: Schema.Types.ObjectId, ref: "Organiation" }, // references organistion
})

mongoose.model("User", UserSchema)

const OrganiationSchema = new Schema({}) // no referencces

mongoose.model("Organiation", OrganiationSchema)

Это означает, что когда Я создаю новую организацию, мне нужно только обновить пользователя с организациями, к которым он принадлежит. Риск рассинхронизации двух источников отсутствует c. Однако это означает, что когда дело доходит до запроса данных, это делает его более сложным. Если я хочу получить всех пользователей, принадлежащих к организации, я должен запросить пользовательский документ. Это означало бы, что мой организационный контроллер должен знать как пользовательские, так и организационные модели, и когда я начинаю добавлять больше взаимосвязей и моделей, я получаю тесную связь между всеми этими модулями, чего я хочу избежать.

Как вы порекомендуете обрабатывать отношения «многие ко многим» в схеме mon goose?

1 Ответ

1 голос
/ 20 июня 2020

Здесь нет фиксированного решения.

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

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

Сказав, что вы все еще можете go для варианта 1, даже если ваша организационная коллекция может иметь «огромные» массивы. Особенно, если вы хотите произвести простые вычисления, такие как количество пользователей организаций, или использовать «текущие идентификаторы пользователей организации для какой-либо другой коллекции». В этом случае вариант 1 будет лучше.

Но если вы выберете вариант 1 и если ваш массив может стать очень большим, рассмотрите шаблон проектирования корзины. В основном вы ограничиваете максимальную длину вложенного массива. Если массив достигает своей максимальной длины, вы создаете другой документ, содержащий недавно добавленные идентификаторы (или вложенные документы). Думайте об этом как о разбивке на страницы.

...