4

必要なクエリを処理できるように、DynamoDB テーブルをモデル化する方法について、具体的な質問があります。

私のアプリケーションは、「イベント」のアイデアを中心にしています。すべてのイベントには属性 (名前、場所、時間、参加者数など) があります。イベントは、それらが配置されている都市に関連付けられています。get / query リクエスト (おそらく一連の get / query リクエスト) を実行して、特定の都市の参加者が最も多い上位 25 のイベントを取得する方法を見つけようとしています。

私はリレーショナル データベースのバックグラウンドを持っており、これは非常に単純なクエリになります (select * from events where city = x order by出席者制限 25)。しかし、非リレーショナル データベースで同じことを行う方法を理解するのに苦労しています。ハッシュのマッピングを保存するために追加のテーブルを作成する必要があることはわかっていますが、それを理解できないようです。

私がそれを実装することを考えた1つの方法は、どういうわけか「出席者」(Number型の)を範囲キーにし、都市をハッシュキーにすることです。ただし、これは必ずしも一意のキーではありません。これは、同じ都市の複数のイベントに同じ数の参加者がいる可能性があるためです。また、範囲キーを「更新/アトミックにインクリメント」することさえ可能ですか?

ご助力いただきありがとうございます!

4

1 に答える 1

1

注: これらのクエリには RDBMS の方が適していると思いますが、次のようになります。

まず、属性をアトミックにインクリメントすることしかできません。
あなたのシナリオでは、次のことをお勧めします。

Table: Events
hk: eventId
attributes

Table: Top_Attendees_Per_City
hk: city
rk: eventId

Table: Event_Id_Generator
hk: event_counter
running_counter

Table: Minimum_Attendees_Per_City
hk: city
min_attendees_number, max_attendees_number, events_number

イベントがバックエンドで発生したら、それに実行中の ID を割り当てる必要があります。これは必須ではなく、スケーリングに問題がありますが、イベントに同じ数の参加者がいる場合、新しいイベントが「上位 25 位」で優先されることが保証されます。
「25」までイベントを数えながら、出席者の数が最小と最大の間にあるかどうかを確認する必要があります。これにより、mimimum_attendees_per_city は、この新しいイベントがトップ 25 に表示されるかどうかを決定できます。そうであれば、それを top_attendees_per_city に追加します。
最後に、setScanIndexForward(false) と setLimit(25) を使用してそのテーブルをクエリします。
その結果、出席者数が最も多い 25 のイベントが得られました。最終的な注意: 結果の項目は出席者によって注文されません。戻る前にアプリケーション レベルで注文できます。

于 2012-06-06T08:10:42.683 に答える