36

いくつかの提案が必要な小さな問題があります。

  • それぞれ数千万行の数百のデータ テーブルがあるとします。
  • データ テーブルはタイムスタンプ(キー) - 値です
  • データ テーブルは 1 秒ごとに書き込まれます

各テーブルの最新のエントリはすぐに取得できる必要があり、おそらく最もクエリが実行される可能性があります (「リアルタイムでデータを追跡する」ようなものです)。「Last()」などがないため、取得を高速化するために各データ テーブルの最新のエントリが更新される別のテーブル「LatestValues」を作成することを考えていました。ただし、これにより、書き込み操作ごとに余分な更新が追加されます。また、ほとんどのトラフィックはこのテーブルに集中します (良いか悪いか?)。これに対するより良い解決策はありますか、それとも何か不足していますか?

また、データ テーブルの値をクエリしたいとします。スキャンは明らかに問題外なので、データを複製することによってセカンダリ インデックスを作成し、ストレージ要件と書き込み操作の量を効果的に 2 倍にする唯一のオプションが残されていますか? 他の解決策はありますか?

私は主に DynamoDB と Azure Table Storage を見ていますが、BigTable がこれをどのように処理するかにも興味があります。

4

3 に答える 3

56

DynamoDB に関する一般的な「レシピ」を記載した記事を本日公開しました。それらの1つは、「記事のリビジョンを保存し、常に最新のものを入手する」です。興味があるかもしれません:)

一言で言えば、最新のアイテムを使用して取得できますQuery(hash_key=..., ScanIndexForward=True, limit=1)

ただし、これは range_key_defined があることを前提としています。

ではScan、 のようなパラメータはありませんが、とにかく、データが複数のパーティションに分散され、リクエストが負荷分散ScanIndexForward=falseされるため、順序に依存することはできません。Scan

DynamoDB で目標を達成するには、次のようにタイムスタンプを「分割」できます。

  1. hash_key: 日にち
  2. range_key: 時間または完全なタイムスタンプ (好みに応じて)

Query次に、 + Limit=1+ の「トリック」を使用できますScanIndexForward=false

于 2012-10-09T23:03:51.527 に答える
-1

一般に、タイムスタンプを逆にしたいだけなので、時間の経過とともにタイムスタンプが減少し、最新の行が一番上に残ります。

これは、Windows Azureストレージでこれを行う方法の概要を説明した私のブログ投稿です:http://blog.smarx.com/posts/using-numbers-as-keys-in-windows-azure

アップデート

私は1つのプロジェクトにDynamoDBを使用していますが、非常に単純な方法であるため、あまり経験がありません。そうは言っても、http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.htmlは、最後のアイテムを指定ScanIndexForward=falseして取得するだけでよいことを私に示唆しています。Limit=1

于 2012-10-09T22:47:59.133 に答える