2015-09-28 1 views
11

私の使用例は次のとおりです。ハッシュ+範囲キーを持つDynamoテーブルがあります。私がテーブルに新しいアイテムを置くとき、私は一意性検査をしたいです。時々、ハッシュが一意であることを保証したい(範囲を無視する)。他の回は、重複ハッシュを許可したいが、ハッシュと範囲の組み合わせが一意であることを保証する。どうすればこれを達成できますか?DynamoDB - ハッシュ(またはハッシュと範囲の組み合わせ)が存在しない場合は、項目を入れます

私はattribute_not_existsで実験しました。それはハッシュ+キーの組み合わせをチェックする第2のケースを処理するようです。ここではPHPのサンプルです:

$client->putItem(array(
    'TableName' => 'test', 
    'Item' => array(
     'hash' => array('S' => 'abcdefg'), 
     'range' => array('S' => 'some other value'), 
     'whatever' => array('N' => 233) 
    ), 
    'ConditionExpression' => 'attribute_not_exists(hash)' 
)); 

奇妙なことに、私がattribute_not_exists(hash)またはattribute_not_exists(range)を使用している場合は関係していないようです。彼らはどちらもまったく同じことをしているようです。これはどのように動作するはずですか?

hashを一意にチェックしたい場合はどうすればいいですか?

+0

さらなる実験はattribute_not_existsは、この奇妙なロジックに従っていることを示しています ' attribute_not_exists(any_attribute_that_exists_in_the_table)は、ハッシュ+レンジの組み合わせがテーブルに存在しない場合はtrueを返し、そうでない場合はfalseを返します。 'attribute_not_exists(attribute_that_does_not_exist_in_the_table)'は常にtrueを返します。セカンダリインデックス(グローバルまたはローカル)は動作に影響しません。 – mrog

答えて

18

できません。 DynamoDBのすべてのアイテムは、hashまたはhash + range(テーブルによって異なります)のいずれかでインデックスされます。単一のハッシュキーに複数の範囲キーを含めることができます。

セイ例えば次のような項目があります。

  1. hash=A,range=1
  2. hash=A,range=2

あなたは2つの可能な結果があります:あなたがアイテムを置くしようとした場合

  1. hash=A,range=3およびattribute_not_exists(hash)であり、 trueが得られます。属性がhashhash=A,range=3の項目はありません。代わりにattribute_not_exists(range)を使用する場合はrangeという属性を持つhash=A,range=3の項目がないので、trueも得られます。

  2. あなたはhash=A,range=1attribute_not_exists(hash)にアイテムを置くしようとした場合、あなたがそこにfalseを取得するには、それがhashという名前の属性を持って存在しているhash=A,range=3アイテムです。代わりにattribute_not_exists(range)を使用する場合は、という属性を持つhash=A,range=3の項目が存在します。このattribute_not_existが効果的にこれらの両方のためにやっている何

項目がチェック存在しないです。深さの


詳細な説明:

  • すべてのアイテムは、あなたがPutItem要求を行っているとhashrange
  • の両方を提供する必要がありhashrangeキー
  • の両方を持っていますhashまたはのいずれかにConditionExpressionattribute_not_existsを指定しています。

キーこれは、2つのいずれかが起こることを意味します

  1. hash + rangeペアがデータベースに存在します。
    • attribute_not_exists(hash)true
    • attribute_not_exists(range)なければならないhash + rangeペアがデータベースに存在しないtrue
  2. なければなりません。
    • attribute_not_exists(hash)false
    • attribute_not_exists(range)は、いずれの場合もfalse

でなければならないしなければならない、あなたは関係なく、あなたがハッシュまたはレンジキーの上に置くかどうかに同じ結果を得ます。あなたは効果的にチェックしていますこのハッシュ+範囲キーを持つアイテムは既に存在します

あなたのテーブルは、ハッシュおよび範囲

'ConditionExpression' => 'attribute_not_exists(ハッシュ)AND attribute_not_exists(範​​囲)' を持っている場合は、使用および操作することができます

+0

私はまだその理由が明らかではない。ハッシュ "123"と範囲 "abc"の項目を挿入すると、attribute_not_exists(hash)は、同じハッシュと範囲を持つ別の項目を挿入できなくなります。しかし、最初の項目と同じハッシュを持っていても、ハッシュ「123」と範囲「xyz」の項目を挿入することはできません。 範囲値が異なる場合でも、重複ハッシュを避けたい場合はどのように処理すればよいですか? – mrog

+0

@mrogこれは 'hash' +' range'テーブルが設計されているためです。単一のハッシュキーには多くの範囲キーを含めることができます。それぞれの 'hash' +' range' **の組み合わせ*は一意でなければなりません。 'hash'と' hash' + 'range'の違いを見るには、[この回答](http://stackoverflow.com/a/27348364/627727)を見てください。 – mkobit

+0

私はハッシュ+レンジキーの概念を理解していますが、それは私の質問には答えません。 'attribute_not_exists(hash)'がハッシュと範囲の両方をチェックするのはなぜですか?ハッシュだけをチェックする条件を記述することも可能ですか?そして、なぜ 'attribute_not_exists(hash)'、 'attribute_not_exists(range)'、 'attribute_not_exists(anything)'もまったく同じことをしますか? – mrog

関連する問題