0

给定一个由 id 标识的实体(即用户、设备等),该实体用作表的哈希键,以及一个附加的日期属性(即上次修改、上次登录等)。我希望能够在该表中找到最老的条目。

一个典型的查询是“为我查找修改日期最早的设备”或“为我查找最近登录的用户”。

我无法为这个用例设计一个好的设计——无论是辅助表还是 GSI。

4

1 回答 1

1

听起来您有独特的项目(用户、设备等),它们具有可排序的时间组件(上次修改、上次登录等)。您的访问模式包括获取所有项目中最旧的条目。

听起来您有一张可能看起来像这样的表:

用户项目

用户项目是使用 USER#<user_id> 的分区键定义的,排序键是日期(也可以包括一天中的时间,但我已针对此示例进行了简化)。

如果您尝试跨多个分区进行搜索,则您只能访问该scan操作,这会使您描述的访问模式变得棘手(而且成本高昂)。让我们尝试不同的方法。

让我们定义一个二级索引 (GSI1),其分区键 (GSI1PK)USERS和排序键 (GSI1SK) 作为基于时间的属性(updated_at、created_at 等)。该索引如下所示:

具有 GSI1 的用户项

让我们从 GSI1 的角度来看同一张表和数据:

用户项目集合

现在我有一个带有分区键USERS和日期排序键的项目集合。由于您要搜索的所有用户数据现在都在单个分区中,因此您可以使用该query操作来搜索整个USERS分区。您可以进一步使用排序键对结果ScanIndexForward=False进行排序(降序,ScanIndexForward=True升序)。您可以设置Limit=1查询以获取该集合中最旧(或最新)的项目。

在 DynamoDB 中实现给定访问模式的方法通常有很多。我已经看到了这种用于实现“获取最旧/最新”访问模式的特定模式。

于 2020-09-08T17:00:15.283 回答