いくつかの提案を必要とする小さな問題があります:
各テーブルの最新のエントリはすぐに取得できるはずであり、最も照会される可能性が最も高くなります(「リアルタイムでデータを追跡する」など)。 'Last()'やそれに類するものがないため、各データテーブルの最新のエントリを更新してより高速に取得できる別のテーブル "LatestValues"を作成することを考えていました。ただし、これにより、書き込み操作ごとに更新が追加されます。また、ほとんどのトラフィックはこのテーブルに集中します(良い/悪い?)。これのより良い解決策はありますか、それとも何か不足していますか?
また、データテーブルの値をクエリしたいとします。スキャンは明らかに問題外なので、データを複製してストレージの要件と書き込み操作の量を効果的に倍増させることによってセカンダリインデックスを作成する唯一のオプションはありますか?他の解決策はありますか?
私は主にDynamoDBとAzure Table Storageを調べていますが、BigTableがこれをどのように処理するかにも興味があります。
今日、いくつかの DynamoDBに関する一般的な「レシピ」 を含む記事を本日公開しました。それらの1つは「記事のリビジョンを保存し、常に最新の状態にする」です。
簡単に言えば、Query(hash_key=..., ScanIndexForward=True, limit=1)
を使用して最新のアイテムを取得できます
ただし、これはrange_key_definedがあることを前提としています。
Scan
を使用すると、ScanIndexForward=false
などのパラメーターがなくなり、データがパーティションに分散され、Scan
リクエストが負荷分散されるため、順序に依存できなくなります。
DynamoDBで目標を達成するには、次のようにタイムスタンプを「分割」します。
hash_key
:日付range_key
:必要に応じて、時間または完全なタイムスタンプ次に、Query
+ Limit=1
+ ScanIndexForward=false
の「トリック」を使用できます
一般的には、タイムスタンプを逆にしたいだけなので、時間とともに減少し、最新の行を上に残します。
これが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
最後のアイテムを取得します。