web-dev-qa-db-fra.com

Existe-t-il un moyen d'appliquer une contrainte unique sur une propriété (champ) autre que la clé primaire dans dynamodb

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é?

43
Ali

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: email
  • user_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.

36
yadutaf

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

0
Chintan Pandya

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.

0
MK Yung

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/

0
Shubham Pandey