私はAmazonのAWSとそのJava用APIにかなり慣れていないので、私がやろうとしていることに対して最も効率的な方法が何であるか正確にはわかりません。基本的に、プロジェクトのID、そのステータス、およびユーザーがS3バケットにアップロードしたときのバケットと場所を保存するデータベースをセットアップしようとしています。私が問題を抱えているのは、status属性の下にステータスが「ready」であるすべてのプロジェクトIDのリストを取得することです。ステータスが「準備完了」のプロジェクトは、後で参照できるように、ID番号を配列または配列リストにロードする必要があります。何かお勧めはありますか?
1 に答える
これを行う方法は、スキャンAPIを使用することです。ただし、これは、dynamoがテーブル内のすべてのアイテムを調べて、その属性「status」が「ready」と等しいかどうかを確認する必要があることを意味します。この操作のコストは高く、テーブル内のすべてのアイテムを読み取るために料金がかかります。
コードは次のようになります。
Condition scanFilterCondition = new Condition()
.withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(new AttributeValue().withS("ready"));
Map<String, Condition> conditions = new HashMap<String, Condition>();
conditions.put("status", scanFilterCondition);
ScanRequest scanRequest = new ScanRequest()
.withTableName("MasterProductTable")
.withScanFilter(conditions);
ScanResult result = client.scan(scanRequest);
データを非正規化する必要がありますが、これを改善する方法があります。「status」のハッシュキーと「projectID」の範囲キーを持つ2番目のテーブルを保持してみてください。これは、既存のテーブルに追加されます。これにより、Query API(スキャンのはるかに安価ないとこ)を使用して、ハッシュキーが「ready」のすべてのアイテムを要求できるようになります。これにより、必要なプロジェクトIDのリストが取得され、既存のプロジェクトIDテーブルから取得できます。
このためのコードは次のようになります。
QueryRequest queryRequest = new QueryRequest()
.withTableName("ProductByStatus")
.withHashKeyValue(new AttributeValue().withS("ready"));
QueryResult result = client.query(queryRequest);
このアプローチの欠点は、ステータスフィールドを更新するたびに2つのテーブルを更新する必要があり、それらの同期を維持する必要があることです。Dynamoはトランザクション性を提供しないため、マスタープロジェクトテーブルの更新は成功するが、セカンダリステータステーブルは成功しない場合に備えておく必要があります。またはその逆。
詳細については、http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.htmlをご覧ください。