63

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

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

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

谢谢

4

3 回答 3

36

我所看到的以及我目前使用的是每个文档中带有节点 ID 的嵌入式数组。

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

并且文档 group1 具有属性 users:[user1]。文档 group2 也有属性 users:[user1]。

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

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

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

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

于 2011-01-29T23:20:31.693 回答
11

万一有人感兴趣,我刚刚在 mongoDB 博客上看到了一篇非常好的文章。MongoDB 模式设计的 6 条经验法则。这篇文章共有3个部分,看完3个你就会有一个很好的理解。

于 2017-12-04T02:34:19.910 回答
1

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

  • 给作者的书
  • 学生对老师

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

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

于 2016-08-29T19:32:12.113 回答