2011-11-30 4 views
9

私はMySQLの背景から来て、MongoDBの周りを頭で囲んでいます。特に、私はどのようにモデル化すべきかを概念化するのに苦労しているn:n関係は、 "モンゴーの方法"。MongoDB(MySQLユーザーの場合)で多対多の関係をモデル化する方法

この例では、2つのcollectionsusersinterestsが2つあるとします。我々は、我々のデータで表現するか、いくつかのクエリできるようにする必要があります:

  • 興味のあるユーザの関心
  • ユーザーの評価、例えば「のような」またはMySQLに興味
  • インタレスト名

の各評価の特定の興味を持つ

  • ユーザー(インクリメント/デクリメントすることができます)
  • カウンターを「嫌い」、私が持っているでしょうユーザーID のインタレストIDの両方にインデックスされたusers_interestsテーブルを作成しました。カウンターについては、各格付けタイプごとに別々の列を用意しておき、ユーザーが関心を評価する/評価を解除するたびに、カウントが決して偽でないことを保証するトランザクションを実行しました。

    私はreading about some schema designsを試しましたが、役に立たないです。

    紛失した魂を助けることができますか?

  • 答えて

    10

    大きな質問です。最初に、N:Nの関係がどのように機能するかを少し説明しておきます。次に、それぞれの箇条書きポイントについて詳しく説明します。

    N:N通常、あなたのピボットテーブルは、あなたのユーザと関心事(user_interestsテーブル)を関連付けています。モンゴではこれをやや違ったやり方でやっています。あなたはまだユーザーと関心の集まりを持っていますが、代わりにユーザーの興味のあるキーのリストを保存します。 SOこのような何か:

    User Collection { 
         "name":"Josh", 
         "user":"jsmith", 
         "interests":[ 
          { 
          "_id":12345, 
          "rating":"like" 
          }, 
          {..}.. 
         ] 
    } 
    

    ご関心のテーブルの上にオフにキー止めされ、リスト内のあなたの興味を格納することにより、あなたはあなたが必要とするアクションのそれぞれを実行することができます。あなたが興味のテーブルにあるIDに基づいてクエリを実行したい場合は、$in modifierを使用してクエリを実行します。私は次のようにしてくださいあなたの興味のコレクションのための今すぐ

    :ユーザーのドキュメントへの関心を追加する場合

    User Interest { 
         "_id":objectId 
         "label":"Swimming", 
         "count":intValue 
    } 
    

    、カウント変数は、あなたの評価の定義に依存するであろう。別の領域(またはロジック)に格付けを格納する場合は、関心のあるint値に関連付ける値を割り当てます。 IE:ユーザーレートはmeh(値は1)です。カウント値に1を加算します。

    うまくいけば、これは役に立ち、少なくとも構造化の方法に関する他のアイデアをもたらしたと思います。

    幸運にも、MONGO IS AWESOMEを覚えておいてください。

    +0

    IDを保存する理由興味の名前を変更することはまずありませんが、参照を保持していますか?また、好きな名前を表示するには '$ in'を実行する必要があります。 – mnemosyn

    +0

    @mnemosyn通常、次の2つのシナリオのいずれかを持つコードパス:1:あなたは、どのユーザーが持っているかを知りたい、または2:ユーザーがどのような関心事を持っているかを見たい。最初のものではすでに名前があり、文字列ではなくID(高速クエリ)でクエリを実行するだけです。 2番目には、IDのリストがあり、オブジェクトIDを再度照会しています。また、興味の名前を変更する場合は、必要なのは、興味のコレクションの特定の関心のref idですので、すべてのユーザーエントリを更新するためにリファクタリングする必要はありません。お役に立てれば! – Petrogad

    +0

    @mnemosyn "釣り"から "釣り"など何かを大文字にすることを決めるとどうなりますか? – ceejayoz

    1

    アトミック更新演算子を使用してレーティングを更新(加算または減算)する別の独立したコレクションが必要です。 。

    Userコレクション自体に、各ユーザーの関心をサブ文書の配列として格納できます。

    このデータのJSON構造はのようなもののようになります。これは、特に関心を持っているユーザーを返します

    > db.User.find({ "interests.name" : "cooking" }) 
    

    db.User 
    { 
        name: 'joe', 
        ...., 
        interests : [{ name: 'swimming', rating: 10}, 
           { name: 'cooking', rating: 22 } 
           ] 
    } 
    

    今あなたが使って内部キーに照会することができます。

    +0

    このように、レーティングはすべてのユーザーに対して非正規化されます。つまり、すべてのユーザーにグローバルレーティング(評価:101)のコピーがあります。これは維持できません。 – mnemosyn

    +0

    評価とカウントの間には違いがあります。カウントはグローバルであり、レーティングはユーザーに関連しています。ただし、評価は整数ではなく文字列でなければなりません。 –

    +0

    OK、私はOPの質問を誤解しました。 – mnemosyn

    関連する問題