如何在nosql(mongodb)中修复我的m..n关系?

时间:2011-12-21 15:25:14

标签: sql mongodb database-design database nosql

起初我正在尝试进行一次集会(你知道带有司机的车......)数据库。我有两个集合:drivers { name, address, sex, ... },然后是另一个tournaments { name, location, price, ... }

我尽量保持简单。在锦标赛中应该有车手(因为没有车手的比赛......好吧不是很好^^)。并且有我的问题,在正常的sql数据库中我可以选择两个主键(让我们说在驱动程序中的名称和锦标赛中的名称 - 只是为了保持简单,我知道名字作为主键不好)。因为它是一个m..n关系(是不是?)我会用两个主键创建一个3.表。好的,这很容易。但是我应该如何在mongodb中解决这个问题。我想的是:tournaments { name, location, price, ... drivers { driver_1, ..., driver_n } },但我不确定。我正在使用Java,所以我可以制作一些特殊的类来处理这种关系问题?我不明白其他的mongodb教程。有任何想法吗?谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

有几种方法可以做到这一点:

  1. 正如@Gianluca所描述的那样,您可以通过向锦标赛文档中的“drivers”数组添加驱动程序的_id ObjectId或其他标识属性(可能是您具有唯一索引的属性)来手动执行此链接。例如锦标赛:{ ... drivers : ["6019235867192384", "73510945093", ...]}
  2. 专门为此引用构建的另一个选项是DBRef规范,它提供了一种更正式的方法,可能更类似于您在SQL世界中所熟悉的方法。 java驱动程序支持DBRef,并允许您对集合的引用作用(基本上说明此引用的来源)。如果在未来版本的MongoDB交叉集合查询中支持,我不会感到惊讶,尽管它们目前不是。
  3. 更多信息here

    另外,如果您没有使用DAO框架,我建议使用Morphia支持带有@Reference注释的DBRef。

答案 1 :(得分:2)

我使用每个文档都具有且唯一的_id字段解决了问题。

所以在你的情况下,你只需要创建一个具有torunaments的ObjectId和来自集合驱动程序的一些ObjectId的集合。或者你可以直接将驱动程序的ObejctId放在torunaments集合中。可能不是最好的解决方案,但它可以工作

詹卢卡

答案 2 :(得分:1)

drivers类型中添加数组字段trournaments,并将驱动程序的_id放入其中。

要添加/删除驱动程序,只需更新字段即可。除非阵列变得非常庞大,否则不需要中间N:M映射表。

如果它变得庞大,通常的解决方案是将阵列切割成几个较小的阵列,并将它们保存在几个文档中,您可以使用容器的id_(锦标赛)快速查找。当然,删除和排序是一种痛苦。