MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

modifica dei sottodocumenti Relazione N-N in mongodb

Sulla base delle informazioni che hai fornito, consiglierei due possibili approcci, partendo dalla stessa base:

Consiglierei questo approccio se:

  • Hai un'elevata cardinalità di entrambi i documenti degli articoli, nonché delle piattaforme
  • Vuoi essere in grado di gestire entrambe le entità in modo indipendente, sincronizzando anche i riferimenti tra di loro

    // 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",
    ...
    }
    

Anche se questo approccio è abbastanza flessibile, ha un costo:se hai bisogno sia dei dati dell'articolo che della piattaforma, dovrai eseguire più query sulla tua istanza MongoDB, poiché i dati sono divisi in due raccolte diverse.

Ad esempio, quando si carica la pagina di un articolo, considerando che si desidera visualizzare anche un elenco di platforms , dovresti inviare una query alla articles collection , quindi attiva anche una ricerca nella platforms collection per recuperare tutte le entità della piattaforma in cui è pubblicato quell'articolo tramite i membri della platform s array nel article document .

Tuttavia, se hai solo un piccolo sottoinsieme di platform attributes a cui si accede frequentemente che devi avere a disposizione quando carichi un article document , potresti migliorare le platforms array nella articles collection per memorizzare quegli attributi oltre a _id riferimento ai documenti della piattaforma:

// 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"}
],

...

}

Questo approccio ibrido sarebbe adatto se gli platform data attributes che recuperi di frequente per visualizzare insieme ai dati specifici dell'articolo non cambiano così spesso.

In caso contrario, dovrai sincronizzare tutti gli aggiornamenti apportati agli platform document attributes nella platforms collection con il sottoinsieme di attributi che tieni traccia come parte dell'array piattaforme per i documenti degli articoli.

Per quanto riguarda la gestione delle liste di articoli per le singole piattaforme, sconsiglio di memorizzare i riferimenti N-to-N in entrambe le raccolte, in quanto il suddetto meccanismo consente già di estrarre le liste di articoli interrogando la articles collection utilizzando una query di ricerca con _id valore del platform document :

Approach #1
db.articles.find({"platforms": "platform_1"});

Approach #2:
db.articles.find({"platforms.platform_id": "platform_1"});

Avendo presentato due diversi approcci, ciò che consiglierei ora è di analizzare i modelli di query e le soglie di prestazioni della tua applicazione e prendere una decisione calcolata in base agli scenari che incontri.