Azure表存储:存储关系

问题描述 投票:2回答:3

在Azure表存储中存储一对多关系(例如存储记录所有者的ID)时,是否将PartitionKey和RowKey存储为两个单独的字段?或者你是否以某种方式将这两个字段连接到一个字段中以便更简单地存储?


编辑 - 更清楚我要问的是什么

我知道表存储不是关系型的。而且我不是在寻找外键完整性或级联删除或类似的东西。

但即使没有“关系”,仍然需要将指针存储到另一个表中的记录。这有数千种用途。我存储创建记录的用户的例子只是一个例子。存储任何类型的列表或数组是另一个示例(例如简历中的“工作经验”记录列表,或者个人记录的联系地址列表。)

因为Azure表存储表的“主键”是两个字段,所以我想知道是否存在关于如何存储该信息的通用约定。什么是“最佳实践?”

我看到的选项是:

  • 将PartitionKey和RowKey连接到一个字段并将其存储为“外键”(我知道没有真正的外键)。
  • 分别存储这两个字段并将其用作外键。
  • 我没有想到的第三种选择。

这里有“最佳实践”吗?是否有理由选择一种方法而不是另一种方法?

azure-table-storage
3个回答
3
投票

首先,Azure表存储不是本地支持一对多关系的关系数据库。无论如何,你可以像你提到的那样开发这个场景。关键点是PartitionKey + RowKey在表中必须是唯一的。因此,在给定分区(由PartitionKey表示)中,您不能复制RowKey。

所以我猜连接是正确的方法。否则,如果您在主表中使用PartitionKey和RowKey作为PartitionKey和第二个表中的RowKey,那么您将无法拥有一对多关系。因为主表中的一条记录将在第二个表中具有许多记录,并且对于第二个表中的所有这些记录,您不能具有相同的PartitionKey和RowKey值。

请注意,连接PartitionKey和RowKey将在第二个表中为主表中的每个记录生成单独的分区。如果您想要在第二个表中查询多个分区,那么它会很慢。

最重要的一点是,在设计表存储结构时,主要考虑的是数据访问模式。因此,您应该看到如何访问数据并相应地设计结构。

希望这可以帮助。


2
投票

您必须小心连接父表中的键。你真的必须看看你的钥匙是否可行。

我们最近有一个项目,我们在ATS中存储了关系数据,因为我们的密钥是字母数字(A-Za-z0-9)(你不能在PK / RK中有某些符号)或guids(带有破折号)剥离)用下划线分开。看看你可以使用here的角色。我们可以保证使用此模型的键的唯一性。

客户:PK“business”RK“A0001”

产品:PK“business_A0001”RK“somesequentialstringguid”

InstanceOfProduct:PK“business_A0001_somesequentialstringguid”RK“somesequentialstringguid”

另一个大问题是您希望如何查询数据?从这个模型中收集来自多个产品的数据会很烦人(多个请求等,或者请求通过连续密钥跨越分区边界),但拉动单个实例/分区的速度很快。这对我们来说更重要,这就是我们的目标。

我的2美分HTH


2
投票

以下是使用Azure Tables的“最佳实践”集合:qazxsw poi

“一对多关系”一章可能很有用。

我建议对数据进行非规范化,并在单个表中保留表示一对多关系的记录。考虑如何查询数据,以非规范化方式进行。

© www.soinside.com 2019 - 2024. All rights reserved.