Dynamodbでは、主キー以外のフィールドに一意性を適用したい場合(ユーザーテーブルがあり、主キーが数値であるユーザーIDであるときにユーザーの一意の電子メールアドレスが必要だった場合など)は、スキャン以外の方法があります電子メールがすでに使用されているかどうかを確認するための表?
短い答え:いいえ。
DynamoDBはkey:valueストアです。いくつかの妥協点があるため、アイテムの迅速な取得/保存に非常に優れています。これは、自分で処理する必要がある制約です。
それでも、実際のモデルによっては、このフィールドをhash_key
として使用するか、range_key
の使用を検討することをお勧めします
これが不可能な場合は、データを非正規化することをお勧めします。あなたは現在次のようなものを持っています:
UserTable
hash_key
:user_id
e-mail
統一性を確保するには、このスキーマを使用して新しいテーブルを追加します。
EmailUser
hash_key
:メールuser_id
電子メールが一意であることを確認するには、前にGetItem
to EmailUser
を発行するだけです。
この種の非正規化は、No-SQLデータベースでは非常に一般的です。
以下のアプローチが議論されているかどうかは分からないので、固有のメール(または他の属性)を確保するために関連リンクを投稿します。これには、別のテーブルを作成する必要はありませんが、主キー列のユーザーテーブルに項目を追加する必要があります。
DynamoDB自体は一意の制約をサポートしていませんが、_atomic counter
_を使用して一意性を確保し、このカウンター値をデータに組み込むことができます。
私の場合、username
とuserId
の両方に重複がないことを確認する必要があります。 username
は私のパーティションキーなので、上書きを防ぐためにattribute_not_exists(username)
を使用しても問題はありません。
userId
の場合、最初にアトミックカウンターから新しい値を取得し、それをユーザーID値として配置します。完全に連続的ではないかもしれませんが、この意味で一意性を保証できます。
他の属性に一意性を強制できるような方法はありませんが、pythonのboto3ライブラリを使用して、クライアントを使用してトランザクションアイテムを実行し、いくつかの複合キーを使用して、エントリを複製し、transact_write_items()を使用してそれらすべてを一度に挿入することができます。これに関するawsによる非常に素晴らしいドキュメントがあります: https://aws.Amazon.com/fr/blogs/database/simulating-Amazon-dynamodb-unique-constraints-using-transactions/