azure table storage获取条件满足PK或RK以外的字段的数据

时间:2018-06-04 11:58:16

标签: c# azure azure-table-storage

我的流程

  1. 我将数据存储在Azure表存储

  2. 巨大的==>每秒\分钟数据从设备插入表存储。

  3. 基本上,设备中的数据存储在TableStorage中。

  4. 因此TableStorage有PK,RK,Timestamp,Vale,TimeReceived个字段。 这里TimeReceived注册设备发送数据的时间,Timestamp注册数据的插入时间。

  5. 我的要求

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

    我的查询

    我不会知道RK或PK来检索具有最新TimeRecieved的最新值。 得到这个的最佳方法是什么?

    更新

    1. 表存储的字段为PK,RK,Timestamp,Value,TimeReceived

    2. PK具有特定于不同信号的值。因此每个分区都会有信号ID作为值。

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

    4. 将从设备收到TimeReceived的值。

    5. 我们也会从设备收到Value的值。

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

    7. 我的问题

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

      根据我的阅读,我理解没有PK& RK在查询中会出现性能问题。请告诉我根据TimeReceived中的值获取最新数据的最佳\正确方法。

1 个答案:

答案 0 :(得分:0)

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

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

但是,这次您将反转PartitionKeyRowKey,即您的PartitionKey将包含反向标记,RowKey将包含设备ID。

要减少分区数量,您可以做的一件事是创建一个具有微小频率的分区,即每分钟,您将创建一个新分区。由于每个设备每秒都在发送数据,因此您可以使用GUID为设备ID值添加后缀,以便在一分钟内没有设备的重复条目。

因此,您的实体设计将涵盖您的查询方案:

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")