【问题标题】:DynamoDB: Querying of non-key values with comparisonsDynamoDB:通过比较查询非键值
【发布时间】:2012-12-11 08:05:09
【问题描述】:

假设我们有许多结构化为时间戳(哈希)-值对的数据表,其中值可以是例如温度或其他类型的各种测量数据。

要获取某些值的时间戳,我们可以使用 value(hash) - timestamp(range) 构建二级索引,但是如果我们想通过 GT、LT、BETWEEN 等比较操作查询该值以获取某个范围的时间戳怎么办价值观?

显然,我想避免使用扫描。我想出的唯一方法是使用虚拟哈希键并将值+时间戳放入范围属性,但我猜这有其自身的问题(与扫描相比更好或更差?)。

是否有更好的解决方案,或者完全可以使用 DynamoDB 来完成?

【问题讨论】:

    标签: nosql amazon-dynamodb


    【解决方案1】:

    您需要知道 HASH,然后才能对 RANGE 执行查询。为了解决这个问题,您需要对表进行非规范化,即创建一个键反转的副本。尽管这看起来有点让人头疼,但它是关键价值存储的所有性能优势有时需要的权衡之一。

    这种情况的示例: 两个密钥完全随机,那么你就不走运了。与其将您的 HASH 设置为虚拟值,不如尝试使用每月时间戳,这样您应该始终能够务实地计算出哈希应该是什么。然后,您还可以将范围设置为由连字符分隔的两个值的组合,即时间戳值,然后在非规范化表中值时间戳,这样您应该能够使用比较运算符而不会影响性能.

    【讨论】:

    • 非规范化是我所说的“建立二级索引”。但是,这不允许我查询值,只能获取。如上所述,我曾考虑使用一个通用的哈希键(一个“虚拟”),在范围键中使用值+时间戳进行查询,但我不确定它的性能或它可能存在的其他问题(分区)所以我在这里寻找替代品。非规范化不是问题(至少目前如此)。
    • 如果它们都是完全随机的,那么我认为你不走运。建议:不要将您的 HASH 设置为虚拟值,而是使用每月时间戳,这样您应该始终能够务实地计算出哈希应该是什么。然后,您还可以将范围设置为用连字符分隔的两个值,即时间戳值,然后在非规范化表中值时间戳,这样您应该能够使用 GT、LT、BETWEEN 运算符而没有性能命中。
    • 虽然不太喜欢分割数据,但我想这是我必须做出的权衡。
    猜你喜欢
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多