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

时间:2011-01-29 22:35:09

标签: mongodb many-to-many relational-database document-database

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

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

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

由于

3 个答案:

答案 0 :(得分:35)

我见过的,我目前使用的是每个文档中都有节点ID的嵌入式数组。

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

文档group1有属性用户:[user1]。文档组2也有属性用户:[user1]。

通过这种方式,您可以获得一个Group对象并轻松选择所有相关用户,并为用户提供相同的用户。

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

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

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

答案 1 :(得分:5)

如果有人对此感兴趣,我只是碰到了mongoDB博客上发表的一篇非常好的文章。 6 Rules of Thumb for MongoDB Schema Design。本文分为3部分,在阅读完全3篇文章之后,您将对此有一个很好的理解。

答案 2 :(得分:2)

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

  • 书籍给作者
  • 学生与老师

作者的书籍是少数几个关系,因此我们可以在另一个文档中包含一系列书籍或作者。同样适合学生和老师。我们也可能面临重复的风险。然而,这将要求每个学生在插入之前在系统中有教师,反之亦然。应用程序逻辑可能始终不允许它。换句话说,父对象必须存在才能存在子对象。

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