【问题标题】:Dynamo DB Data modelDynamodb 数据模型
【发布时间】:2016-02-16 13:06:23
【问题描述】:

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

唯一ID | 时间戳 | 类型 | 内容 | 标记

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

uniqueID 是系统生成的 ID。
TimeStamp 是填充表格时的系统时间。
不同类型的数量将小于 10。
标志:真/假

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

  1. 将 uniqueID 作为表的分区键,并分别创建全局二级索引作为标志和时间戳、分区和排序键。现在我可以使用哈希作为标志查询全局二级索引,并在时间戳上获取排序项目。
    但这里的问题是,由于 flag 的值将只有 true 和 false,并且 flag 设置为 false 的行数与 true 相比相对较少,因此只有 2 个分区。这会失去 DynamoDB 的所有扩展特性。

  2. 另一种选择是将 Type 作为分区键,将 TimeStamp 作为全局二级索引的排序键。这个更好。但是在查询时,我无法选择所有类型的 Type,因为 DynamoDB 需要 Query 参数中的 Hash 键。所以我需要多次查询这个GSI来获取所有类型的Type hash key的数据。

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

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

您能否建议任何其他更好的方法。

提前致谢!

【问题讨论】:

    标签: database database-design amazon-dynamodb data-modeling


    【解决方案1】:

    任何基于 flag 或 TypeOfInfo 的分区键都是错误的,因为可能的值很少(分别为 2 和 10),并且您的数据进入分区的方式会出现偏差。您需要使用能够提供良好分布的东西,在您的情况下,表的分区键的基本候选者是 uniqueId。

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

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

    综上所述,我认为您可以在 GSI 和扫描之间进行选择:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-27
      • 2016-11-07
      • 2019-11-06
      • 2018-07-27
      • 2020-02-20
      • 2015-11-05
      • 2020-07-03
      • 1970-01-01
      相关资源
      最近更新 更多