0

我正在努力解决如何在 DynamoDB 中为查询建模。让我们以推特为例,我想回答的问题是,给我关注的人展示最近的 20 条推文。

我有 3 个 Dynamo 表:

Users
UserUID - Hash
Handle

Following
UserUID - Hash
FollowingUserUID - Range

Tweets
UserUID - Hash
Tweet
PostedDate - Range

我需要采取哪些步骤来回答这个问题,因为 UserUID 1234 关注的人显示了 20 条最新的推文。

我有的步骤:

第 1 步:获取 UserUID 1234 关注的所有人的列表。

第 2 步(我迷路的地方):对于该 ID 列表,向我显示 20 条最近的推文。

我不确定如何构造第二个查询,因为我需要过滤 Id 列表上的哈希键,并使用限制和可能的范围过滤器。因此,我认为我不能使用 BatchGetItemRequest。这是可能的还是我让问题变得比需要的更难?

4

1 回答 1

3

第 2 步(我迷路的地方):对于该 ID 列表,向我显示 20 条最近的推文。

这个问题没有直接的答案,因为我们不能只查询“ORDER BY PostedDate”

在 DynamoDB 中有效地进行如此复杂的映射的唯一可能解决方案是存储冗余数据。当然,您可以只获取每个朋友的最新 20 条推文,然后像您已经提议的那样在您的 web 应用程序中对其进行排序。但是猜想有人关注了 1000 个用户,这将导致对一个用户请求进行 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 将推文写入 Tweets 表
  2. 从“FollowedBy”表中获取所有关注提交新推文的用户的用户
  3. 在“RecentTweetsOfUser”和“RecentTweetsOfFriends”表中链接新推文

对于这个解决方案,您不需要“Following”表,但我把它留在了那里,因为将它保存在两个方向可能很整洁。

于 2012-05-19T10:44:16.523 回答