Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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表存储在PK或RK以外的字段上获取条件满足的数据_C#_Azure_Azure Table Storage - Fatal编程技术网

C# azure表存储在PK或RK以外的字段上获取条件满足的数据

C# azure表存储在PK或RK以外的字段上获取条件满足的数据,c#,azure,azure-table-storage,C#,Azure,Azure Table Storage,我的流程 我将数据存储在Azure表存储中 它的巨大==>每秒\分钟的数据都会从设备插入到表存储中 基本上,来自设备的数据存储在表存储中 因此,表存储有PK、RK、Timestamp、Vale、TimeReceived字段。 此处,TimeReceived记录设备发送数据的时间,而此时,Timestamp记录插入数据的时间 我的要求 每次应获取TimeReceived中的最新时间,以便在仪表板上显示 我的查询 我将不知道RK或PK来检索具有最新接收时间的最新值。 得到这个最好的方法是什么 更新

我的流程

  • 我将数据存储在Azure表存储中

  • 它的巨大==>每秒\分钟的数据都会从设备插入到表存储中

  • 基本上,来自设备的数据存储在表存储中

  • 因此,表存储有
    PK、RK、Timestamp、Vale、TimeReceived
    字段。 此处,
    TimeReceived
    记录设备发送数据的时间,而此时,
    Timestamp
    记录插入数据的时间

  • 我的要求

    每次应获取
    TimeReceived
    中的最新时间,以便在仪表板上显示

    我的查询

    我将不知道RK或PK来检索具有最新
    接收时间的最新值。
    得到这个最好的方法是什么

    更新

  • 表存储器具有字段
    PK、RK、时间戳、值、接收时间

  • PK
    具有特定于不同信号的值。因此,每个分区都将信号ID作为值

  • RK
    将采用计算值
    DateTime.MaxValue.Ticks-DateTime.UtcNow.Ticks

  • 将从设备接收
    TimeReceived
    的值

  • 值的值也将从设备接收

  • 我的系统显示一个仪表板,显示设备所有信号的最新接收值\时间

  • 我的问题

    因此,要在仪表板上显示最新值,我需要查询表存储中的每个分区,以获取在
    TimeReceived
    中注册了最新值的数据


    根据我的阅读,我理解如果查询中没有PK和RK,将出现性能问题。请告诉我根据
    TimeReceived

    中的值获取最新数据的最佳\正确方法。考虑到您需要显示所有设备的最新值,一种可能的解决方案是存储相同数据的多个副本

    在您当前的设计中,您已经将
    PartitionKey
    设置为设备标识符,将
    RowKey
    设置为反向刻度(非常好的决策BTW),我建议您继续这样保存,但为相同的数据添加一个条目

    但是,这次您将反转
    分区键
    行键
    ,即
    分区键
    将包含反转记号,而
    行键
    将包含设备id

    为了减少分区的数量,您可以做的一件事是创建一个以分钟为频率的分区,即每分钟创建一个新分区。由于每个设备每秒发送数据,因此可以在设备id值后面加上GUID,以便在一分钟内不会有重复的设备条目

    因此,覆盖查询场景的实体设计将是:

    PartitionKey -> (DateTime.Max.Ticks - DateTime.UtcNow.Ticks).ToString("d20")
    RowKey -> Device Id + Guid (to randomize)
    DeviceId -> Store the device id as an attribute
    TimeReceived -> Store the time when the data was received
    Value -> Value received
    
    对于PartitionKey,还可以使用以下公式:

    PartitionKey -> (DateTime.Max.Ticks - TimeReceived.Ticks).ToString("d20")
    

    您可能需要重新考虑您的设计。本指南将帮助您充分利用Azure表存储:。@GauravMantri您能否给出所需的更改,这可能对我的场景有所帮助?请编辑您的问题,并包括:1)您的PartitionKey和RowKey当前的外观如何,以及2)描述您的查询模式,即您希望如何查询数据。只有在那之后,我才能提出任何修改建议。谢谢。@GauravMantri我已经用我的应用程序数据设计\过程更新了我的Q。谢谢!让我稍后提供一个可能的解决方案。好的,谢谢。看起来真的很有帮助。我将对此进行分析,并在重新设计时,就我对现有结构和数据查询的查询与您联系_但是作为一个快速问题==>目前我查询表存储以获取历史数据,~~~>在选定的时间段内~~>对于选定设备的信号。在这种情况下,我是否可以继续使用我的现有表以及您建议的用于容纳历史搜索和最小化重复工作的表?关于您的问题,是的,您当前的方法会起作用,因为您使用的是
    分区键
    (即设备id)在你的查询中,扫描将被限制在一个特定的分区上。我如何实现每分钟创建一个新分区?i、 e.实施该计划的最佳有效方式是什么?请提出建议。您能否根据您的建议提出一种创建新分区的有效方法
    要减少分区的数量,您可以做的一件事是创建一个以分钟为频率的分区,即每分钟创建一个新分区。