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

Modellazione molti-a-molti :attraverso con Mongoid/MongoDB

La modellazione di un buon schema Mongodb dipende davvero da come accedi ai tuoi dati. Nel tuo caso descritto, indicizzerai la tua chiave memberships.user_id che sembra ok. Ma le dimensioni del tuo documento aumenteranno man mano che aggiungerai visualizzatori, editori e amministratori. Inoltre, il tuo schema renderà difficile eseguire query come:

Query progetti, dove user_id xxx è editor:

Ancora una volta, forse non è necessario interrogare progetti come questo, quindi il tuo schema sembra a posto. Ma se hai bisogno di interrogare i tuoi progetti per user_id AND role, ti consiglierei di creare una raccolta 'project_membership' :

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})

O ancora più semplice... aggiungi un indice sullo schema del tuo progetto:

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