加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Azure表存储 – 有序数据的RowKey设计

发布时间:2020-12-16 01:53:22 所属栏目:百科 来源:网络整理
导读:我将大量GPS数据存储在存储表中.每个分区最多可以达到100万个实体.插入表中的每个GPS实体实际上与插入的先前数据相同,因此顺序很重要. 有时我需要执行以下查询: Get the previous/next 3 GPS entities from the current entity (within the same partition)
我将大量GPS数据存储在存储表中.每个分区最多可以达到100万个实体.插入表中的每个GPS实体实际上与插入的先前数据相同,因此顺序很重要.

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

Get the previous/next 3 GPS entities from the current entity (within the same partition).

RowKey设计选项:

>创建递增整数.但是如何跟踪表格的当前大小?无法获取表行计数或获取最后插入的行.
>使用DateTime Ticks.但是如何使用ticks获取上一个/下一个实体?

我在C#中使用SDK 2.0版.

解决方法

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

如果你的工作只是在给定条目之后或之前找到相同的条目,这很简单,因为你可以把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,位置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)

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

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

这种方法的缺点是你必须支付两倍的存储费用.

希望这有所帮助,而不是太混乱

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读