web-dev-qa-db-ja.com

DynamoDBセカンダリインデックスの一意性

質問:

複合ハッシュ範囲キーである主キーを持つDynamoDBテーブルは一意です。これはセカンダリインデックスにも適用されますか?

例:

post_id主キーとcomment_id範囲キーを持つコメントDynamoDBテーブルがあります。さらに、date-user_id範囲キーを持つローカルセカンダリインデックスがあります。

各エントリは、ユーザーが投稿に残したコメントです。セカンダリインデックスの目的は、特定の日に投稿にコメントを残したユニークユーザーの数をカウントすることです。

エントリ1:post_id:1 comment_id:1 date-user_id:2014_06_24-1

エントリ2:post_id:1 comment_id:2 date-user_id:2014_06_24-1

エントリ:post_id:1 comment_id:3 date-user_id:2014_06_24-2

セカンダリインデックスを指定するクエリを実行し、post_idが1に等しく、date-user_idが2014_06_24-1に等しいという条件を渡すと、カウントが2になり、カウントが1になると予想されます。

セカンダリインデックスに同じプライマリキー/範囲キーを持つ2つのエントリがあるのはなぜですか。

18
user3772393

ローカルセカンダリインデックス(LSI)の各項目は、テーブルの対応する項目と1:1の関係にあります。上記の例では、LSIのエントリ1とエントリ2の範囲キー値は同じですが、それらが指すテーブルの項目は異なります。したがって、インデックスキー(ハッシュまたはハッシュ+範囲)は一意ではありません。

グローバルセカンダリインデックス(GSI)は、この点でLSIに似ています。すべてのGSIアイテムには、(対応するアイテムの)テーブルハッシュキーと範囲キーが含まれています。詳細については、 http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Projections をご覧ください。

3
Vivek Halder

セカンダリインデックスは一意性を保証するものではありません。ドキュメントから:

さらに、グローバルセカンダリインデックスは一意性を強制しないことに注意してください

http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html

25
Mike Hornblade

いいえ、そうではありません。インデックスは非同期で更新されます。つまり、結果整合性があります。つまり、更新呼び出しを行ったときにdynamodbが一意性を強制することはできません(セカンダリインデックスの一意性はチェックされません。これは非同期操作です。非同期操作の場合、リアルタイム呼び出しはすでに終了しているため、失敗を返す方法はありません)。

ちなみに、これは、GSIインデックスに対してスキャンまたはクエリのみを実行でき、GetItemは実行できない理由でもあります(つまり、GetItemは1つのアイテムを返すことが期待されますが、一意性がない場合、特定のセカンダリインデックスに対応するものが多数存在する可能性があります制約)。

10
Sanjay Verma