我将大量GPS数据存储在存储表中。每个分区最多可以达到100万个实体。插入到表中的每个GPS实体实际上是按前一个插入的数据顺序排列的,因此顺序很重要。
有时我需要执行以下查询:
从当前实体(在同一分区内)获取前一个/下一个3个GPS实体
RowKey设计选项:
-
创建一个递增的整数。但是我如何跟踪表的当前大小?
无法获取表行数,也无法获取最后插入的行。 使用DateTime Ticks。但是如何使用tick获得上一个/下一个实体?
我在c#中使用SDK 2.0版本。
这是一个非常酷的问题。
如果您的任务是只查找给定条目之后或之前的条目,这将是简单的,因为您可以只取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"。
在批处理事务中更新/插入两组实体,以确保两者都或都没有进入表,然后"瞧"。
这种方法的缺点是您必须支付两倍的存储空间。