10

私はバックグラウンドから来てMySQL、頭を包み込もうとしていMongoDBます。特に、n:n関係を「Mongoway」でモデル化する方法を概念化するのに苦労しています。

この例では、collectionsusersと。が2つあるとしinterestsます。データ内のいくつかのことを表現または照会できる必要があります。

  • ユーザーの興味
  • 「好き」や「嫌い」などのユーザーの関心の評価
  • 特定の関心を持つユーザー
  • 関心のある各評価のカウンター(インクリメント/デクリメント可能)
  • インタレスト名

で、ユーザーIDインタレストIDの両方でインデックス付けさMySQLれたテーブルを作成します。カウンターの場合、評価タイプごとに個別の列があり、ユーザーが関心を評価/非評価するたびに、カウントが誤っていないことを確認するためにトランザクションを実行しました。users_interests

いくつかのスキーマ設計について読んでみましたが、役に立ちませんでした。

あなたは失われた魂が道を見つけるのを手伝うことができますか?

4

2 に答える 2

14

素晴らしい質問です。まず、N:Nの関係がどのように機能するかについて少し概説し、次に各箇条書きについて詳しく説明します。

N:N MySQLでは通常、ユーザーとインタレストを関連付けるピボットテーブル(user_interestsテーブル)があります。mongoでは、これを少し異なる方法で行います。まだユーザーとインタレストコレクションがありますが、代わりに、ユーザーのインタレストの下にキーのリストを保存します。だからこのようなもの:

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

インタレストテーブルにキーオフされているリストにインタレストを保存することにより、必要な各アクションを実行できます。クエリを実行する場合は、インタレストテーブルにあるIDに基づいてクエリを実行し、 $in修飾子を使用してクエリを実行します。

今あなたの興味のコレクションのために私は次のことをします:

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

ユーザードキュメントにインタレストを追加する場合、カウント変数は評価の定義に依存します。評価を別の領域(またはロジック)に保存している場合、それらに割り当てた値は、対象のint値に関連する値になります。IE:ユーザーはそれをmeh(値は1)と評価し、カウント値に1を追加します。

うまくいけば、これが役に立ち、少なくともそれを構築する方法について他のいくつかのアイデアをもたらしました!

幸運を祈ります。MONGOは素晴らしいことを忘れないでください。

于 2011-11-30T18:28:13.617 に答える
1

各関心の評価のグローバルカウントを維持するには、関心の好き嫌いアクションがユーザーによって実行されたときに、アトミック更新演算子を使用して評価を更新(加算または減算)する個別の独立したコレクションが必要になります。

各ユーザーの関心を、ユーザーコレクション自体の中にサブドキュメントの配列として保存できます。

このデータのJSON構造は、次のようになります。

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

これで、次を使用して内部キーを照会できます。

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

これにより、特に関心のあるユーザーが返されます。

于 2011-11-30T18:26:59.480 に答える