具有多个查询点的Azure存储表设计

时间:2013-02-28 11:09:41

标签: azure nosql azure-storage azure-table-storage

我有以下Azure存储表。

位置数据表:

PartitionKey: ClientID + VehicleID 
RowKey: GUID 
Properties:  ClientID, VehicleID, DriverID, Date, GPSPosition

每辆车每年最多可记录1,000,000个实体。每个客户可能有数千辆车。所以,我决定按ClientID + VehicleID进行分区,以便拥有小的,可管理的分区。在ClientIDVehicleID查询时,操作会很快执行,因为我们正在将搜索范围缩小到一个分区。

问题:

此处的问题是,有时我只需要查询ClientIDDriverID。由于无法执行部分PartitionKey比较,因此需要扫描每个分区。这会扼杀性能。

我的所有ClientIDVehicleIDDriverID都没有PartitionKey,因为查询只能查询VehicleIDDriverID,而不是

解决方案1:

我考虑过在其他地方存储一个表示VehicleID和DriverID对的值,然后使用ClientID + VehicleDriverPairID PartitionKey,但是这会产生数十万个分区,并且在分区之间会有很多数据联合我的代码。

解决方案2:

Client + VehicleID设置分区,为Client + DriverID设置另一个分区。这意味着更新表的工作量是两倍(两次更新),但两次查询都会很快。还会有冗余数据。

这些解决方案中的任何一个都可行吗?其他方案?

3 个答案:

答案 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]

如果VehicleIDDriverID之间不是唯一的,可以通过添加前缀(例如“V”和“D”)使它们唯一。

如果需要RowKey上的唯一性,可以使用日期(如果足够)或当前完成的GUID作为后缀。