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.