1

私は成長し、(潜在的に)時間とともに改訂される時系列を持っています:

on "2013-01-01": データの最初のバージョン

"2013-01-01" 10

on "2013-01-02": 1 月 1 日のデータを 10 から 11 に修正

"2013-01-01" 11

on "2013-02-01": 2 月 1 日のデータの最初のバージョン

"2013 年 1 月 1 日" 11 "2013 年 2 月 1 日
" 20

on "2013-02-02": 2 月 1 日のデータを 20 から 21 に修正

"2013-01-01" 11
"2013-02-01" 21

最も頻繁なクエリ:

query1: すべての日付の最新バージョンを取得する

"2013-01-01" 11
"2013-02-01" 21

query2: 特定の日付で既知の時系列を取得します。

たとえば、"2013-02-01" でクエリを実行すると、
"2013-01-01" 11
"2013-02-01" 20を取得する必要があります。

query1 は query2 と同じですが、日付 = 現在の日付であることに注意してください

ドキュメントを構造化するのに助けが必要です。私はリレーショナルのバックグラウンドを持っているため、自分の構造が意味するものについて確信が持てません。私は基本的に2つの可能な構造を特定しました.フィードバックや他の構造の提案をいただければ幸いです.

オプション A: 個別のドキュメントの各リビジョン

{
  "id":"1",
  "date":"2013-01-01",
  "version_date":"2013-01-01",
  "value":10
}

{
  "id":"1",
  "date":"2013-01-01",
  "version_date":"2013-01-02",
  "value":11
}

{
  "id":"1",
  "date":"2013-02-01",
  "version_date":"2013-02-01",
  "value":20
}

{
  "id":"1",
  "date":"2013-02-01",
  "version_date":"2013-02-02",
  "value":21
}

オプション B: 1 つのドキュメントに 1 つの日付のすべてのリビジョンが含まれる

{
  "id":"1",
  "date":"2013-01-01",
  "values" : [ 
              { "version_date":"2013-01-01",
                "value":10
              },
              {
                "version_date":"2013-01-02",
                "value":11
              }
}

{
  "id":"1",
  "date":"2013-02-01",
  "values" : [ 
              { "version_date":"2013-02-01",
                "value":20
              },
              {
                "version_date":"2013-02-02",
                "value":21
              }
}

オプション B では、ドキュメントに成長部分があるため、更新クエリを実行するのが少し難しくなる可能性があるという事実も懸念しています。これは、mongodb によって十分にサポートされているか、最適化されているかどうかはわかりません。

編集:クエリ1を高速化するオプションCも検討しています:(ただし、書き込みが少し遅くなる可能性があります)

{
  "id":"1",
  "date":"2013-01-01",
  "values" : [ 
              { "version_date":"2013-01-01",
                "value":10
              },
              {
                "version_date":"2013-01-02",
                "value":11
              }
  "last_value":11
}

{
  "id":"1",
  "date":"2013-02-01",
  "values" : [ 
              { "version_date":"2013-02-01",
                "value":20
              },
              {
                "version_date":"2013-02-02",
                "value":21
              }
  "last_value":21
}
4

3 に答える 3

1

このトピックをカバーする公式ページには、実際には非常に最近のブログ投稿があります : http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-mongodb必要に応じて追加の質問をしてください。

于 2013-11-01T18:25:16.743 に答える
1

このようなすべての質問と同様に、これに答えることができるのはあなただけです。データがある場合は、実際のクエリを使用して実際のデータでベンチマークを行い、どちらが優れているかを比較してください。データがない場合は、シミュレートしてみてください。

オプション B と C では、ドキュメントあたり 16 Mb の制限に注意する必要があることに注意してください。そのため、多数のバージョンがある場合、制限に達する可能性があります (ただし、16Mb に達するにはバージョンが多すぎる必要があることを理解する必要があります)。また、このようなドキュメントを更新すると、ディスク上で多くの移動が発生する可能性があることに注意してください。

オプション B と C は、特定のドキュメントのすべてのリビジョンを一度に選択する必要がある場合に便利ですが、最も頻繁に使用されるクエリではこれを見つけられませんでした。適切なインデックスを使用すると、オプション A でもこれを実現できることに注意してください。

于 2013-10-31T09:21:45.573 に答える
0

上記のオプションと要件を考慮するとdate、オプション B で述べたように、に基づいて構造を作成するのが最善です。また、dateインデックスが作成されていると便利です。これが適切な最適化されたソリューションであると思われる理由を示すいくつかのシナリオ (簡単な読み取り、更新) は次のとおりです。

  1. 特定の日付のすべてのバージョンを取得します。
  2. 特定の期間 (つまり、2012 年 1 月から 2012 年 2 月までの範囲) のすべてのバージョンを取得します。
  3. 新しいバージョンを挿入するには、$pushを使用するだけです。
  4. $pullを使用した単純なクエリだけで、古いバージョンを削除します。
于 2013-10-31T09:10:18.347 に答える