我有以下Azure存储表。
位置数据表:
PartitionKey: ClientID + VehicleID
RowKey: GUID
Properties: ClientID, VehicleID, DriverID, Date, GPSPosition
每辆车每年最多可记录1,000,000个实体。每个客户可能有数千辆车。所以,我决定按ClientID
+ VehicleID
进行分区,以便拥有小的,可管理的分区。在ClientID
和VehicleID
查询时,操作会很快执行,因为我们正在将搜索范围缩小到一个分区。
问题:
此处的问题是,有时我只需要查询ClientID
和DriverID
。由于无法执行部分PartitionKey比较,因此需要扫描每个分区。这会扼杀性能。
我的所有ClientID
,VehicleID
和DriverID
都没有PartitionKey,因为查询只能查询VehicleID
或DriverID
,而不是
解决方案1:
我考虑过在其他地方存储一个表示VehicleID和DriverID对的值,然后使用ClientID + VehicleDriverPairID
PartitionKey,但是这会产生数十万个分区,并且在分区之间会有很多数据联合我的代码。
解决方案2:
为Client + VehicleID
设置分区,为Client + DriverID
设置另一个分区。这意味着更新表的工作量是两倍(两次更新),但两次查询都会很快。还会有冗余数据。
这些解决方案中的任何一个都可行吗?其他方案?
答案 0 :(得分:4)
您应该复制记录,如解决方案2.我建议保留一份副本,其中每个记录都在其自己的分区中,因此也由VehiculeId进行分区,这将使得更新所有副本更容易,从vehicleid和传播给其他人。
存储数据非常便宜,除非您事先正确存储,否则查询是一个皮塔饼。所以我的建议是:重复!
答案 1 :(得分:1)
因为无法执行部分PartitionKey比较, 每个分区都需要扫描。
不是真的。如果你的分区键是(字面意思)ClientID$VehicleID
,你可以扫描PartitionKey gt 'ClientID$' and PartitionKey lt 'ClientID%'
(因为(Char)($+1)
是%
。这将只扫描以ClientID开头的分区。
答案 2 :(得分:1)
在这里看来,RowKey是一个毫无意义的GUID,只是为了唯一性,可以替换/增强它并提出以下内容。
每个插入都是一个2实体插入到同一个分区中,因此可以进行批处理,以便成功或两者都失败,从而确保一致性。 []中的注释值是可选的。
PartitionKey = ClientID
RowKey = [Prefix] + VehicleID + [Suffix]
和
PartitionKey = ClientID
RowKey = [Prefix] + DriverID + [Suffix]
如果VehicleID
和DriverID
之间不是唯一的,可以通过添加前缀(例如“V”和“D”)使它们唯一。
如果需要RowKey上的唯一性,可以使用日期(如果足够)或当前完成的GUID作为后缀。