我在存储表中存储了大量GPS数据。每个分区最多可以连接一百万个实体。实际上,插入表中的每个GPS实体实际上都是与先前插入的数据相依的,因此顺序很重要。
有时我需要执行以下查询:
从当前实体(在同一分区内)获取前3个/后3个GPS实体。
RowKey设计的选项:
创建一个递增的整数。但是,如何跟踪表格的当前大小?无法获取表行计数或获取最后插入的行。
使用DateTime刻度。但是如何使用刻度线获得上一个/下一个实体?
我在C#中使用SDK版本2.0。
最佳答案
这是一个要解决的超酷问题。
如果您的工作是只查找在给定条目之后或之前的条目,这将很简单,因为您可以将DateTime.Now.Ticks或(DateTime.Max.Ticks-DateTime.Now.Ticks)用作RowKey并在查询中使用“ Take”命令来查找最近的X记录。
但是,由于您需要查找位于给定位置ID之前或之后的最近位置,因此我认为这是一种适用于RowKey的设计模式:
您将需要为每个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,位置1
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)
因此,如果您需要在Location3之前的2个实体,只需发出查询以从RowKey大于“ D ---- 45”且小于“ D ---- 99”(最大)的表中获取2个实体。并且,如果您需要在Location3之后获取2行,只需发出Take 2,其中RowKey大于“ A ---- 55”且小于“ A ----- 99”(最大值)。
发出“小于”标准很重要,这样在查询“ A”时就不会偶然遇到“ D”。
更新/插入批处理事务中的两组实体,以确保将两者都不放入表和“瞧”中。
这种方法的缺点是您将需要为存储空间支付两倍的费用。
希望这会有所帮助并且不要太困惑
关于c# - Azure表存储-用于有序数据的RowKey设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15195773/