web-dev-qa-db-ja.com

dynamodbの主キー以外のプロパティ(フィールド)に一意の制約を適用する方法はありますか

Dynamodbでは、主キー以外のフィールドに一意性を適用したい場合(ユーザーテーブルがあり、主キーが数値であるユーザーIDであるときにユーザーの一意の電子メールアドレスが必要だった場合など)は、スキャン以外の方法があります電子メールがすでに使用されているかどうかを確認するための表?

43
Ali

短い答え:いいえ。

DynamoDBはkey:valueストアです。いくつかの妥協点があるため、アイテムの迅速な取得/保存に非常に優れています。これは、自分で処理する必要がある制約です。

それでも、実際のモデルによっては、このフィールドをhash_keyとして使用するか、range_keyの使用を検討することをお勧めします

これが不可能な場合は、データを非正規化することをお勧めします。あなたは現在次のようなものを持っています:

UserTable

  • hash_keyuser_id
  • e-mail
  • ...

統一性を確保するには、このスキーマを使用して新しいテーブルを追加します。

EmailUser

  • hash_key:メール
  • user_id

電子メールが一意であることを確認するには、前にGetItem to EmailUserを発行するだけです。

この種の非正規化は、No-SQLデータベースでは非常に一般的です。

36
yadutaf

以下のアプローチが議論されているかどうかは分からないので、固有のメール(または他の属性)を確保するために関連リンクを投稿します。これには、別のテーブルを作成する必要はありませんが、主キー列のユーザーテーブルに項目を追加する必要があります。

DynamoDBで一意の属性を確保するための代替アプローチ

0
Chintan Pandya

DynamoDB自体は一意の制約をサポートしていませんが、_atomic counter_を使用して一意性を確保し、このカウンター値をデータに組み込むことができます。

私の場合、usernameuserIdの両方に重複がないことを確認する必要があります。 usernameは私のパーティションキーなので、上書きを防ぐためにattribute_not_exists(username)を使用しても問題はありません。

userIdの場合、最初にアトミックカウンターから新しい値を取得し、それをユーザーID値として配置します。完全に連続的ではないかもしれませんが、この意味で一意性を保証できます。

0
MK Yung

他の属性に一意性を強制できるような方法はありませんが、pythonのboto3ライブラリを使用して、クライアントを使用してトランザクションアイテムを実行し、いくつかの複合キーを使用して、エントリを複製し、transact_write_items()を使用してそれらすべてを一度に挿入することができます。これに関するawsによる非常に素晴らしいドキュメントがあります: https://aws.Amazon.com/fr/blogs/database/simulating-Amazon-dynamodb-unique-constraints-using-transactions/

0
Shubham Pandey