web-dev-qa-db-ja.com

NoSQL:テーブルDynamoDB / Azure Table Storageから最新の値を取得する

いくつかの提案を必要とする小さな問題があります:

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

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

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

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

27
user1597701

今日、いくつかの 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の「トリック」を使用できます

38
yadutaf

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

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

[〜#〜]更新[〜#〜]

私は1つのプロジェクトでDynamoDBを使用していますが、非常に単純化した方法であるため、あまり経験がありません。つまり、 http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.htmlScanIndexForward=falseおよびLimit=1最後のアイテムを取得します。

0
user94559