2012-12-10 58 views
1

假设我们有许多数据表,其结构为时间戳(哈希) - 值对,其中值可以是温度或其他类型的各种测量数据。为了得到某些值的时间戳,我们可以用值(散列) - 时间戳(范围)建立一个二级索引,但是如果我们想用像GT,LT,BETWEEN这样的比较操作来查询该值来获得一个时间戳值的范围?DynamoDB:通过比较查询非键值

显然,我想避免使用扫描。我唯一想到的是使用一个虚拟散列键并将值+时间戳放入范围属性中,但我猜测这有它自己的问题(与扫描相比,更好或更差)。

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

回答

0

您需要知道HASH,然后才能在RANGE上执行查询。为了解决这个问题,您需要对表格进行非规范化处理,即使用相反的键创建一个副本。虽然这看起来有点痛苦,但它是时间关键价值商店所有性能优势所需的权衡之一。

这种情况下的示例: 这两个键完全是随机的,那么您运气不好。您可以尝试使用每月的时间戳,而不是将您的HASH设置为虚拟值,这样您应该始终能够务实地制定哈希应该是什么。然后你也可以将范围设置为由连字符(即timestamp-value)分隔的两个值的组合,然后在非规格化表中value-timestamp,这样你就可以在没有性能影响的情况下使用比较运算符。

+0

反规范化就是我所说的“建立二级索引”。但是,这不允许我查询值,只能得到。就像上面所说的,我曾经想过在范围键中使用一个常用的散列键(一个'虚拟'),用于查询的范围键中的值+时间戳,但我不确定它的性能或其它可能存在的问题(分区)我正在寻找替代品。非规范化不是问题(至少现在)。 – user1597701

+0

如果他们都是完全随机的,那么我认为你运气不好。建议:不要将你的HASH设置为虚拟值,而应该使用每月的时间戳,这样你应该总是能够务实地制定哈希应该是什么。您也可以查看将范围设置为用连字符(即timestamp-value)分隔的两个值,然后在非规格化表中value-timestamp,这样您就可以使用GT,LT和BETWEEN运算符而无需执行性能击中。 – greg

+0

虽然不太喜欢不得不细分数据,但我想这是我必须做出的权衡来实现这一点。 – user1597701