MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Modélisation plusieurs-à-plusieurs :travers avec Mongoid/MongoDB

La modélisation d'un bon schéma Mongodb dépend vraiment de la façon dont vous accédez à vos données. Dans votre cas décrit, vous indexerez votre clé memberships.user_id qui semble correcte. Mais la taille de votre document augmentera à mesure que vous ajouterez des lecteurs, des éditeurs et des administrateurs. De plus, votre schéma rendra difficile la réalisation de requêtes telles que :

Projets de requête, où user_id xxx est l'éditeur :

Encore une fois, vous n'avez peut-être pas besoin d'interroger des projets comme celui-ci, donc votre schéma semble correct. Mais si vous avez besoin d'interroger vos projets par user_id ET rôle, je vous recommande de créer une collection '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})

Ou encore plus simple... ajoutez un index sur le schéma de votre projet :

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