我有一个小问题需要一些建议:
每张桌子的最新条目应该可以快速获得,并且最有可能被查询最多 (有点像“实时跟踪数据”)。由于缺少'Last()'或类似,我正在考虑创建另一个表“LatestValues”,其中更新每个数据表的最新条目以便更快地检索。但是,这会为每个写操作添加额外的更新。此外,大部分流量都集中在这张桌子上(好/坏?)。有没有更好的解决方案,或者我错过了什么?
另外,假设我们要查询数据表中的值。由于扫描显然是不可能的,因此通过复制数据创建二级索引是唯一的选择,有效地使存储要求和写入操作量增加一倍?还有其他解决方案吗?
我主要关注的是DynamoDB和Azure Table Storage,但我也很好奇BigTable如何处理这个问题。
答案 0 :(得分:33)
我今天刚刚发表了一篇文章,其中包含一些common "recipes" about DynamoDB。其中一个是“存储文章修订,总是最新的”我认为它可能会让你感兴趣:)
简而言之,您可以使用Query(hash_key=..., ScanIndexForward=True, limit=1)
但是,这假设你有一个range_key_defined。
使用Scan
,您没有ScanIndexForward=false
这样的参数,无论如何,当数据分布在分区上时,您无法依赖订单,然后Scan
请求会进行负载平衡。
为了实现DynamoDB的目标,您可以通过这种方式“分割”您的时间戳:
hash_key
:date range_key
:时间或完整时间戳,视情况而定然后,您可以使用Query
+ Limit=1
+ ScanIndexForward=false
答案 1 :(得分:0)
一般情况下,您可能只想反转时间戳,因此它会随着时间的推移而减少,将最新的行留在最顶层。
以下是我的博客文章,概述了如何使用Windows Azure存储执行此操作:http://blog.smarx.com/posts/using-numbers-as-keys-in-windows-azure。
<强>更新强>
我将DynamoDB用于一个项目,但是以非常简单的方式,所以我没有太多经验。也就是说,http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html向我建议您可以指定ScanIndexForward=false
和Limit=1
来获取最后一项。
答案 2 :(得分:0)
对于发现了该线程但只关心1张桌子的人们:
您可以通过单击列对这些值进行排序来从UI的表中获取最新的项目。