通常、nosql スタイルのデータベースでは、自動インクリメント PK フィールドを使用するのではなく、一意の識別子を提供します。これは通常、GUID を各ユーザー レコードのキーにすることを意味します。
ユーザーの役割に関する限り、これを達成する方法は数多くあり、それぞれに利点と問題があります。
簡単な方法の 1 つは、「ロール」属性をユーザー テーブルに追加し、そのユーザーのロールごとに 1 つのエントリを作成することです。次に、ユーザーを取得すると、1 つのクエリですべてのロールを取得できます。DynamoDB では、属性が複数の値を持つことができるため、1 つの属性がロールごとに 1 つの値を持つことができます。
特定のロールのユーザーにクエリを実行できるようにする必要がある場合 (つまり、「スーパーバイザーであるすべてのユーザーを教えてください」)、DynamoDB でテーブル スキャンを実行することになりますが、これはコストのかかる操作になる可能性があります。ただし、ユーザー数がかなり少なく、この種のルックアップを実行する必要があまりない場合は、アプリケーションでこれでも問題ない可能性があります。
この高価なタイプのルックアップを頻繁に行う必要がある場合は、ロールごとに 1 つのレコードを持ち、ロール レコード内のユーザーの userIds を持つ "RolesWithUsers" のような新しいテーブルを作成する必要があります。ほとんどのアプリケーションでは、このようなことをしないことをお勧めします。これは、特定のユーザーが持つ役割という 1 つの事実を表す 2 つのテーブルがあるためです。そのため、削除または更新は毎回 2 か所で行う必要があります。不可能ではありませんが、アプリケーションが間違ったデータを取得しないようにするには、より多くの警戒とテストが必要です。このアプローチのもう 1 つの欠点は、情報を取得するために 2 つのクエリが必要になることです。これも、レコードの量によっては、テーブル スキャンよりもコストがかかる可能性があります。
この特定のユース ケースに適した別のオプションは、SimpleDb を使用することです。より優れたクエリ機能 (すべての属性がデフォルトでインデックス化されます) を備えており、この場合、多値属性としてロールを持つ単一のテーブルは、DynamoDB よりもはるかに優れたソリューションになります。
お役に立てれば!