4

在以下情况下您有什么建议:

我有一个名为 Users 的天蓝色表,其中列是:

  • 首要的关键
  • 行键
  • 时间戳
  • 电子邮件
  • 电话

然后,每个用户都有不同类型的任务,我们称它们为 TaskType1 和 TaskType2。

两种任务类型都有共同的列,但也有像这样的类型特定列:

  • PrimaryKey(这与用户 PrimaryKey 相同,用于查找属于一个用户的所有任务)
  • 行键
  • 时间戳
  • 姓名
  • 截止日期
  • 描述
  • 优先

然后 TaskType1 有额外的列:

  • 估计完成日期
  • 是可行的

并且 TaskType2 有它自己的特定列:

  • 估计成本

我知道我可以将两种类型存储在同一个表中,我的问题是:

如果我对 TaskType1 和 TaskType2 使用不同的表,对交易成本会有什么影响?我猜如果我为每种任务类型有 2 个表,然后我会发出如下查询:get me all tasks where the task Primarykey is equal to a specific user from Users table PrimaryKey那么我将不得不为每种类型运行 2 个查询(因为用户可以同时拥有两种任务类型),这意味着更多的事务......如果两个任务都在同一个表中,那么它将像 1 个查询(在分页事务后限制为 1000),因为我将获得 PartitionKey 是用户 PartitionKey 的所有行,因此分区不会拆分,这意味着 1 个事务权?

那么我是否理解正确,如果我将任务存储在不同的表中,我将有更多的事务..?

4

1 回答 1

6

你的理解是完全正确的。将任务拆分为 2 个单独的表意味着 2 个单独的查询因此 2 个事务(让我们暂时不考虑 1000 多个实体)。尽管交易成本是将它们放在同一张表中的原因之一,但还有其他原因:

  • 通过将它们保存在同一个表中,您将充分利用 Azure 表存储的无架构特性。
  • 2 个表意味着 2 个网络调用。尽管该服务具有高可用性,但您需要考虑调用第一个表成功但调用第二个表失败的情况。在这种情况下,您的应用程序将如何表现?你是否也丢弃了第一个表的结果?通过将它们保留在一个表中,您可以避免这种情况。
  • 假设您的应用程序中有一个用户可以同时订阅任务 1 和任务 2 的场景。如果将它们保存在同一个表中,则可以使用Entity Group Transaction两个实体(一个用于任务 1,另一个用于任务 2)将具有相同的 PartitionKey(即用户 ID)。如果您将它们保存在单独的表中,您将无法利用实体组事务。

我会给出的一个建议是在您的 Tasks 表中有一个“TaskType”属性。这样,您也可以更轻松地按任务进行过滤。

于 2013-08-26T18:55:37.510 回答