Dans dynamodb, si vous souhaitez appliquer l'unicité dans un champ autre que la clé primaire (comme si vous aviez une table d'utilisateurs et que vous vouliez des adresses e-mail uniques pour les utilisateurs alors que la clé primaire est un ID utilisateur qui est un nombre), y a-t-il un autre moyen que l'analyse le tableau pour voir si l'e-mail est déjà utilisé?
Réponse courte: Non.
DynamoDB est une clé: magasin de valeur. Il est très bon pour récupérer/enregistrer rapidement des éléments car il fait un couple de compromis. C'est une contrainte que vous devez gérer vous-même.
Nonethess, selon votre modèle actuel, il peut être judicieux d'utiliser ce champ lorsque vous hash_key
ou envisagez d'utiliser un range_key
Si cela n'est pas possible, je vous conseille de dénormaliser vos données. Vous avez actuellement quelque chose comme:
UserTable
hash_key
: user_id
e-mail
Pour garantir l'unicité, ajoutez une nouvelle table avec ce schéma:
EmailUser
hash_key
: emailuser_id
Pour vous assurer qu'un e-mail est unique, il suffit d'émettre un GetItem
à EmailUser
avant.
Ce type de dénormalisation est assez courant avec les bases de données sans SQL.
Je ne pense pas que l'approche mentionnée ci-dessous soit discutée ou non, donc publier le lien pertinent pour garantir un e-mail unique (ou tout autre attribut). Cela ne nécessitera pas la création d'une autre table mais l'ajout d'éléments supplémentaires dans la table Utilisateur dans la colonne de clé primaire.
Approche alternative pour garantir des attributs uniques dans DynamoDB
Le DynamoDB en lui-même ne prend pas en charge les contraintes uniques, mais vous pouvez en quelque sorte garantir l'unicité en utilisant atomic counter
Et incorporer cette valeur de compteur dans vos données.
Dans mon cas, je dois m'assurer que username
et userId
n'ont pas de doublons. username
est ma clé de partition, donc je n'aurai aucun problème à utiliser la attribute_not_exists(username)
pour éviter les écrasements;
Pour userId
je vais d'abord récupérer une nouvelle valeur du compteur atomique puis la mettre comme valeur userId. Il peut ne pas être complètement séquentiel mais il peut garantir l'unicité dans ce sens.
Il n'y a pas de telle manière que vous puissiez imposer l'unicité sur un autre attribut, mais en utilisant la bibliothèque boto3 de python, vous pouvez utiliser le client pour faire un élément de transaction et utiliser une clé composite et essayer de dupliquer votre entrée et insérer tous en une seule fois en utilisant transact_write_items (). Il y a une très belle documentation par aws à ce sujet: https://aws.Amazon.com/fr/blogs/database/simulating-Amazon-dynamodb-unique-constraints-using-transactions/