1

次のような状況でデータベースのパフォーマンスを向上させるためのヒントを探しています。(または、DBの再設計について考える必要があるかもしれません)。

私は50以上の異なるビデオスロットを備えたビデオスロットソーシャルアプリケーションを持っています。問題は、ユーザーがスピンするたびに、スロット情報をDBに保存する必要があることです。

現在、私は次のDB構造を持っています。1つのコレクションにユーザープロファイルがあり、スロット配列に多数のスロットサブドキュメントがあります。

{
  _id: 1,
  firstName: John,
  lastName: Smoth,
  money: 1000,
  aLotOfOtherUserInfo: true,

  slots:
  [
    {
      slotId: 1,
      bet: 1,
      lines: 25,
      payout: 100,
      reels: [...]
      winnings: [...]
      freeSpins: [...]
    }
  ]
}

ユーザーがスロットをスピンするたびに、スロット配列のスロット情報を完全に更新する必要があります。スロットはslotIdによって検出されます。

update(
  { 
    "_id": 1, 
    "slots.slotId": 1
  },
  { 
    $set: {"slots.$": 
    {
      "slotId":1,
      aLotOfUpdatedSlotInfo: true
    }}
  }
)
  • 必要なスロット検索を改善するために、「slots.slotId」にインデックスを作成する必要がありますか?
  • または、DBの再設計を検討し、各ユーザースロットを別々のコレクションに保存する必要がありますか?ただし、たとえば、ユーザーログイン時に、すべてのコレクションを循環して、現在のユーザーのすべてのスロット情報をロードする必要があります。したがって、これは、ユーザーのログインごとに50以上のクエリを実行するのに適したオプションではないと思います。

助けていただければ幸いです。私はNoSQLを初めて使用しますが、NoSQLの方法で考えるのが難しい場合があります。前もって感謝します

4

1 に答える 1

1

スロットデータが「ユーザースピン」ごとに常に無効になり、毎回完全に設定する必要がある場合は、ユーザードキュメントにある場合はおそらく問題なく機能します。ユーザードキュメントから「slots」ID参照を検索してから、「slots」ドキュメントを更新する必要があるというクエリを保存します。

slots.slotIdはい、実際のクエリに一致するように、インデックスだけでなく、そのインデックスと_idにも必ずインデックスを付ける必要があります。

db.user_profile.ensureIndex({_id:1, "slots.slotId":1})

これにより、ドキュメントをすぐに検索でき、スロット配列の値全体を設定するのも非常に簡単になります。

于 2012-04-11T10:17:17.573 に答える