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

本文关键字:数据 RowKey 序数 存储 Azure | 更新日期: 2023-09-27 18:02:16

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

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

从当前实体(在同一分区内)获取前一个/下一个3个GPS实体

RowKey设计选项:

  1. 创建一个递增的整数。但是我如何跟踪表的当前大小?

  2. 无法获取表行数,也无法获取最后插入的行。
  3. 使用DateTime Ticks。但是如何使用tick获得上一个/下一个实体?

我在c#中使用SDK 2.0版本。

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

这是一个非常酷的问题。

如果您的任务是只查找给定条目之后或之前的条目,这将是简单的,因为您可以只取DateTime.Now.Ticks或(DateTime.Max. ticks)。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.. through ..我给了它们从01到99的随机Tick值(为了简单起见)。假设MaxTicks是100。这将使我们的表包含以下数据:

Rowkey, Entity Data

  • - 01, Location1
  • ——50,Location2
  • ——55岁Location3
  • , 66年,Location4
  • , 67年,Location5
  • , 90年,Location6
  • , 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)

因此,如果您需要2个位于Location3之前的实体,只需发出查询,从RowKey大于"D----45"且小于"D----99"(max)的表中获取2个实体。如果您需要在Location3之后采取2行,只需发出一个take 2,其中RowKey大于"a ----55",小于"a -----99"(最大)。发出"小于"条件是很重要的,这样你就不会在查询"A"时意外遇到"D"。

在批处理事务中更新/插入两组实体,以确保两者都或都没有进入表,然后"瞧"。

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