Основываясь на информации, которую вы предоставили, я бы рекомендовал два возможных подхода, начиная с того же основания:
Использование двух сборниках (статьи и платформ) и хранить только ссылку на платформе документов в массиве определяется по статье документы
Я рекомендовал бы этот подход, если:
- Вы ВГ еа высокая мощность обоих документов статьи, а также платформ
Вы хотите, чтобы иметь возможность управлять как субъекты независимо друг от друга, в то время как также синхронизируется ссылки между ними
// articles collection schema
{
"_id": ...,
"title": "I am an article",
...
"platforms": [ "platform_1", "platform_2", "platform_3" ],
...
}
// platforms collection schema
{
"_id": "platform_1",
"name": "Platform 1",
"url": "http://right/here",
...
},
{
"_id": "platform_2",
"name": "Platform 2",
"url": "http://right/here",
...
},
{
"_id": "platform_3",
"name": "Platform 3",
"url": "http://right/here",
...
}
Даже если этот подход является довольно гибкая, она стоит дорого - если вам требуются данные как для статьи, так и для платформы, вам придется запускать больше запросов на экземпляр MongoDB, поскольку данные разделяются на две разные коллекции.
Например, при загрузке страницы статьи, принимая во внимание, что вы также хотите, чтобы отобразить список platforms
, вам придется стрелять запрос к articles collection
, а затем также вызвать поиск по platforms collection
, чтобы восстановить всю платформу сущности, которым эта статья опубликована через элементы массива platform
s на article document
.
Однако, если у вас есть только небольшое подмножество из часто используемых platform attributes
, что вам нужно иметь в наличии при загрузке article document
, вы можете улучшить platforms
массив на articles collection
хранить эти атрибуты в дополнении к _id
ссылки на платформу документы:
// enhanced articles collection schema
{
"_id": ...,
"title": "I am an article",
...
"platforms": [
{platform_id: "platform_1", name: "Platform 1"},
{platform_id: "platform_2", name: "Platform 2"},
{platform_id: "platform_3", name: "Platform 3"}
],
...
}
Этот гибридный подход был бы подходящим, если platform data attributes
, что вы часто извлекать для отображения вместе со статьей конкретные данные не изменяются тыс часто.
В противном случае вам нужно будет синхронизировать все обновления, которые были сделаны с platform document attributes
, в platforms collection
с подмножеством атрибутов, которые вы отслеживаете как часть массива плат для документов статей.
Что касается управления списками статей для отдельных платформ, я бы не рекомендовал хранить ссылки N-to-N в обеих коллекциях, поскольку вышеупомянутый механизм уже позволяет вам извлекать списки статей, запрашивая articles collection
, используя запрос поиска с значение _id
из platform document
:
Approach #1
db.articles.find({"platforms": "platform_1"});
Approach #2:
db.articles.find({"platforms.platform_id": "platform_1"});
Представив два различных подхода, что я рекомендовал бы сейчас для вас, чтобы проанализировать образцы запросов и производительности пороги вашего приложения и сделать вычисляемое решение на основе сценариев, которые вы встреча.
@chridam видя, как предыдущее решение пришло от вас, есть ли у вас какие-либо идеи о том, как реализовать этот –