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.