sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB:¿debería mi documento de usuario contener una lista de ID de proyectos?

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.