给定一个由 id 标识的实体(即用户、设备等),该实体用作表的哈希键,以及一个附加的日期属性(即上次修改、上次登录等)。我希望能够在该表中找到最老的条目。
一个典型的查询是“为我查找修改日期最早的设备”或“为我查找最近登录的用户”。
我无法为这个用例设计一个好的设计——无论是辅助表还是 GSI。
给定一个由 id 标识的实体(即用户、设备等),该实体用作表的哈希键,以及一个附加的日期属性(即上次修改、上次登录等)。我希望能够在该表中找到最老的条目。
一个典型的查询是“为我查找修改日期最早的设备”或“为我查找最近登录的用户”。
我无法为这个用例设计一个好的设计——无论是辅助表还是 GSI。
听起来您有独特的项目(用户、设备等),它们具有可排序的时间组件(上次修改、上次登录等)。您的访问模式包括获取所有项目中最旧的条目。
听起来您有一张可能看起来像这样的表:
用户项目是使用 USER#<user_id> 的分区键定义的,排序键是日期(也可以包括一天中的时间,但我已针对此示例进行了简化)。
如果您尝试跨多个分区进行搜索,则您只能访问该scan
操作,这会使您描述的访问模式变得棘手(而且成本高昂)。让我们尝试不同的方法。
让我们定义一个二级索引 (GSI1),其分区键 (GSI1PK)USERS
和排序键 (GSI1SK) 作为基于时间的属性(updated_at、created_at 等)。该索引如下所示:
让我们从 GSI1 的角度来看同一张表和数据:
现在我有一个带有分区键USERS
和日期排序键的项目集合。由于您要搜索的所有用户数据现在都在单个分区中,因此您可以使用该query
操作来搜索整个USERS
分区。您可以进一步使用排序键对结果ScanIndexForward=False
进行排序(降序,ScanIndexForward=True
升序)。您可以设置Limit=1
查询以获取该集合中最旧(或最新)的项目。
在 DynamoDB 中实现给定访问模式的方法通常有很多。我已经看到了这种用于实现“获取最旧/最新”访问模式的特定模式。