通过Mongoid / MongoDB建模多对多:
我对Mongoid / MongoDB比较新,我对如何建立特定的多对多关系有疑问。
我有一个User
模型和一个Project
模型。 用户可以属于许多项目,每个项目成员资格包括一个角色(例如“管理员”,“编辑者”或“查看者”)。 如果我使用ActiveRecord,那么我将使用has_many :through
在User
和Project
之间建立多对多关联,然后我会在连接表中放置一个角色字段。
在MongoDB中为这个场景建模的好方法是什么?如何使用Mongoid声明该模型? 下面的示例似乎是一个很好的模型,但我不知道如何优雅地声明User
和嵌入式ProjectMembership
与Mongoid之间的关系关联。
提前致谢!
db.projects.insert( { "name" : "Test project", "memberships" : [ { "user_id" : ObjectId("4d730fcfcedc351d67000002"), "role" : "administrator" }, { "role" : "editor", "user_id" : ObjectId("4d731fe3cedc351fa7000002") } ] } ) db.projects.ensureIndex({"memberships.user_id": 1})
建模好的Mongodb架构实际上取决于您访问数据的方式。 在您描述的情况下,您将索引您的memberships.user_id键,这似乎没问题。 但是,随着您添加查看者,编辑者和管理员,您的文档大小将会增加。 此外,您的架构将使查询很难像:
查询项目,其中user_id xxx是编辑器:
同样,您可能不需要查询这样的项目,因此您的架构看起来很好。 但是如果你需要通过user_id和角色查询你的项目,我建议你创建一个’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})
甚至更容易……在项目架构上添加索引:
db.projects.ensureIndex({"memberships.role": 1})