我正在为制造执行系统设计一个新的 AppSync 模型,最重要的访问模式之一是“获取给定生产日期间隔内的所有项目”和“获取给定生产日期间隔内位置 X 的所有项目”,更具体地说,对于日历/计划视图(带有日期范围)。
type Project @model {
id: ID!
name: String
items: [Item] @hasMany
}
type Item @model {
id: ID!
ref: String
projectID: ID
location: String
productionDate: AWSDate
}
我一直在尝试不同的复合 pk/sk 键和索引,但我的问题主要依赖于一个项目可以更改其生产日期或位置的高频率,这使得成为 pk 或 sk 变得更加困难(也许我在这里错了?)。
我想到的一个想法是删除该项目并在每次
productionDate
或 location
更改时重写它,这样我就能够将相似的生产日期保留在一起(使用分区键,也包括带有 productionDate < today
的项目)
将难以按预期访问)
有没有办法设计这个模型,让这些访问模式更加高效并避免扫描?
对于上下文,我正在使用 AWS amplify 来实现此原型
在 DynamoDB 中想要根据时间执行请求可能会很棘手。一种方法是使用 GSI,将静态值作为分区键,将日期作为排序键:
GSIPK | GSISK | 数据 |
---|---|---|
1 | 2022-03-05T12:00:000Z | 一些数据 |
1 | 2023-02-06T13:00:000Z | 一些数据 |
1 | 2024-03-07T14:00:000Z | 一些数据 |
1 | 2024-04-08T15:00:000Z | 一些数据 |
现在,当您对 2024 年 1 月以来的所有项目进行查询时:
SELECT * FROM myTable.myGsi WHERE GSIPK=1 AND GSISK BETWEEN '2024-01-01T00:00:000Z' AND '2024-04-10T14:00:000Z'
现在是高效的。此设计有一些注意事项,我在这篇博客文章中详细解释了所有内容。