2011-12-21 75 views
2

起初我试图做一个集会(你知道汽车与司机...)数据库。我有两个系列:drivers { name, address, sex, ... }然后另一个tournaments { name, location, price, ... }如何解决我在nosql(mongodb)中的m..n关系?

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

+0

如何来的东西都标记'sql'和'nosql'? – MatBailie 2011-12-21 15:27:52

回答

4

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

  1. 作为@Gianluca描述你可以通过添加一个驱动器的_id的ObjectId或执行此手动连接另一个标识属性(可能是一个你有一个唯一的索引)的比赛文件中的“司机”阵列。例如赛:{ ... drivers : ["6019235867192384", "73510945093", ...]}
  2. 专门为此引用内置另一种选择是DBRef规范提供了一个更正式的方法可能更类似于你在SQL世界熟悉。 DBRef受java驱动程序支持,并允许您将引用的范围(基本上说明此引用来自何处)。如果将来版本的MongoDB跨集合查询将得到支持,我不会感到惊讶,尽管它们目前还不支持。

更多信息here

另外,如果您不使用DAO框架,我会建议Morphia它支持DBRef与一个很好的@Reference注释。

2

我使用_id领域,每一个文件有,是唯一的解决了这个问题。

所以你如果你只需要创建一个具有torunaments的的ObjectId和收集司机一些的ObjectId的集合。或者,您可以直接将驱动程序的ObejctId放入torunaments集合中。可能不是最好的解决方案,但它的工作

赞布罗塔

1

添加阵列场driverstrournaments类型,并把_id S上的司机在那里。

要添加/删除驱动程序,只需更新的领域。除非数组变得非常大,否则不需要中间的N:M映射表。

如果它变得巨大,通常的解决办法是将数组切割成几个小的,并将它们保存在几个文件,你可以通过使用容器(比赛)的id_快速查找。当然,去除和分类是一件痛苦的事情。