MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB - il mio documento utente dovrebbe contenere un elenco di ID progetto?

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.