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.