54

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

4

4 に答える 4

46

簡単な答え:いいえ。

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

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

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

UserTable

  • hash_keyuser_id
  • e-mail
  • ..。

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

EmailUser

  • hash_key: Eメール
  • user_id

電子メールが一意であることを確認するには、前にGetItemtoを発行しEmailUserます。

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

于 2012-10-16T18:50:46.473 に答える
5

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

于 2020-01-10T11:26:42.847 に答える
4

下記のアプローチが議論されているかどうかは思わないので、関連するリンクを投稿して、一意の電子メール(またはその他の属性)を確保してください。これには、別のテーブルを作成する必要はありませんが、主キー列のユーザーテーブルにアイテムを追加する必要があります。

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

于 2019-10-17T09:36:23.920 に答える
2

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

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

最初にuserIdアトミックカウンターから新しい値を取得し、次にそれをuserId値として配置します。完全にシーケンシャルではないかもしれませんが、この意味での一意性を保証できます。

于 2019-07-07T16:49:24.773 に答える