Azure表存储 - 有序数据的RowKey设计

时间:2013-03-04 06:26:07

标签: c# azure azure-storage azure-table-storage

我将大量GPS数据存储在存储表中。每个分区最多可以达到100万个实体。插入到表中的每个GPS实体实际上与插入的先前数据相同,因此顺序很重要。

有时我需要执行以下查询:

  

从当前实体(在同一分区内)获取上一个/后续3个GPS实体。

RowKey设计的选项:

  1. 创建递增整数。但是如何跟踪表的当前大小?无法获取表行数或获取最后插入的行。

  2. 使用DateTime Ticks。但是如何使用ticks获取上一个/下一个实体?

  3. 我在C#中使用SDK版本2.0。

1 个答案:

答案 0 :(得分:7)

这是一个非常酷的问题需要解决。

如果您的工作只是在给定条目之后或之前找到相同的条目,这将很简单,因为您可以采用DateTime.Now.Ticks或(DateTime.Max.Ticks - DateTime.Now.Ticks )作为RowKey并在查询中使用“Take”命令来查找最近的X记录。

但是,由于您需要找到位于给定位置ID之后或之前的最近位置,因此我认为这可能适用于您的RowKeys的一种设计模式:

  • 您需要为每个GPS位置保存两个实体。除了行键不同之外,实体的数据应该相同
  • 一个实体的RowKey为:DateTime.UtcNow.Ticks并且前缀为:“A”(升序)
  • 另一个实体的RowKey为:DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks并拥有 前缀字符,说:“D”(降序)

例如,你有7个位置,Location1..thru..Location7我已经给它们从01到99的随机Tick值(为了简单起见)。想象一下MaxTicks是100.这将使我们的表包含以下数据:

Rowkey,实体数据

  • A ---- 01,Location1
  • A ---- 50,Location2
  • A ---- 55,Location3
  • A ---- 66,Location4
  • A ---- 67,Location5
  • A ---- 90,Location6
  • A ---- 99,Location7
  • D ---- 01,Location7
  • D ---- 10,Location6
  • D ---- 33,Location5
  • D ---- 34,Location4
  • D ---- 45,Location3
  • D ---- 50,Location2
  • D ---- 99,Location1

现在,对于每个实体,您可以轻松地计算其“相反”的Rowkey实体。 (只需从DateTime.MaxValue.Ticks中减去RowKey,然后将前缀从A翻转到D或从D翻转到A)

因此,如果您需要位于Location3之前的2个实体,只需发出查询以从RowKey大于“D ---- 45”且小于“D ---- 99”的表中获取2个实体(最大值)。如果你需要在Location3之后占用2行,只需发出一个Take 2,其中RowKey大于“A ---- 55”且小于“A ----- 99”(最大值)。 发出“小于”标准很重要,因此当你查询“A”时,你不会意外地遇到“D”。

在批处理事务中更新/插入两组实体,以保证两者都没有进入表中并“瞧”。

这种方法的缺点是你必须支付两倍的存储空间。

希望这会有所帮助而且不会太混乱

相关问题