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.