【问题标题】:Azure Table Storage: Storing RelationshipsAzure 表存储:存储关系
【发布时间】:2015-08-16 20:34:22
【问题描述】:

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


编辑 - 更清楚我在问什么

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

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

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

我看到的选项是:

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

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

【问题讨论】:

    标签: azure-table-storage


    【解决方案1】:

    以下是使用 Azure Tables 的“最佳实践”集合: https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/

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

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

    【讨论】:

    • @Sergey 他们移动了这篇文章。我更新了 github 上的链接,还用同一篇文章添加了微软网站的链接。
    【解决方案2】:

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

    我们最近有一个项目,我们将关系数据存储在 ATS 中,它之所以有效,是因为我们的密钥要么是字母数字 (A-Za-z0-9)(PK/RK 中不能有某些符号)要么是 guid (去掉破折号)用下划线分割。看看你可以使用的字符here。我们可以用这个模型保证键的唯一性。

    例子

    客户:PK“企业”RK“A0001”

    产品:PK "business_A0001" RK "somesequentialstringguid"

    InstanceOfProduct: PK "business_A0001_somesequentialstringguid" RK "somesequentialstringguid"

    另一个大问题是您希望如何查询数据?使用此模型从多个产品收集数据会很烦人(多个请求等或请求使用延续键跨越分区边界),但拉取单个实例/分区的速度非常快。这对我们来说更重要,所以这就是我们的目标。

    我的 2 美分 HTH

    【讨论】:

    • 是的,这很有意义。我所有的 RowKeys 都是没有标点符号的向导。但是,是的,我知道如果不是这样,那会很烦人。
    • 在某些情况下不仅烦人,您不能在列/属性名称中使用破折号。我在我的一些实体上使用动态属性(可以通过这种方式保留关系数据的小列表)。读出动态列表/属性时,您只需使用 DynamicTableEntity 和 EntityResolver 即可。
    【解决方案3】:

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

    所以我猜串联是正确的方法。否则,如果您将主表中的 PartitionKey 和 RowKey 用作第二个表中的 PartitionKey 和 RowKey,那么您将无法建立一对多关系。因为主表中的 一个 记录将在第二个表中有 许多 记录,而对于第二个表中的所有这些记录,您不能有相同的 PartitionKeyRowKey 值。

    请注意,连接 PartitionKey 和 RowKey 将导致在第二个表中为主表中的每条记录单独分区。如果你有一个场景,你想在第二个表中查询多个分区,那么它会很慢。

    最重要的一点是,在设计Tables Storage的结构时,主要考虑的是数据访问模式。因此,您应该了解如何访问数据并相应地设计结构。

    希望这会有所帮助。

    【讨论】:

    • 确实有帮助。谢谢你。我将稍微修改一下这个问题,以便更清楚地说明我在问什么。
    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多