2011-12-21 51 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_快速查找。當然,去除和分類是一件痛苦的事情。