Azure表存储:存储关系

时间:2015-06-02 20:57:17

标签: azure-table-storage

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

编辑 - 更明确我要求的内容

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

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

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

我看到的选项是:

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

希望这会有所帮助。

答案 1 :(得分: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 :(得分:2)

这是"最佳实践"的集合。使用Azure表: https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/

"一对多的关系"章节可能有用。

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