Ein user
kann viele projects
haben (und ein Projekt ist nur einem Benutzer zugeordnet). Dies ist eine Eins-zu-Viele Beziehung.
Jeder user
sollte die Liste seiner/ihrer projects
speichern . Zum Beispiel:
user:
id: <some value>,
name: <some value>,
email: <some value>,
projects: [
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
...
]
Beachten Sie, dass jedes project
ist ein untergeordnetes Dokument (Objekt oder eingebettetes Dokument) innerhalb der projects
Reihe. Ein project
hat zugehörige Details wie projectId
, projectName
, usw..
Ich denke, es sollte nur eine Sammlung geben aufgerufen als user_projects
. Angenommen, dass:(i) ein user
kann 0 bis 100 Projekte haben und (ii) ein project
Die Details von sind nicht zu umfangreich.
Dies ist ein Modell zum Einbetten der „Viele“-Seite der 1-zu-N-Beziehung in die „Eins“-Seite. Dies ist ein empfohlener Weg, um die Daten zu denormalisieren. Dies hat den Vorteil effizienter und schneller Abfragen. Dies vereinfacht Transaktionen, da Schreibvorgänge (Einfügungen, Aktualisierungen und Löschungen) atomar mit einer einzigen Operation für ein Dokument innerhalb derselben Sammlung erfolgen.
Sie verwenden den user
id
oder name
(mit einem eindeutigen Index), um ein Dokument abzurufen, und es wird eine sehr schnelle Abfrage sein. Sie können einen Index für die projects
haben Array (Indizes auf Array-Feldern werden als Multikey-Indizes bezeichnet ) - auf den Feldern des Projekts. Indexieren Sie beispielsweise auf projectId
oder/und projectName
macht Sinn.
Sie können alle Projekte für einen Benutzer abrufen - es ist eine einfache Abfrage mit dem user
id
/ name
. Projektion abfragen ermöglicht, welche Informationen sich auf project
beziehen wird angezeigt. Sie können einen find
verwenden oder aggregate
-Methode zum Erstellen der Abfrage. Sie können ein bestimmtes project
abfragen für einen user
, unter Verwendung der projectId
oder projectName
. Da es Indizes auf user
gibt und project
Felder, ist dies eine effiziente Abfrage.
Meine Empfehlung ist also, eine einzige Sammlung zu haben, user_projects
, mit einem user
's Informationen und die projects
darin eingebettete Informationen.