提问者:小点点

发电机数据库数据模型


我正在设计一个 DynamoDB 表,我有以下属性:

唯一标识 |时间戳|类型 |内容|旗

我需要根据将标志设置为 true 的时间戳获取所有行的排序列表。

唯一 ID 是系统生成的 ID。
时间戳是填充表时的系统时间。
非重复类型的数量将小于 10。
标志:真/假

我可以想到以下 3 种方法:

>

  • 使唯一 ID 作为表的分区键,并创建全局二级索引作为标志

    另一种方法是将类型作为分区键,将时间戳作为全局二级索引的排序键。这样更好。但是在查询时,我无法选择所有类型的类型,因为 DynamoDB 需要查询参数中的哈希键。因此,我需要多次查询此 GSI 以获取所有类型的类型哈希键的数据。

    扫描表(扫描操作):扫描返回所有标志设置为 true 的数据,无需哈希键,但它不会在创建时间时给我排序结果。

    在分析了用例之后,我认为方法 1 是目前最好的。

    您能否提出比这更好的其他方法。

    提前感谢!


  • 共1个答案

    匿名用户

    任何基于标志或 TypeOfInfo 的分区键都是坏的,因为只有几个可能的值(分别为 2 和 10),并且数据进入分区的方式将出现偏差。您需要使用提供良好分布的东西,在您的情况下,表的分区键的基本候选项是 uniqueId。

    问题是,当你想得到基于标志的结果时,特别是当标志为真时,你会得到很多记录,可能是绝大多数。因此,如果您需要取回大多数记录,DynamoDB 的扩展无论如何都不会给您带来太多好处。

    您可以尝试创建 GSI,其中标志作为分区键,时间戳作为范围键。这不是一组理想的密钥,但涵盖了您需要的内容。拥有良好的表格键意味着您以后可以轻松切换到另一种解决方案(例如扫描而不使用 GSI)。请记住,如果要避免在使用 GSI 时查询表,则必须将要返回的属性投影到 GSI 中。

    所以总结一下,我认为您可以在GSI和扫描之间进行选择:

    • 扫描速度可能较慢(测试),但不需要额外的数据存储
    • GSI可以更快(测试它),但需要额外的数据存储。