2011-12-21 13 views
2

まず、ラリー(あなたはドライバで車を知っています...)データベースを作ろうとしています。私は2つのコレクションを持っています:drivers { name, address, sex, ... }そしてもう1つtournaments { name, location, price, ... }nosql(mongodb)で私のm..n関係を修正するには?

私はそれを単純にしています。トーナメントではドライバーがいなければなりません(ドライバーのないトーナメント...いいですね^^)。そして、私の問題は、通常のSQLデータベースでは、私は2つのプライマリキーを選択することができます(トーナメントでドライバと名前の名前を言う - それを単純に保つために、私はプライマリキーがいいではない名前を知っている)。そして、そのm..n関係(それは正しい?)のために、私は3つの主キーを持つテーブルを作成します。それは簡単だろう。しかし、どのように私はmongodbでこの問題を解決すべきですか?私は何かのように思った:tournaments { name, location, price, ... drivers { driver_1, ..., driver_n } }、しかしわからない。私はJavaを使用しているので、この関係の問題を処理するいくつかの特別なクラスを作ることができますか?私は他のmongodbチュートリアルを理解していません。何か案は?何か助けてくれてありがとう!

+0

「sql」と「nosql」の両方にタグを付けるにはどうすればよいですか? – MatBailie

答えて

4

これを行うには、いくつかの方法があります。

  1. @Gianlucaあなたは、ドライバの_idのObjectIdまたは追加することによって、手動でリンクするこれを行うことができますについて説明したようトーナメント文書の「ドライバ」配列に別の識別プロパティ(おそらく一意のインデックスを持っているもの)を追加します。例えばトーナメント:{ ... drivers : ["6019235867192384", "73510945093", ...]}
  2. この参照用に特別に作成されたもう1つのオプションは、おそらくSQL世界で慣れ親しんでいるものにもっと似た、より正式な方法を提供するDBRef仕様です。 DBRefはJavaドライバによってサポートされており、コレクションへの参照をスコープできます(基本的にこの参照がどこから来ているかを示しています)。将来MongoDBのクロス集計クエリーがサポートされるのであれば、私は驚くことはありませんが、現在ではありません。

詳細情報here

また、DAOフレームワークを使用していない場合は、@Referenceアノテーション付きのDBRefをサポートするMorphiaを提案します。

2

私はすべてのドキュメントが持っていた一意な_idフィールドを使用して問題を解決しました。

この場合、武器のObjectIdとコレクションドライバのObjectIdを持つコレクションを作成するだけで済みます。あるいは、ドライバのObejctIdをtorunamentsコレクションに直接入れることもできます。おそらくない最善の解決策が、それに動作

Gianlucaさん

1

アレイフィールドdriverstrournamentsタイプに追加し、そこにドライバの_idを入れます。

ドライバを追加/削除するには、フィールドを更新するだけです。配列が本当に大きくならない限り、中間のN:Mマッピングテーブルは必要ありません。

巨大になる場合は、アレイをいくつかの小さなものに切断し、コンテナ(トーナメント)のid_を使用してすばやく検索できるいくつかのドキュメントに保存します。削除と並べ替えは、もちろん痛みです。

関連する問題