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

MongoDB – sollte mein Benutzerdokument eine Liste mit Projekt-IDs enthalten?

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.