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.