MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB - meu documento de usuário deve conter uma lista de IDs de projeto?


Um user pode ter muitos projects (e um projeto é associado a apenas um usuário). Este é um um para muitos relação.




Cada user deve armazenar a lista de seus projects . Por exemplo:
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. } },
         ...
    ]

Observe que cada project é um subdocumento (objeto ou documento incorporado) dentro dos projects variedade. Um project tem seus detalhes relacionados, como projectId , projectName , etc.




Acho que deve haver apenas uma coleção chamado como user_projects . Supondo que:(i) um user pode ter de 0 a 100 projetos, e (ii) um project Os detalhes de não são muito grandes.

Este é um modelo de incorporação do lado 'muitos' da relação 1-para-N no lado 'um'. Essa é uma maneira recomendada, desnormalizando os dados. Isso tem a vantagem de consultas eficientes e rápidas. Isso simplifica as transações, pois as gravações (inserções, atualizações e exclusões) serão atômicas com uma única operação em um documento dentro da mesma coleção.




Você estará usando o user id ou name (com um índice único) para recuperar um documento, e será uma consulta muito rápida. Você pode ter índice nos projects array (os índices em campos de array são chamados de Índices de várias chaves ) - nos campos do projeto. Por exemplo, indexe em projectId ou/e projectName faz sentido.

Você pode obter todos os projetos para um usuário - é uma consulta simples usando o user id / name . Consulta projeção permite quais informações relacionadas ao project é exibido. Você pode usar um find ou aggregate para construir a consulta. Você pode consultar um project específico para um user , usando o projectId ou projectName . Como existem índices em user e project campos, esta será uma consulta eficiente.

Então, minha recomendação é ter uma única coleção, user_projects , com um user informações e os projects informações nele inseridas.