2017-09-12 51 views
0

batchGetItemを使用してテーブルから1つ以上のアイテムの属性を返そうとしましたが、パーティションキーとレンジキーの組み合わせでのみ動作するようですが、要求された項目はプライマリキーのみで?レンジキーなしでテーブルを作成する唯一の方法はありますか?公式文書1としてdyanmodb batchGetItemとパーティションキーとソートキー

// Adding items 
    $client->putItem(array(
     'TableName' => $table, 
     'Item' => array(
      'id'  => array('S' => '2a49ab04b1534574e578a08b8f9d7441'), 
      'name' => array('S' => 'test1'), 
      'user_name' => array('S' => 'aaa.bbb') 
     ) 
    )); 

    // Adding items 
    $client->putItem(array(
     'TableName' => $table, 
     'Item' => array(
      'id'  => array('S' => '4fd70b72cc21fab4f745a6073326234d'), 
      'name' => array('S' => 'test2'), 
      'user_name' => array('S' => 'aaaa.bbbb'), 
      'user_name1' => array('S' => 'aaaaa.bbbbb') 
     ) 
    )); 

$client->batchGetItem(array(
    "RequestItems" => array(
     $table => array(
      "Keys" => array(
       // hash key 
       array(
        "id" => array('S' => "2a49ab04b1534574e578a08b8f9d7441"), 
       // range key 
        "name" => array('S' => "test1"), 
       ), 
       array(
       // hash key 
        "id" => array('S' => "4fd70b72cc21fab4f745a6073326234d"), 
       // range key 
        "name" => array('S' => "test2"), 
       ), 
      ) 
     ) 
    ) 
)); 

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html

テーブルが複合主キー(パーティションキーとソートキー)を有する場合、 DynamoDBのパーティションキーのハッシュ値を算出します同一の データ配信:パーティションキーに記載されている方法で同じパーティションキー値を物理的に閉じる の項目のうち、すべて を一緒に格納するソートキー値によって編集されます。

Partition Key and Sort Keyを使用する利点は、物理的に同じパーティションキー値を持つすべてのアイテムを保存するのと同じですか?公式ドキュメントを1として

単一の操作が など、多くの100などの項目を含めることができ、データの16メガバイト、まで取得することができます。 応答サイズの制限を超えた場合、テーブルのプロビジョニングされた スループットを超えた場合、または内部処理エラーが発生した場合、BatchGetItemは部分的な結果を返します。

100個以上のアイテムが必要な場合は、どのようにリクエストを処理するのですか?コードからすべての項目をループし、毎回100回リクエストするか、AWS SDK DynamoDB経由で達成する別の方法がありますか?表作成の

例:

$client->createTable(array(
     'TableName' => $table, 
     'AttributeDefinitions' => array(
      array(
       'AttributeName' => 'id', 
       'AttributeType' => 'N'  
      ), 
      array(
       'AttributeName' => 'name', 
       'AttributeType' => 'S' 
      ) 
     ), 
     'KeySchema' => array(
      array(
       'AttributeName' => 'id', 
       'KeyType'  => 'HASH' 
      ), 
      array(
       'AttributeName' => 'name', 
       'KeyType'  => 'RANGE' 
      ) 
     ), 
     'ProvisionedThroughput' => array(
      'ReadCapacityUnits' => 5, 
      'WriteCapacityUnits' => 5 
     ) 
    )); 

おかげ

UPDATE - マークBの答えへの質問:

はいあなたはレンジキーなしでインデックスを作成することができます。範囲キーは、完全にオプションの です。ただし、範囲キーが定義されていても、クエリーに含める場合は、 オプションです。クエリーにハッシュ キーを指定するだけで、範囲キーに基づいて返される になるハッシュキーを持つすべてのアイテムを取得することができます。

ハッシュキーと範囲キーを持つテーブルのクエリでハッシュキーのみを指定すると、範囲キーなしのテーブルのクエリでハッシュキーのみを指定すると以下のエラーが表示されます。 インデックスのない表に注意してください。

An uncaught Exception was encountered 

Type:  Aws\DynamoDb\Exception\DynamoDbException 
Message:  Error executing "BatchGetItem" on "https://dynamodb.eu-central-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://dynamodb.eu-central-1.amazonaws.com` resulted in a `400 Bad Request` response: 
{"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema" (truncated...) 
ValidationException (client): The provided key element does not match the schema - {"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema"} 
Filename: /var/app/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php 

答えて

1

しかし、私は唯一の主 キーによって要求されたアイテムを特定したい場合は?レンジキーなしでテーブルを作成する唯一の方法はありますか?

はい、範囲キーなしでインデックスを作成できます。範囲キーは完全にオプションです。ただし、範囲キーが定義されていても、クエリーに含めることはオプションです。問合せでハッシュ・キーを指定するだけで、ハッシュ・キーを持つすべてのアイテムを取得できます。ハッシュ・キーは、レンジ・キーに基づいて返されます。

パーティションキーと物理的に 近くに一緒に同じパーティションキー値を持つ 店のすべての項目を横に並べ替えるキーを使用しての利点は何ですか?

2つのフィールドが結合されており、一意性が保証されています。範囲/ソートキーは、結果が返される順序も決定します。

100個以上のアイテムが必要な場合は、どのように処理しますか?ドキュメント(強調鉱山)から

単一の操作のために取り出すことができるアイテム属性の最大数も100で、検索されたアイテムの数はによって 拘束されます1 MBのサイズ制限。応答サイズの制限が を超えた場合、または内部処理 が原因で部分的な結果が返された場合、Amazon DynamoDB はUnprocessedKeysの値を返します。 から取得する操作を再試行できます。例えば

あなたが 結果の次のページを取得することができますので、あなたは100個のアイテムを取得するために頼むが、各 個々の項目のサイズは50Kであったとしても、システムは20の項目と 適切なUnprocessedKeys値を返します。 必要に応じて、アプリケーションに独自のロジックが必要です。 結果のページを1つのセットに組み立てますUnprocessedKeysこれ以上存在しなくなるまで

だから、結果のUnprocessedKeys値をチェックして、アプリケーションの要求を作り続ける必要があるだろう。

+0

私はあなたの答えにコメントをしています、私は私の質問を更新します。 – Berlin

+0

@Berlin私は 'BatchGetItem'リクエストの代わりに' Query'を発行する必要があると思います。 –

+0

は 'Query'で動作しますが、私はパフォーマンスのために' BatchGetItem'を使うことを好みます。 – Berlin

1

ご質問いただきありがとうございますので、私は試してみましょう。 (申し訳ありませんが、私はPHPのコードスニペットとの質問に答えることはできません)

私はテーブルからもっとして1つの項目 の属性を返すようにbatchGetItemを使用しようとしましたが、それは パーティション・キーの組み合わせでのみ動作しそうです主キーでのみ要求されたアイテムを と識別したい場合はどうすればよいですか?レンジキーなしで テーブルを作成する唯一の方法はありますか?

BatchGetItemは、複数のGetItem呼び出しと同じです。基本的に、各GetItem呼び出しでゼロまたは1つのアイテムを取得します。 取得するアイテムの一意のキー(主キー)を指定します。あなたのテーブルにPartition Keyだけがあれば、あなたが指定したすべてのもの、そうでなければPartition and Rangeキー。 BatchGetItemバッチGetItemは、1回の要求でDynamoDBを呼び出します。

特定のパーティションキーに対して複数の項目を照会する場合は、Query APIを参照してください。

パーティションキーと物理的に 近くに一緒に同じパーティションキー値を持つ 店のすべての項目を横に並べ替えるキーを使用しての利点は何ですか?

これは、データモデルの一意のキーに大きく依存するため、これは難しい質問です。

心に来ていくつかの利点があります:より小さい、より大きい: 1ソートキーは 2.ソート・キーがより比較操作(すなわちを持っている(昇順または降順で)その属性にデータをソートすることができます、Between、Begins with、など)。 docs

100個以上のアイテムが必要な場合のリクエストの処理方法は?コードからのすべてのアイテムを にループし、毎回100回リクエストするか、または AWS SDK DynamoDB経由で達成する別の方法がありますか?

100個以上のアイテムをリクエストすると、BatchGetItemは、「BatchGetItem呼び出しに必要なアイテムが多すぎます」というメッセージとともにValidationExceptionを返します。必要なアイテムをすべて取得するには、一度に100アイテムをループする必要があります。 16MBのサイズ制限があることに注意してください。つまり、未処理のアイテムがある場合は、「UnprocessedItems」の下のレスポンスに返されます。

DynamoDBが未処理アイテムを返す場合は、それらのアイテムのバッチ処理を再試行する必要があります。ただし、指数バックオフアルゴリズムを使用することを強くお勧めします。バッチ処理を直ちに再試行すると、個々のテーブルのスロットルのために、基本的な読み取りまたは書き込み要求が失敗する可能性があります。指数バックオフを使用してバッチ操作を遅延させると、バッチ内の個々の要求が成功する可能性がさらに高まります。

このdocumentationは、使い方を説明しています。

+0

したがって、 'Partition and Range key'を持つテーブルの場合、' batchGetItem'権利を使用するときに両方を指定する必要がありますか?また、100個以上の項目の場合は、私のPHPコード内の項目をループすることをお勧めしますか? – Berlin

関連する問題