我将大量GPS数据存储在存储表中 . 每个分区最多可以达到100万个实体 . 插入表中的每个GPS实体实际上与插入的先前数据相同,因此顺序很重要 .
有时我需要执行以下查询:
从当前实体(在同一分区内)获取上一个/后三个GPS实体 .
RowKey设计选项:
-
Create an incrementing integer. 但是如何跟踪表格的当前大小?无法获取表行计数或获取最后插入的行 .
-
Use DateTime Ticks. 但是如何使用ticks获取上一个/下一个实体?
我在C#中使用SDK 2.0版 .
1 回答
这是一个非常酷的问题需要解决 .
如果你的工作只是在给定条目之后或之前找到相同的条目,这很简单,因为你可以把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, Entity Data
A ---- 01,Location1
A ---- 50,位置2
A ---- 55,位置3
A ---- 66,位置4
A ---- 67,位置5
A ---- 90,位置6
A ---- 99,位置7
D ---- 01,位置7
D ---- 10,位置6
D ---- 33,位置5
D ---- 34,位置4
D ---- 45,位置3
D ---- 50,位置2
D ---- 99,位置1
现在,对于每个实体,您可以轻松地计算其“相反”的Rowkey实体 . (只需从DateTime.MaxValue.Ticks中减去RowKey,然后将前缀从A翻转到D或从D翻转到A)
因此,如果您需要2个位于Location3之前的实体,只需发出查询以从RowKey大于“D ---- 45”且小于“D ---- 99”(最大)的表中获取2个实体 . 如果你需要在Location3之后占用2行,只需发出一个Take 2,其中RowKey大于“A ---- 55”且小于“A ----- 99”(最大值) . 发出“小于”标准很重要,因此当你查询“A”时你不会意外地遇到“D” .
在批处理事务中更新/插入两组实体,以保证两者都没有进入表中并“瞧” .
这种方法的缺点是你必须支付两倍的存储费用 .
希望这有所帮助,而不是太混乱