2017-02-09 3 views
6

У меня есть приложение, в котором статья может быть связана с несколькими платками .редактирование поддоменов N-N отношения в mongodb

Статья содержит список платформ и платформ, также содержащий список статей.

Для получения более подробной информации, пожалуйста, ознакомьтесь с этим вопросом stackoverflow, который я задал несколько месяцев назад.

https://stackoverflow.com/a/40377383/5770147

Вопрос был о том, как создать статью и реализовать отношения N-N между статьей и платформой.

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

Как реализовать редактирование статьи, чтобы я мог обновлять, какие платформы связаны со статьей?

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

+0

@chridam видя, как предыдущее решение пришло от вас, есть ли у вас какие-либо идеи о том, как реализовать этот –

ответ

5

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

Использование двух сборниках (статьи и платформ) и хранить только ссылку на платформе документов в массиве определяется по статье документы

Я рекомендовал бы этот подход, если:

  • Вы ВГ еа высокая мощность обоих документов статьи, а также платформ
  • Вы хотите, чтобы иметь возможность управлять как субъекты независимо друг от друга, в то время как также синхронизируется ссылки между ними

    // 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"}); 

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

+0

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

+0

- даже если вам нужно было хранить список ссылок на статьи для каждой платформы, вам все равно придется выполнять запрос в коллекции статей для извлечения деталей для этих статей, используя ссылки из документов платформы в качестве предиката поиска –

+0

Большое спасибо, я попробую это прямо сейчас. –

Смежные вопросы