如何在MongoDB中组织多对多关系

如何在MongoDB中组织多对多关系,mongodb,many-to-many,relational-database,document-database,Mongodb,Many To Many,Relational Database,Document Database,我有两个表/集合;用户和组。用户可以是任意数量组的成员,也可以是任意数量组的所有者。在关系数据库中,我可能有第三个名为UserGroups的表,其中有一个UserID列、一个GroupID列和一个IsOwner列 我使用的是MongoDB,我确信对于文档数据库中的这种关系有不同的方法。我是否应该将组和组作为所有者的列表作为objectid的两个数组嵌入到Users表中?我是否还应该将Groups表中的成员和所有者列表存储为两个数组,从而有效地镜像关系,从而导致关系信息的重复 或者桥接用户组表是文

我有两个表/集合;用户和组。用户可以是任意数量组的成员,也可以是任意数量组的所有者。在关系数据库中,我可能有第三个名为UserGroups的表,其中有一个UserID列、一个GroupID列和一个IsOwner列

我使用的是MongoDB,我确信对于文档数据库中的这种关系有不同的方法。我是否应该将组和组作为所有者的列表作为objectid的两个数组嵌入到Users表中?我是否还应该将Groups表中的成员和所有者列表存储为两个数组,从而有效地镜像关系,从而导致关系信息的重复

或者桥接用户组表是文档数据库中多对多关系的合法概念


谢谢

我所看到的,我目前使用的是在每个文档中都有节点id的嵌入式数组

因此,文档user1具有属性组:[id1,id2]

并且文档组1具有属性用户:[user1]。文档组2还具有属性用户:[user1]

通过这种方式,您可以获得一个组对象,并轻松地选择所有相关的用户,对用户也是如此

在创建和更新对象时,这需要更多的工作。当您说两个对象相关时,您必须更新这两个对象

MongoDB中还有一个概念DBReferences,根据驱动程序的不同,它将在检索文档时自动提取引用的对象


让我们通过一个例子来理解多对多关系

给作者的书 学生对老师 书籍与作者之间是几对几的关系,因此我们可以在另一个文档中包含一系列书籍或作者。学生和老师也是如此。我们还可以冒着重复的风险嵌入。然而,这将要求每个学生在插入之前在系统中有一名教师,反之亦然。应用程序逻辑可能总是不允许这样做。换句话说,父对象必须存在,子对象才能存在


但是当你有多对多的关系时,使用两个集合并有一个真正的链接。

如果有人感兴趣,我刚刚在mongoDB博客上偶然发现了一篇非常好的文章。本文共分三个部分,读完所有三个部分后,您将有一个很好的理解。

非常感谢您为我指点文档。从现在的意义上讲,这是一种不同的方法,更灵活,更高效。进入这一领域令人兴奋。刚才还看到Kyle Banker在演示视频29分钟时回答了我的问题:。永远不要使用联接表来表示多对多,而是在两个集合中都有一个ObjectID列表。不过,这是如何扩展的?在组文档中有一个用户列表可能会很快失去控制,因为您可能有数千个用户,对吗?一致性呢?如果您删除了其中一方,但有什么东西阻止您删除另一方,您如何检查这一点?我认为,在使用文档存储时,您不应该过分重视数据完整性,因为这样的解决方案并不是为了优化数据完整性,而是为了优化数据可用性。软件工程是一个权衡的世界。如果数据完整性真的很重要,您可能应该选择关系解决方案。在我的公司,我们丢弃无法填充的read:id数据,并且不会向用户显示错误。这在任何关系解决方案中都无法实现,因为数据库层会抛出错误。我们有工具来清理由探查器运行的数据存储。另请参阅的答案,我知道这很旧,但我也对规模感到疑惑。如果您有1000个组怎么办?很好的一点-在本例中,另一个选择是使用SQL数据库中的连接关系的等价物-一个具有两个外键的中间集合-每个相关集合一个。在这种情况下,您可以执行3个查询:1正常查找以获取父结果,2 In查询以获取中间结果,最后3 In查询使用中间结果中的外键来查找子记录。这就是我们在WaterLine中实现此功能的方式,MongoDB不鼓励使用多个集合执行联接。最好在两个集合中都存储一个引用ID数组