我的流程
我将数据存储在Azure表存储
巨大的==>每秒\分钟数据从设备插入表存储。
基本上,设备中的数据存储在TableStorage中。
因此TableStorage有PK,RK,Timestamp,Vale,TimeReceived
个字段。
这里TimeReceived
注册设备发送数据的时间,Timestamp
注册数据的插入时间。
我的要求
每次都应提取TimeReceived
中的最新时间,以便在仪表板上显示。
我的查询
我不会知道RK或PK来检索具有最新TimeRecieved
的最新值。
得到这个的最佳方法是什么?
更新
表存储的字段为PK,RK,Timestamp,Value,TimeReceived
PK
具有特定于不同信号的值。因此每个分区都会有信号ID作为值。
RK
将采用计算值DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks
将从设备收到TimeReceived
的值。
我们也会从设备收到Value
的值。
我的系统显示一个仪表板,显示设备所有信号的最新值\时间。
我的问题
因此,要在仪表板上显示最新值,我需要查询TableStorage中的每个分区,以获取在TimeReceived
中注册的最新值的数据。
根据我的阅读,我理解没有PK& RK在查询中会出现性能问题。请告诉我根据TimeReceived
中的值获取最新数据的最佳\正确方法。
答案 0 :(得分:0)
考虑到您需要显示所有设备的最新值,一种可能的解决方案是存储相同数据的多个副本。
在您当前的设计中,您已将PartitionKey
设置为设备标识符,将RowKey
设置为反向刻度(优秀决策BTW),我建议您继续这样保存,但为同一数据添加一个条目。
但是,这次您将反转PartitionKey
和RowKey
,即您的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")