我正在设计一个 DynamoDB 表,我有以下属性:
唯一标识 |时间戳|类型 |内容|旗
我需要根据将标志设置为 true 的时间戳获取所有行的排序列表。
唯一 ID 是系统生成的 ID。
时间戳是填充表时的系统时间。
非重复类型的数量将小于 10。
标志:真/假
我可以想到以下 3 种方法:
>
使唯一 ID 作为表的分区键,并创建全局二级索引作为标志
另一种方法是将类型作为分区键,将时间戳作为全局二级索引的排序键。这样更好。但是在查询时,我无法选择所有类型的类型,因为 DynamoDB 需要查询参数中的哈希键。因此,我需要多次查询此 GSI 以获取所有类型的类型哈希键的数据。
扫描表(扫描操作):扫描返回所有标志设置为 true 的数据,无需哈希键,但它不会在创建时间时给我排序结果。
在分析了用例之后,我认为方法 1 是目前最好的。
您能否提出比这更好的其他方法。
提前感谢!
任何基于标志或 TypeOfInfo 的分区键都是坏的,因为只有几个可能的值(分别为 2 和 10),并且数据进入分区的方式将出现偏差。您需要使用提供良好分布的东西,在您的情况下,表的分区键的基本候选项是 uniqueId。
问题是,当你想得到基于标志的结果时,特别是当标志为真时,你会得到很多记录,可能是绝大多数。因此,如果您需要取回大多数记录,DynamoDB 的扩展无论如何都不会给您带来太多好处。
您可以尝试创建 GSI,其中标志作为分区键,时间戳作为范围键。这不是一组理想的密钥,但涵盖了您需要的内容。拥有良好的表格键意味着您以后可以轻松切换到另一种解决方案(例如扫描而不使用 GSI)。请记住,如果要避免在使用 GSI 时查询表,则必须将要返回的属性投影到 GSI 中。
所以总结一下,我认为您可以在GSI和扫描之间进行选择: