MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Modelando muitos-para-muitos :through com Mongoid/MongoDB


Modelar um bom esquema Mongodb realmente depende de como você acessa seus dados. No seu caso descrito, você indexará sua chave Members.user_id, que parece estar correta. Mas o tamanho do seu documento aumentará à medida que você adicionar visualizadores, editores e administradores. Além disso, seu esquema dificultará a realização de consultas como:

Projetos de consulta, em que user_id xxx é editor:

Novamente, talvez você não precise consultar projetos como este, então seu esquema parece bem. Mas se você precisar consultar seus projetos por user_id AND role, eu recomendo que você crie uma coleção '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 ainda mais fácil... adicione um índice no esquema do seu projeto:
db.projects.ensureIndex({"memberships.role": 1})