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

Typ*_*son 58 many-to-many relational-database mongodb document-database

我有两张桌子/收藏品; 用户和组.用户可以是任意数量的组的成员,用户也可以是任意数量的组的所有者.在关系数据库中,我可能有第三个名为UserGroups的表,其中包含UserID列,GroupID列和IsOwner列.

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

或者,桥接UserGroups表是文档数据库中用于多对多关系的合法概念?

谢谢

Ale*_*scu 35

我所看到的,我目前使用的是每个文档中包含节点ID的嵌入式数组.

所以文档user1有属性组:[id1,id2]

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

这样您就可以获得一个Group对象并轻松选择所有相关用户,并为User提供相同的用户.

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

MongoDB中还有一个概念DBReferences,根据您的驱动程序,它会在检索文档时自动拉取引用的对象.

http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef

  • 这虽然规模如何?当您可能有数千名用户时,拥有组文档中的用户列表可能会很快失控? (9认同)
  • 刚刚看到Kyle Banker在第29分钟回答了我的问题:http://www.blip.tv/file/3704083.永远不要使用连接表来表示多对多,而是在两个集合中都有一个ObjectId列表 (8认同)
  • 一致性怎么样?如果你删除了一面,但有些东西阻止你删除另一面,你如何检查? (3认同)

Mam*_*dar 6

如果有人对此感兴趣,我只是在mongoDB博客上发表了一篇非常好的文章.MongoDB Schema Design的6个经验法则.本文共有3个部分,在阅读完所有3篇文章后,您将有一个很好的理解.