0

DynamoDBでクエリをモデル化する方法に苦労しています。例としてツイッターを使用してみましょう。私が答えたい質問は、私がフォローしている人々のために、最近の20件のツイートを見せてくれることです。

私は3つのDynamoテーブルを持っています:

Users
UserUID - Hash
Handle

Following
UserUID - Hash
FollowingUserUID - Range

Tweets
UserUID - Hash
Tweet
PostedDate - Range

質問に答えるために私がしなければならないステップは何ですか。UserUID1234がフォローしている人々は、最新の20件のツイートを示しています。

私が持っているステップ:

ステップ1:UserUID1234が従うすべての人のリストを取得します。

ステップ2(私が迷子になっている場所):Idのリストについては、最新の20件のツイートを表示します。

IDのリストでハッシュキーをフィルタリングし、制限と場合によっては範囲フィルターも使用する必要があるため、2番目のクエリを構造化する方法がわかりません。そのため、BatchGetItemRequestを使用できないと思います。これは可能ですか、それとも問題を必要以上に難しくしていますか?

4

1 に答える 1

3

ステップ2(私が迷子になっている場所):Idのリストについては、最新の20件のツイートを表示します。

「ORDERBYPostedDate」をクエリすることはできないため、この質問に対する直接の回答はありません。

DynamoDBでこのような複雑なマッピングを効率的に行うための唯一の可能な解決策は、冗長なデータを保存することです。当然のことながら、各友人の最新の20ツイートを取得して、すでに提案したようにWebアプリで並べ替えることができます。しかし、誰かが1000人のユーザーをフォローしているとすると、1人のユーザーのリクエストに対して1000個のクエリが発生します。

したがって、私が思いついた可能な解決策は次のとおりです。

Users
 UserUID - Hash
 Handle

Following
 UserUID - Hash
 FollowingUserUID

FollowedBy
 UserUID - Hash
 FollowedByUserUID

RecentTweetsOfFriends
 UserID - Hash
 PostedDate - Range
 TweetUUID

RecentTweetsOfUser
 UserID - Hash
 PostedDate - Range
 TweetUUID

Tweets
 TweetUUID - Hash
 Tweet
 UserID
 PostedDate

データベースに新しいツイートを追加する手順:

  1. 新しいUUIDを作成して、ツイートをツイートテーブルに書き込みます
  2. 「FollowedBy」テーブルから新しいツイートを送信しているユーザーをフォローしているすべてのユーザーを取得します
  3. テーブル「RecentTweetsOfUser」と「RecentTweetsOfFriends」の新しいツイートをリンクします

このソリューションでは、「Following」テーブルは必要ありませんが、両方向に保存するのがおそらく適切であるため、そのままにしておきました。

于 2012-05-19T10:44:16.523 に答える