GROUPS
userID: string
groupID: string
lastActive: number
birthday: number
假设我有一个称为GROUPS的DynamoDB表,该表存储具有这些属性的项目。该表记录了哪些用户加入了哪些组。用户可以同时处于多个组中。因此,复合主键通常是:
partition key: userID
sort key: groupID
但是,如果我想查询特定组中在特定生日范围内(按lastActive
排序的所有用户),是否可以创建索引?< / strong>
我可以合成lastActive
和userID
来创建合成的排序键,如下所示:
GROUPS
groupID: string
lastActiveUserID: string (i.e. "20201230T09:45:59-abc123")
birthday: number
将使用不同的复合主键,其中分区键为groupID
,排序键为lastActiveUserID
,它将按参与者上次活动的时间对其排序,然后按二级索引进行排序按生日过滤?
答案 0 :(得分:1)
按照书面规定,这是不可能的。
在特定的生日范围内
暗示sk_birthday between :start and :end
按lastActive排序
将lastActive表示为排序键。
这是互斥的...我无法设计出能够以可用格式包含两个值的排序键。
您可能有一个全球二级索引,其哈希键为group-id
和lastActive
作为排序键,然后在生日时进行过滤。但是,这只会影响返回的数据,不会影响读取的数据或读取该数据的成本。此外,由于DDB一次仅读取 1MB数据,因此,如果给定组的成员价值超过1MB,则必须循环循环调用它。
此外,当索引具有与表不同的分区(哈希)键时,即为全局二级索引(GSI)。如果您的索引与表具有相同的分区键,但排序键不同,则可以使用本地二级索引(LSI)来完成
但是,对于任何给定的查询,您只能使用表或给定的索引。您不能同时使用多个索引
现在已经这么说了,“特定生日范围” 对您的确切含义是:如果该范围是一个定义的时间段(按月,按周)。也许您可以拥有一个GSI,其中哈希键为"group-id#birthday-period"
,排序键为lastActive
例如,“给我下个月的GROUPA生日”
查询(hs =“ GROUPA#NOVEMBER”)
但是,如果您想要11月和12月,则必须进行两次查询,然后对结果进行合并和排序。
有效和有效地使用DDB意味着避免使用Scan()
并避免使用filterExpressions
,而您知道这些git init
git fetch https://git.xyz.com/myrepo/app.git
会丢弃大量读取的数据。