Un user
può avere molti projects
(e un progetto è associato a un solo utente). Questo è un uno a molti relazione.
Ogni user
dovrebbe memorizzare l'elenco dei suoi projects
. Ad esempio:
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. } },
...
]
Nota che ogni project
è un documento secondario (oggetto o documento incorporato) all'interno dei projects
Vettore. Un project
ha i suoi dettagli correlati come projectId
, projectName
, ecc.
Penso che dovrebbe esserci solo una raccolta chiamato come user_projects
. Supponendo che:(i) un user
può avere da 0 a 100 progetti e (ii) un project
i dettagli di non sono troppo grandi.
Questo è un modello per incorporare il lato "molti" della relazione 1-a-N nel lato "uno". Questo è un modo consigliato, denormalizzando i dati. Questo ha il vantaggio di query efficienti e veloci. Ciò semplifica le transazioni, poiché le scritture (inserimenti, aggiornamenti ed eliminazioni) saranno atomiche con un'unica operazione su un documento all'interno della stessa raccolta.
Utilizzerai l'user
id
o name
(con un indice univoco) per recuperare un documento e sarà una query molto veloce. Puoi avere un indice sui projects
array (gli indici sui campi dell'array sono chiamati Indici multichiave ) - sui campi del progetto. Ad esempio, indice su projectId
o/e projectName
ha senso.
Puoi ottenere tutti i progetti per un utente:è una semplice query utilizzando user
id
/ name
. Interroga proiezione consente quali informazioni relative a project
È visualizzato. Puoi usare un find
o aggregate
metodo per creare la query. Puoi interrogare un project
specifico per un user
, utilizzando projectId
o projectName
. Poiché ci sono indici su user
e project
campi, questa sarà una query efficiente.
Quindi, la mia raccomandazione è di avere una singola raccolta, user_projects
, con un user
le informazioni di ' e i projects
informazioni in esso incorporate.