1

我有以下 Azure 存储表。

位置数据表:

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

每辆车每年将为每位客户记录多达 1,000,000 个实体。每个客户可能拥有数千辆汽车。因此,我决定按ClientID+进行分区,VehicleID以便拥有更小的、可管理的分区。通过ClientIDand进行查询时VehicleID,操作执行得很快,因为我们将搜索范围缩小到一个分区。

问题:

这里的问题是,有时我只需要查询ClientIDand DriverID。因为不可能执行部分 PartitionKey 比较,所以需要扫描每个单独的分区。这会扼杀性能。

我不能有 all 的 PartitionKey ,ClientID因为查询只会查询OR ,永远不会同时查询。VehicleIDDriverIDVehicleIDDriverID

解决方案 1:

我考虑过将一个值存储在其他地方,它代表一个 VehicleID 和 DriverID 对,然后有一个ClientID + VehicleDriverPairIDPartitionKey,但这会导致数十万个分区,并且在我的代码中分区之间会有很多数据联合。

解决方案 2:

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

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

4

3 回答 3

4

您应该复制记录,如解决方案 2 中所示。我建议保留一份副本,其中每条记录都位于其自己的分区中,因此也由 VehiculeId 分区,这将使更新所有副本更容易,从 vehicleid 开始并传播到其他。

存储数据真的很便宜,除非您预先正确存储它,否则查询是一个皮塔饼。所以我的建议是:重复!

于 2013-02-28T12:31:46.517 回答
1

因为不可能执行部分 PartitionKey 比较,所以需要扫描每个单独的分区。

不是真的。例如,如果您的分区键是 (literally) ClientID$VehicleID,您可以扫描PartitionKey gt 'ClientID$' and PartitionKey lt 'ClientID%'(works because (Char)($+1)is %。这将仅扫描以 ClientID 开头的分区。

于 2013-02-28T11:44:41.050 回答
1

这里似乎 RowKey 是一个无意义的 GUID,只是为了唯一性,可以替换/增强它并提出以下内容。

每个插入都是一个 2 实体插入到同一个分区中,因此可以批处理,这样既成功又失败,确保一致性。[] 中的注释值是可选的。

PartitionKey = ClientID  
RowKey = [Prefix] + VehicleID + [Suffix]

PartitionKey = ClientID  
RowKey = [Prefix] + DriverID + [Suffix]

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

如果需要 RowKey 上的唯一性,则可以在日期后加上日期(如果足够)或当前完成的 GUID。

于 2013-02-28T16:45:24.673 回答