DynamoDB - Mis point si hachage (ou du haschisch et de la gamme de combinaison) n'existe pas
Voici mon cas d'utilisation: j'ai une Dynamo tableau avec une valeur de hachage + touche range. Quand j'ai mis de nouveaux éléments dans le tableau, je veux faire un contrôle d'unicité. Parfois, j'ai envie de garantir que le hachage est unique (en ignorant la gamme). D'autres fois je veux permettre à double hache, mais de garantir que le hachage et la gamme de combinaison est unique. Comment puis-je y arriver?
J'ai expérimenté avec attribute_not_exists. Il semble gérer le deuxième cas, où il vérifie le hash + combinaison de touches. Voici un PHP, exemple:
$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)'
));
Curieusement, il ne semble pas à la matière si j'utilise attribute_not_exists(hash)
ou attribute_not_exists(range)
. Ils semblent tous deux à faire exactement la même chose. Est-ce la façon dont il est censé fonctionner?
Aucune idée de comment gérer le cas où je ne veux vérifier hash
pour l'unicité?
- Poursuite de l'expérimentation montre que attribute_not_exists suit cette étrange logique:
attribute_not_exists(any_attribute_that_exists_in_the_table)
retourne true si la valeur de hachage + gamme de combinaison n'existe pas dans la table, sinon elle retourne false.attribute_not_exists(attribute_that_does_not_exist_in_the_table)
retourne toujours true. Les index secondaires (global ou local) n'affectent pas le comportement.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas. Tous les éléments de DynamoDB sont indexés par leur
hash
ouhash
+range
(selon votre table).Une sorte de résumé de ce qui se passe jusqu'à présent:
hash
et unrange
cléPutItem
demande et doit fournir à la fois lehash
etrange
ConditionExpression
avecattribute_not_exists
sur lehash
ourange
nom de l'attributattribute_not_exists
condition est simplement de vérifier si un attribut de même nom existe, il ne se soucie pas de la valeurPrenons un exemple. Commençons avec un
hash
+range
table de clés avec ces données:hash=A,range=1
hash=A,range=2
Il y a quatre cas possibles:
Si vous essayez de mettre un point avec
hash=A,range=3
etattribute_not_exists(hash)
, lePutItem
réussirons, carattribute_not_exists(hash)
évalue àtrue
. Aucun élément n'existe avec les principauxhash=A,range=3
qui répond à la condition deattribute_not_exists(hash)
.Si vous essayez de mettre un point avec
hash=A,range=3
etattribute_not_exists(range)
, lePutItem
réussirons, carattribute_not_exists(range)
évalue àtrue
. Aucun élément n'existe avec les principauxhash=A,range=3
qui répond à la condition deattribute_not_exists(range)
.Si vous essayez de mettre un point avec
hash=A,range=1
etattribute_not_exists(hash)
, lePutItem
va échouer, carattribute_not_exists(hash)
évalue àfalse
. Un élément existe avec les principauxhash=A,range=1
qui ne satisfont pas à la condition deattribute_not_exists(hash)
.Si vous essayez de mettre un point avec
hash=A,range=1
etattribute_not_exists(range)
, lePutItem
va échouer, carattribute_not_exists(range)
évalue àfalse
. Un élément existe avec les principauxhash=A,range=1
qui ne satisfont pas à la condition deattribute_not_exists(range)
.Cela signifie que l'une des deux choses vont se produire:
hash
+range
paire existe dans la base de données.attribute_not_exists(hash)
doit êtretrue
attribute_not_exists(range)
doit êtretrue
hash
+range
paire n'existe pas dans la base de données.attribute_not_exists(hash)
doit êtrefalse
attribute_not_exists(range)
doit êtrefalse
Dans les deux cas, vous obtenez le même résultat que si vous le mettez sur la table de hachage ou de la portée de la clé. Le
hash
+range
clé identifie un élément unique dans l'ensemble de la table, et que votre état est évalué sur ce point.Vous sont effectivement à l'exécution d'une "cet élément si un article avec ce
hash
+range
clé n'existe pas déjà".attribute_not_exists(hash)
va m'empêcher de l'insertion d'un autre élément avec le même hachage et de la plage. Mais cela ne m'empêche pas de l'insertion d'un objet avec de hachage "123" et la gamme "xyz", même si elle a le même hash que le premier élément. Comment dois-je gérer le cas où je veux éviter la double hache, même si les valeurs sont différentes?hash
+range
tableaux sont conçus. Une seule clé de hachage peut avoir de nombreux gamme de clés. Chaquehash
+range
*combinaison doit être unique. Jetez un oeil à cette réponse pour voir la différence entrehash
ethash
+range
.attribute_not_exists(hash)
de vérifier le hachage et la gamme? Est-il même possible d'écrire une condition qui vérifie juste la table de hachage? Et pourquoi neattribute_not_exists(hash)
,attribute_not_exists(range)
, etattribute_not_exists(whatever)
tous faire exactement la même chose?attribute_not_exists()
, il n'aura pas un impact sur le résultat. UnPutItem
efficacement opère sur un seul élément dans DynamoDB. L'expression de condition est évalué par rapport à l'élément à la valeur de hachage+gamme combo, pas contre d'autres éléments. Vous pouvez être en mesure d'accomplir la question de l'objectif, aujourd'hui, à l'aide de DynamoDB transactions, mais je n'ai pas essayé encore.Vous pouvez l'utiliser ET le fonctionnement si votre table de hachage et de la gamme
'ConditionExpression' => 'attribute_not_exists(hash) ET attribute_not_exists(range)'
Cette version de l'explication prises de amazon aws forum dit que la recherche va chercher un élément qui correspond à une condition clé de hachage, puis vérifie seulement si l'attribut existe dans ce dossier. Il doit fonctionne de la même façon si vous avez une table de hachage et une gamme de clés, je suppose.
Prudent avec mots clés réservés.
attribute_not_exists
ne fonctionnera pas comme prévu si le nom de l'attribut correspond à un mot de la liste réservée.hash
etrange
sont à la fois réservé et nécessitent donc la nécessité de travail autour de cette question en utilisantExpressionAttributeNames
.L'exemple suivant permet de dupliquer des clés de partition et échoue uniquement si il y a déjà un Élément dans la Table avec la partition ET de la clé de tri.
Et celle-ci serait assurez-vous que la clé de partition nommée
hash
est unique.