0

X と Y の 2 つのパラメータを持つリクエストを受け取るアプリケーションがあるとします。これらのリクエストをカウントするだけで、タスクに MongoDB を使用したいと考えています。

その情報を MongoDB に格納するには、次の 2 つの方法が考えられます。

1. X と Y の組み合わせごとにドキュメントを用意する:

{
  _id : "X+Y",
  count : 34
}

2. Y を X に埋め込みます。つまり、各 X には、その X に関するすべての要求をまとめたドキュメントがあります。

{
  _id : "X",
  total_count : 47,
  y: {
      "Y1" : 34,
      "Y2" : 13
   }
}

これらの各方法の長所と短所は何ですか?
1 つの方法がベスト プラクティスと見なされますか? 私が見逃している別の正当な方法はありますか?これはよくあるジレンマですか?

MongoDB の手動データ モデリングセクションと、この問題について説明している FAQを読んでいますが、満足できませんでした。

ありがとう

アップデート

私のアプリケーションは 1 日に約 5,000 万件のリクエストを処理すると予想されますが、各リクエストにはいくつかの属性 (X や Y など) が含まれますが、その量は比較的少量 (4 ~ 5) であり、各リクエストは (挿入によって) カウントする必要があります。または更新します)。
このデータは約 1 時間ごとにクエリされ、クエリは集計を使用することが期待されます。これらのクエリは通常、過去数日 (最大 1 週間) のデータをクエリします。

4

2 に答える 2

0

このような抽象的なドキュメントがあるとアドバイスが難しくなりますが、説明のないキー (またはキーとしての値) を使用することは避けてください。ドキュメントの実際の例と、使用する必要があると思われるクエリ (挿入、更新、検索) を使用して質問を更新してください。これらは、適切なスキーマを設計するために使用できる唯一の基準です。

于 2013-08-01T16:54:52.820 に答える
0

X でグループ化された合計数を取得する必要がある可能性があると思われる場合は、2 番目の方法を使用してください。さらに、Y でグループ化する必要がある場合は、データを非正規化し、Y に埋め込まれた X とともに Y に埋め込まれた X を格納することは悪い習慣ではありません。これは、集計によるmongoのパフォーマンスが低いためです。

どのタイプの集約も必要ないことが確実な場合は、読み取り/書き込みが高速で、ディスク容量の使用量が少ないという点で、最初の方法の方が適しています。

または、よくわからない場合は、次のように保存してください{x: "X", y: "Y", count: 42}。そのためのインデックスを必ず作成し{x: 1, y: 1}てください。このようにして、「X」または「Y」ですべてのドキュメントを取得するオプションを引き続き使用できます。インデックスがあるということは、「X」でクエリを実行するためにインデックス{x: 1, y: 1}を作成する必要がなく、「Y」でクエリを実行するためだけに作成する必要があることに注意してください。{x: 1}{y: 1}

于 2013-08-01T16:26:44.233 に答える