MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Bearbeiten der N-N-Beziehung von Unterdokumenten in Mongodb

Basierend auf den von Ihnen bereitgestellten Informationen würde ich zwei mögliche Ansätze empfehlen, ausgehend von der gleichen Grundlage:

Ich würde diesen Ansatz empfehlen, wenn:

  • Sie haben eine hohe Kardinalität sowohl von Artikeldokumenten als auch von Plattformen
  • Sie möchten in der Lage sein, beide Entitäten unabhängig voneinander zu verwalten und gleichzeitig Verweise zwischen ihnen zu synchronisieren

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

Auch wenn dieser Ansatz recht flexibel ist, hat er seinen Preis – wenn Sie sowohl Artikel- als auch Plattformdaten benötigen, müssen Sie mehr Abfragen an Ihre MongoDB-Instanz senden, da die Daten in zwei verschiedene Sammlungen aufgeteilt sind.

Zum Beispiel beim Laden einer Artikelseite, wenn man bedenkt, dass man auch eine Liste von platforms anzeigen möchte , müssten Sie eine Abfrage an die articles collection senden , und lösen Sie dann auch eine Suche in der platforms collection aus um alle Plattformentitäten abzurufen, auf denen dieser Artikel über die Mitglieder der platform veröffentlicht wurde s-Array im article document .

Wenn Sie jedoch nur eine kleine Teilmenge häufig aufgerufener platform attributes haben die Sie beim Laden eines article document zur Verfügung haben müssen , könnten Sie die platforms erweitern Array in der articles collection um diese Attribute zusätzlich zur _id zu speichern Verweis auf die Plattformdokumente:

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

...

}

Dieser hybride Ansatz wäre geeignet, wenn die platform data attributes die Sie häufig abrufen, um sie zusammen mit artikelspezifischen Daten anzuzeigen, ändern sich nicht so oft.

Andernfalls müssen Sie alle Aktualisierungen synchronisieren, die an den platform document attributes vorgenommen werden in der platforms collection mit der Teilmenge von Attributen, die Sie als Teil des Plattformarrays für Artikeldokumente nachverfolgen.

Bezüglich der Verwaltung von Artikellisten für einzelne Plattformen würde ich nicht empfehlen, N-zu-N-Referenzen in beiden Sammlungen zu speichern, da Sie mit dem oben genannten Mechanismus bereits Artikellisten extrahieren können, indem Sie die articles collection abfragen Verwenden einer Suchabfrage mit der _id Wert des platform document :

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

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

Nachdem ich zwei verschiedene Ansätze vorgestellt habe, würde ich Ihnen jetzt empfehlen, die Abfragemuster und Leistungsschwellenwerte Ihrer Anwendung zu analysieren und eine kalkulierte Entscheidung basierend auf den auftretenden Szenarien zu treffen.