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

mange til mange forhold til nosql (mongodb og mongoose)

Tværtimod er løsning 1 og 2 dit bedste bud. Løsning 3 kan overvejes, når opdaterings-/oprettelseshyppigheden er meget mindre sammenlignet med læsehyppigheden for projekter og brugere, som selvom det kræver to forespørgsler for at opdatere/oprette, det vil læsevenligheden kompensere for.

For at vælge mellem løsning 1 og 2 skal du overveje læsefrekvenserne. Vil du have brug for projekter af en bruger eller brug af et projekt oftere og vælge i henhold til det. Hvis du føler, at begge er af relativt samme frekvens, er det bedre at holde brugerobjektet så mindre klynget som muligt. Uanset hvilken mulighed du vælger, så overvej at beholde et index på arrayet, der gemmer _id s (af projekter eller brugere).

F.eks.

userSchema = new Schema(
            {//otherstuff
               project_ids: [{type: Schema.Types.ObjectId, ref: 'Project'}})
              ...
            }) 
userSchema.index({'project_ids':1})

eller

projectSchema = new Schema(
            {//otherstuff
               user_ids: [{type: Schema.Types.ObjectId, ref: 'User'}})
              ...
            }) 
projectSchema.index({'user_ids':1})

Holder et indeks på arrayet _id vil i høj grad forbedre dine forespørgslers hastighed på den side, hvor du frygter, at der vil være betydelige omkostninger.

Men behold index kun hvis denne relation er en vigtig relation med mange forespørgsler i gang. Hvis dette kun er en sidefunktion i dit projekt, kan du klare dig without også et indeks.

Hvis brugeren kan gøre mange ting og har mange relationer, vil du have brug for det brugerobjekt konstant i hele din app, så hvis din app ikke er projektspecifik, ville det være bedre ikke at sætte projekt-id'erne i brugerskemaet . Men da vi bare sætter id'erne, er det alligevel ikke meget af en overhead. Det behøver du ikke bekymre dig om.

Reg index på begge arrays:Ja, det kan du selvfølgelig. Men når du går efter løsning 3, behøver du slet ikke et indeks, da du ikke vil lave en forespørgsel for at få listen over projekter for en bruger eller listen over brugere i et projekt. Løsning 3 gør læsning meget let, men at skrive lidt besværligt. Men som du nævnte, involverer dit use case reading>>writing , gå med løsning 3, men der er altid en fare for datainkonsistens, som du skal tage dig af.

Indeksering gør bare tingene hurtigere. Gå gennem dokumenterne og google lidt. Ikke noget fancy. Forespørgsel over indekserede arrays er effektivt end normale arrays. F.eks. Lad os antage, at du bruger løsning 2. Gem projekt-id'erne i feltet project_ids.

Du kan nemt få en brugers projekter. Dette er ligetil.

Men for at få brugere af projekt1. Du skal have en forespørgsel som denne.

User.find({project_ids:project._id},function(err,docs){
     //here docs will be the list of the users of project1
})
//The above query might be slow if the user base is large. 
//But it can be improved vastly by indexing the project_ids field in the User schema.

Tilsvarende for løsning 1. Hvert projekt har bruger_id-felt. Lad os antage, at vi har en bruger1. For at få brugerens projekter laver vi følgende forespørgsel

Project.find({user_ids:user1._id},function(err,docs){
      //here docs will be the projects of user1
      //But it can be improved vastly by indexing the user_ids field in the Project schema.

Hvis du overvejer løsning 1 vs løsning 2, er løsning 1 bedre. Der kan være tilfælde, hvor du har brug for bruger uden hans projekter, men chancerne for at kræve projektet uden brugere er ret lav. Men det afhænger af din nøjagtige anvendelse.



  1. Benchmarking MongoDB - Driving NoSQL Performance

  2. mongodb, replikater og fejl:{ $err :not master and slaveOk=false, code :13435 }

  3. Sådan oprettes forbindelse til Redis-instans (memorystore) fra Googles Standard App Engine (Python 3.7)

  4. Opdater felt i nøjagtigt elementarray i MongoDB