Een user
kan veel projects
hebben (en een project is slechts aan één gebruiker gekoppeld). Dit is een een-op-veel relatie.
Elke user
moet de lijst van zijn/haar projects
opslaan . Bijvoorbeeld:
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. } },
...
]
Merk op dat elk project
is een subdocument (object of embedded document) binnen de projects
reeks. Een project
heeft zijn gerelateerde details zoals, projectId
, projectName
, enz..
Ik denk dat er maar één verzameling moet zijn aangeroepen als user_projects
. Ervan uitgaande dat:(i) een user
kan 0 tot 100 projecten hebben, en (ii) een project
's details zijn niet al te groot.
Dit is een model om de 'veel'-kant van de 1-op-N-relatie in te bedden in de 'één'-kant. Dit is een aanbevolen manier om de gegevens te de-normaliseren. Dit heeft het voordeel van efficiënte en snelle queries. Dit vereenvoudigt transacties, aangezien schrijven (invoegen, bijwerken en verwijderen) atomair zal zijn met één enkele bewerking naar een document binnen dezelfde verzameling.
U gebruikt de user
id
of name
(met een unieke index) om een document op te halen, en het zal zeer snel opvragen. U kunt een index hebben op de projects
array (indexen op arrayvelden worden Multikey Indexes genoemd) ) - op de velden van het project. Indexeer bijvoorbeeld op projectId
of/en projectName
logisch.
U kunt alle projecten voor een gebruiker krijgen - het is een eenvoudige zoekopdracht met behulp van de user
id
/ name
. Query projectie staat toe welke informatie gerelateerd is aan project
wordt weergegeven. U kunt een find
. gebruiken of aggregate
methode om de query te bouwen. U kunt een specifiek project
opvragen voor een user
, met behulp van de projectId
of projectName
. Aangezien er indexen zijn op user
en project
velden, is dit een efficiënte zoekopdracht.
Dus mijn aanbeveling is om één verzameling te hebben, user_projects
, met een user
's informatie en de projects
informatie die erin is ingebed.