6

我是 Azure 的新手!目的是根据存储在 RowKey 中的时间戳返回行。由于每个查询都有交易成本,我想在保持性能的同时尽量减少交易/查询的数量

这些是建议的分区键和行键:

  • 分区键: TextCache_(AccountID)_(ParentMessageId)
  • 行键: (DateOfMessage)_(MessageId)

传说

  • AccountId - 是一个整数
  • ParentMessageId - 如果有则为父 messageId,如果为父则为空
  • DateOfMessage - 创建消息的日期 - 格式为 DateTime.Ticks.ToString("d19")
  • MessageId - 消息的唯一 ID

我想从单个查询中返回 > 或 < DateOfMessage_MessageId 的行和任何子行

这可以通过我建议的 PartitionKeys 和 RowKeys 来完成吗?

即..(在伪代码中)

var results = ctx.PartitionKey.StartsWith(TextCache_AccountId) 
   && ctx.RowKey > (TimeStamp)_MessageId

其次,如果我有多个帐户,并且只想返回前 10 个帐户,是否可以通过单个查询完成

即..(在伪代码中)

var results = ( 
      ( 
        ctx.PartitionKey.StartsWith(TextCache_(AccountId1)) && 
            && ctx.RowKey > (TimeStamp1)_MessageId1 )
      )
      ||
      ( 
        ctx.PartitionKey.StartsWith(TextCache_(AccountId2)) && 
            && ctx.RowKey > (TimeStamp2)_MessageId2 )
      ) ... 
          )
         .Take(10)
4

1 回答 1

5

对您的问题的简短回答是肯定的,但是您需要注意一些事项。

Azure 表存储没有直接等效的.StartsWith(). 如果您将存储库与 LINQ 结合使用,则可以使用.CompareTo()(> 和账户 1 只有 600 个结果,最后 400 个结果将是账户 10(词汇上的下一个帐号)。所以你需要对你如何处理你的结果有点聪明。

如果你用前导 0 填充帐户 ID,你可以做这样的事情(这里也是伪代码)

ctx.PartionKey > "TextCache_0000000001"
&& ctx.PartitionKey < "TextCache_0000000002"
&& ctx.RowKey > "123465798"

需要记住的其他一点是,对 Azure 表的查询按顺序返回其PartitionKey结果RowKey。因此,在您的情况下,没有 a 的消息ParentMessageId将在带有 a 的消息之前返回ParentMessageId。如果您永远不会通过ParentMessageId我将其移至属性来查询此表。

IfTextCache_只是一个字符串常量,它不会通过包含在添加任何内容,PartitionKey除非它在返回时实际上对您的代码有意义。

虽然您将运行第二个查询,但我认为它不会产生您所追求的。如果您希望前十行按DateOfMessage顺序排列,那么它将不起作用(请参阅我上面关于排序顺序的观点)。如果您按原样运行此查询并且帐户 1 有 11 条消息,它将仅返回与帐户 1 相关的前 10 条消息,无论帐户 2 是否有更早的消息。

虽然尽量减少您使用的交易数量是一种很好的做法,但不要太担心它。运行您的工作人员/网络角色的成本将使您的交易成本相形见绌。1,000,000 笔交易将花费您 1 美元,这比运行一个小型实例 9 小时的成本还要低。

于 2011-05-03T03:58:14.653 回答