MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB - mon document utilisateur doit-il contenir une liste d'identifiants de projet ?

Un user peut avoir plusieurs projects (et un projet est associé à un seul utilisateur). Il s'agit d'un un-à-plusieurs relation.


Chaque user doit stocker la liste de ses projects . Par exemple :

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. } },
         ...
    ]

Notez que chaque project est un sous-document (objet ou document intégré) dans les projects déployer. Un project a ses détails associés comme, projectId , projectName , etc..


Je pense qu'il ne devrait y avoir qu'une seule collection appelé en tant que user_projects . En supposant que :(i) un user peut avoir de 0 à 100 projets, et (ii) un project Les détails de ne sont pas trop énormes.

Il s'agit d'un modèle d'intégration du côté "plusieurs" de la relation 1 à N dans le côté "un". C'est une méthode recommandée, dénormalisant les données. Cela a l'avantage d'effectuer des requêtes efficaces et rapides. Cela simplifie les transactions, car les écritures (insertions, mises à jour et suppressions) vont être atomiques avec une seule opération sur un document au sein de la même collection.


Vous utiliserez le user id ou name (avec un index unique) pour récupérer un document, et ce sera une requête très rapide. Vous pouvez avoir un index sur les projects tableau (les index sur les champs du tableau sont appelés index multi-clés ) - sur les champs du projet. Par exemple, indexez sur projectId ou/et projectName logique.

Vous pouvez obtenir tous les projets d'un utilisateur - c'est une simple requête utilisant le user id / name . Requête projection permet quelles informations liées au project est affiché. Vous pouvez utiliser un find ou aggregate méthode pour construire la requête. Vous pouvez interroger un project spécifique pour un user , en utilisant le projectId ou projectName . Puisqu'il y a des index sur user et project champs, ce sera une requête efficace.

Donc, ma recommandation est d'avoir une seule collection, user_projects , avec un user les informations de et les projects informations qui y sont intégrées.