Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure表存储-用于有序数据的行键设计_C#_Azure_Azure Storage_Azure Table Storage - Fatal编程技术网

C# Azure表存储-用于有序数据的行键设计

C# Azure表存储-用于有序数据的行键设计,c#,azure,azure-storage,azure-table-storage,C#,Azure,Azure Storage,Azure Table Storage,我将大量GPS数据存储在存储表中。每个分区最多可以访问100万个实体。插入到表中的每个GPS实体实际上与先前插入的数据是顺序的,因此顺序很重要 有时我需要执行以下查询: 从当前实体(在同一分区内)获取上一个/下一个3个GPS实体。 行键设计选项: 创建递增整数。但是如何跟踪表的当前大小?无法获取表行计数,也无法获取最后插入的行 使用日期时间标记。但是如何使用标记获取上一个/下一个实体 我在C#中使用SDK 2.0版。这是一个非常酷的问题 如果您的任务是只查找在给定项之后或之前的项,那么这将很简单

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

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


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

行键设计选项:

  • 创建递增整数。但是如何跟踪表的当前大小?无法获取表行计数,也无法获取最后插入的行

  • 使用日期时间标记。但是如何使用标记获取上一个/下一个实体


  • 我在C#中使用SDK 2.0版。

    这是一个非常酷的问题

    如果您的任务是只查找在给定项之后或之前的项,那么这将很简单,因为您可以将DateTime.Now.Ticks或(DateTime.Max.Ticks-DateTime.Now.Ticks)作为行键,并在查询中使用“take”命令查找最近的X记录

    但是,由于您需要找到位于给定位置ID之后或之前的最近位置,因此我认为有一种设计模式可能适用于您的行键:

    • 您需要为每个GPS位置保存两个实体。实体的数据应该相同,只是行键不同
    • 一个实体的行键为:DateTime.UtcNow.Ticks,前缀为“a”(升序)
    • 另一个实体的行键为:DateTime.MaxValue.Ticks-DateTime.UtcNow.Ticks,并具有 前缀字符,如:“D”(降序)
    例如,您有7个位置,Location1..to..Location7我给了它们从01到99的随机刻度值(为了简单起见)。假设MaxTicks是100。这将使我们的表包含以下数据:

    行键,实体数据

    • 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
    现在,对于每个实体,您都可以轻松地计算其“相反”行键实体。(只需从DateTime.MaxValue.Ticks中减去其行键,然后将前缀从A翻转到D或从D翻转到A)

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

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

    这种方法的缺点是,您将不得不支付两倍的存储费用


    希望这会有所帮助,并且不会太混乱

    “从当前实体获取上一个/下一个3个GPS实体”-这是否在同一分区键内?是。谢谢-我现在就编辑帖子。谢谢你的回答。由于以下原因,我已经不得不“复制”数据。这意味着相同数据的4个版本。从关系的角度来看,这将是可怕的。我仍在努力为NoSQL设计数据。Azure的数据存储基本上非常便宜,所以我想我会同意你的建议。另一个选择是让冗余分区只存储一个名为RowKeyReference的列,该列将在“主”分区中包含实体的RowKey。这将节省数据成本。。。但它确实有一个关系元素。意见?这取决于你一次需要挑选多少相对实体。您将对这些问题进行单独查询。(尽管查询速度很快)。如果您需要“很多”附近的实体,我会使用单一查询方法。。。否则,只存储引用然后在第二次调用中获取真实实体可能不是一个坏主意。您可以在rowkey中使用“(DateTime.MaxValue.Ticks-DateTime.UtcNow.Ticks).ToString(“d19”)”格式,因为它被排序为字符串而不是整数