sql >> Databasteknik >  >> NoSQL >> MongoDB

Modellera många-till-många :through med Mongoid/MongoDB

Att modellera ett bra Mongodb-schema beror verkligen på hur du kommer åt din data. I ditt beskrivna fall kommer du att indexera nyckeln memberships.user_id vilket verkar ok. Men din dokumentstorlek kommer att växa när du lägger till tittare, redaktörer och administratörer. Dessutom kommer ditt schema att göra det svårt att göra frågor som:

Fråga projekt, där user_id xxx är redaktör:

Återigen, du kanske inte behöver fråga projekt som detta, så ditt schema ser bra ut. Men om du behöver fråga dina projekt efter user_id OCH roll, skulle jag rekommendera att du skapar en 'project_membership'-samling:

db.project_memberships.insert(
  { 
    "project_id" : ObjectId("4d730fcfcedc351d67000032"),
    "editors" : [
      ObjectId("4d730fcfcedc351d67000002"),
      ObjectId("4d730fcfcedc351d67000004")
    ],
    "viewers" : [
      ObjectId("4d730fcfcedc351d67000002"),
      ObjectId("4d730fcfcedc351d67000004"),
      ObjectId("4d730fcfcedc351d67000001"),
      ObjectId("4d730fcfcedc351d67000005")
    ],
    "administrator" : [
      ObjectId("4d730fcfcedc351d67000011"),
      ObjectId("4d730fcfcedc351d67000012")
    ]
  }
)

db.project_memberships.ensureIndex({"editors": 1})
db.project_memberships.ensureIndex({"viewers": 1})
db.project_memberships.ensureIndex({"administrator": 1})

Eller ännu enklare... lägg till ett index på ditt projektschema:

db.projects.ensureIndex({"memberships.role": 1})



  1. Olika index på olika replikuppsättningsmedlemmar

  2. Meteor kräver sudo för att köra

  3. MongoDB med redis

  4. Vad händer med Meteor och Fibres/bindEnvironment()?