2

次のようなユーザーテーブルがあります。

{ _id: kshjfhsf098767, email: email@something name: John joshua }
{ _id: dleoireofd9888, email: email@hhh name: Terry Holdman }

他にも「ゲーム」をコレクションしています

{_id: gsgrfsdgf8898, home_user_id: kshjfhsf098767, guest_user_id: dleoireofd9888, result: "0:1"}

次に、(mysql のように) 参加し、home_user_id と guest_user_id を知っていて、名前の電子メールなどを取得するため、ユーザーと 2 回ゲームに参加します。それらすべてをテーブルゲームに配置できますが、コンテンツが複製されます。彼らが名前やメールアドレスを変更した場合、ゲームテーブル全体を更新する必要があります....

ゲームをプレイしている2人のユーザーでそのゲームを呼び出すための設計とクエリに関するヘルプは素晴らしいでしょう...Tnx

4

2 に答える 2

1

これを管理するには、手動またはDBRefを使用する 2 つの方法があります。前のドキュメント リンクから:

MongoDB は結合をサポートしていません。MongoDB では、一部のデータは「非正規化」されるか、関連データと共にドキュメントに保存され、結合の必要がなくなります。ただし、場合によっては、関連情報を別のドキュメント (通常は別のコレクションまたはデータベース) に格納することが理にかなっています。

したがって、リンクを自分で管理するか、組み込みの DBRef を使用する場合です。DBRef の場合については、「DBRefを使用して mongodb にクエリを実行する方法」を参照してください。

または、別のスキーマ設計を使用する方が管理しやすい場合があります。たとえば、ゲームコレクションは単に and を格納しresultgame_id代わりにgame_id関連する各ユーザーへの参照を追加することができます。もちろん、両方のコレクションにクエリを実行する必要があります。リンクされた SO の質問には、これを行う方法の例があります。

于 2012-10-28T09:36:03.737 に答える
0

MongoDB には JOIN がありません (NoSQL)。

ここで遅延結合を実行するだけで、ユーザー行をクエリしてから、そのユーザーが参加しているすべてのゲームをクエリできます。適切なインデックスを使用すると超高速になり、コマンドが 2 つの小さなコマンドになるため、MongoDB はそれらにほとんど気付かないでしょう。

ここに埋め込むことはお勧めしません。たとえば、あなたが述べている理由を考えると、単一のゲーム「部屋」にいる可能性のある数百人のユーザー間でデータを更新するのが面倒になります。この場合、別のコレクションのクエリに多少のオーバーヘッドがかかることを意味するとしても、単一のアトミック更新を実行することをお勧めします。

于 2012-10-28T09:24:18.350 に答える