NoSQL:从DynamoDB/Azure表存储中获取最新值

NoSQL:从DynamoDB/Azure表存储中获取最新值,nosql,amazon-dynamodb,azure-table-storage,Nosql,Amazon Dynamodb,Azure Table Storage,我有一个小问题需要一些建议: 假设我们有几百个数据表,每个表有几千万行 数据表是时间戳(键)-值 数据表每秒写入一次 每个表的最新条目应该可以很快获得,并且最有可能被查询到 (有点像“实时跟踪数据”)。由于缺少“Last()”或类似的内容,我正在考虑创建另一个表“LatestValues”,其中更新每个数据表的最新条目,以便更快地检索。但是,这将为每个写入操作添加额外的更新。此外,大部分流量将集中在该表上(好/坏?)。是否有更好的解决方案,或者我遗漏了什么 另外,假设我们要查询数据表中的值。

我有一个小问题需要一些建议:

  • 假设我们有几百个数据表,每个表有几千万行
  • 数据表是时间戳(键)-值
  • 数据表每秒写入一次
每个表的最新条目应该可以很快获得,并且最有可能被查询到 (有点像“实时跟踪数据”)。由于缺少“Last()”或类似的内容,我正在考虑创建另一个表“LatestValues”,其中更新每个数据表的最新条目,以便更快地检索。但是,这将为每个写入操作添加额外的更新。此外,大部分流量将集中在该表上(好/坏?)。是否有更好的解决方案,或者我遗漏了什么

另外,假设我们要查询数据表中的值。既然扫描显然是不可能的,那么通过复制数据来创建二级索引的唯一选项是不是可以有效地将存储要求和写入操作量增加一倍?还有其他解决办法吗


我主要关注的是DynamoDB和Azure表存储,但我也很好奇BigTable是如何处理这个问题的。

一般来说,您可能只想反转时间戳,因此它会随着时间的推移而减少,将最新的一行保留在顶部

下面是我的一篇博客文章,概述了如何使用Windows Azure存储实现这一点:

更新


我在一个项目中使用了DynamoDB,但是非常简单,所以我没有太多经验。也就是说,建议您只需指定
ScanIndexForward=false
Limit=1
即可获取最后一项。

我今天刚刚发表了一篇文章,其中包含一些内容。其中之一是“存储文章修订,始终获取最新版本”,我想这可能会引起您的兴趣:)

简而言之,您可以使用
Query(hash_key=…,ScanIndexForward=True,limit=1)获取最新的项目。

但是,这假设您定义了一个范围键

使用
Scan
,您没有像
ScanIndexForward=false
这样的参数,而且无论如何,您不能依赖顺序,因为数据分布在分区上,
Scan
请求随后是负载平衡的

为了使用DynamoDB实现您的目标,您可以通过以下方式“拆分”时间戳:

  • 散列键
    :日期
  • range\u key
    :时间或完整时间戳,根据您的喜好而定

  • 然后,您可以使用
    Query
    +
    Limit=1
    +
    ScanIndexForward=false

    的“技巧”来帮助找到此线程但只关心1个表的人:


    您可以通过单击列按这些值排序,从UI中的表中获取最新项目。

    谢谢您的回答。我没有考虑过这样解决它,尽管我对时间戳的格式有点犹豫,因为它是“数据的一部分”,因此它将被查询,并且应该是用户可以理解的格式。使用此解决方案,我必须重新处理每个时间戳,以反转每个查询的转换。我建议以正常表示形式存储另一个带有时间戳的列。感谢您的回答,您的文章非常有趣。不过,关于ScanIndexForward,我还有一个问题。文档中说:
    指定索引的升序或降序遍历…
    ScanIndexForward是否像GROUP BY一样工作,只是颠倒查询结果的顺序,还是实际按相反的顺序读取range_键,即这需要多少次读取?我担心的是,到一天结束时(假设1次写入/秒),有超过86k个条目,并且在获取最新值时不断地反复检查它们会很昂贵。
    range\u键
    被编入索引,因此它是高效的,使用
    Query
    ,您只需为检索到的结果付费。也就是说,我不知道这是如何在内部实现的。只是提醒一下:在我的情况下,我需要
    ScanIndexForward=False
    而不是
    True
    。默认行为可能在文章撰写后的某个时候发生了变化。读取的文档:如果ScanIndexForward为true,DynamoDB将按范围键按顺序返回结果。这是默认行为。如果ScanIndexForward为false,则DynamoDB将按范围键按降序对结果进行排序,然后将结果返回给客户端。到目前为止,ScanIndexForward似乎已被具有相同含义的BackwardSearch替换。遗憾的是,我找不到任何有关此更改的文档。您在此处的链接似乎已过期。我发现这个页面上可能有相同的内容,只对当前页面的结果进行排序(~100条记录),大概是为了避免扫描整个表。