【问题标题】:How to organise a many to many relationship in MongoDB如何在 MongoDB 中组织多对多关系
【发布时间】:2011-06-17 21:56:41
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 另见this questionthis question的答案
  • 我知道这已经很老了,但我也想知道规模。如果您有 1000 个组怎么办?
  • 好点——在这种情况下,另一种选择是使用相当于 SQL 数据库中的联结关系 - 具有两个外键的中间集合 - 每个相关集合一个外键。在这种情况下,您可以执行 3 个查询:(1) 一个普通的 find() 来获取父结果,(2) 一个 IN 查询来获取中间结果,最后 (3) 一个使用外键的 IN 查询查找子记录的中间结果。 (这就是我们在 Waterline 中实现此功能的方式)

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


【解决方案1】:

我所看到的以及我目前使用的是每个文档中带有节点 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

【讨论】:

  • 非常感谢您也将我指向文档。现在说得通了,这是一种不同的方法,而且更灵活、更高效,进入这些东西是令人兴奋的。还有mongodb.org/display/DOCS/Schema+Design
  • 刚刚看到 Kyle Banker 在此演示视频的第 29 分钟回答了我的问题:blip.tv/file/3704083。永远不要使用连接表来表示多对多,而是在两个集合中都有一个 ObjectId 列表
  • 这个规模如何?如果您可能拥有数千名用户,那么在组文档中拥有用户列表可能会很快失控?
  • 一致性怎么样?如果您删除了一侧,但有些东西阻止您删除另一侧,您如何检查?
  • 我认为——在使用——文档存储时,你不应该对数据完整性如此重视,因为这样的解决方案并不是为了优化它,而是为了优化数据可用性。软件工程是一个权衡取舍的世界。如果数据完整性真的很重要,您可能应该选择关系解决方案。在我的公司,我们丢弃了我们无法填充的数据(读取:id),并且不会向用户显示错误。您根本无法在任何关系解决方案中执行此操作,因为数据库层会引发错误。我们有清理数据存储的工具,这些工具由分析器运行。
【解决方案2】:

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

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

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

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

【讨论】:

  • 在 MongoDB 中不鼓励使用多个集合来执行连接。最好在两个集合中存储一个引用 ID 数组
【解决方案3】:

如果有人感兴趣,我刚刚在 mongoDB 博客上看到了一篇非常好的文章。 6 Rules of Thumb for MongoDB Schema Design。这篇文章共有3个部分,看完3个你就会有一个很好的理解。

【讨论】:

  • 该死的,我一直在寻找这样的东西来最终理解在建模数据库时如何思考
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 2013-01-02
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2020-10-09
  • 2018-09-17
相关资源
最近更新 更多