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