sql >> Database >  >> NoSQL >> MongoDB

MongoDB - moet mijn gebruikersdocument een lijst met project-ID's bevatten?

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.




  1. MongoEngine Document Object gemaakt met from_json slaat niet op

  2. MongoDB:Vreselijke kaart Prestaties verminderen

  3. MongoDB $mul

  4. Hoe geef ik criteria op voor het uitsluiten van documenten van een zoekopdracht?