Un user
puede tener muchos projects
(y un proyecto está asociado con un solo usuario). Este es un uno a muchos relación.
Cada user
debe almacenar la lista de sus projects
. Por ejemplo:
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. } },
...
]
Tenga en cuenta que cada project
es un subdocumento (objeto o documento incrustado) dentro de los projects
formación. Un project
tiene sus detalles relacionados como, projectId
, projectName
, etc.
Creo que debería haber solo una colección llamado como user_projects
. Asumiendo que:(i) un user
puede tener de 0 a 100 proyectos, y (ii) un project
Los detalles de no son demasiado grandes.
Este es un modelo de incorporar el lado 'muchos' de la relación 1 a N en el lado 'uno'. Esta es una forma recomendada, desnormalizando los datos. Esto tiene la ventaja de consultas eficientes y rápidas. Esto simplifica las transacciones, ya que las escrituras (inserciones, actualizaciones y eliminaciones) serán atómicas con una sola operación en un documento dentro de la misma colección.
Estarás usando el user
id
o name
(con un índice único) para recuperar un documento, y será una consulta muy rápida. Puede tener un índice en los projects
matriz (los índices en los campos de la matriz se denominan Índices multiclave ) - en los campos del proyecto. Por ejemplo, índice en projectId
o/y projectName
tiene sentido.
Puede obtener todos los proyectos para un usuario:es una consulta simple usando el user
id
/ name
. Consulta proyección permite qué información relacionada con project
se visualiza. Puedes usar un find
o aggregate
método para construir la consulta. Puede consultar un project
específico para un user
, usando el projectId
o projectName
. Dado que hay índices en user
y project
campos, esta será una consulta eficiente.
Entonces, mi recomendación es tener una sola colección, user_projects
, con un user
La información de y los projects
información incrustada en él.