Azure表存储-在查询之间使用的PartitionKey和RowKey选择



我是Azure的新手!目的是根据存储在RowKey中的时间戳返回行。由于每个查询都有一个事务成本,所以我希望在保持性能的同时最小化事务/查询的数量

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

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

:

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

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

这可以通过我提出的PartitionKeys和RowKeys来完成吗?

ie . .(psuedo代码)

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

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

来完成吗?

ie . .(psuedo代码)

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

对你的问题的简短回答是肯定的,但是有些事情你需要注意。

Azure表存储没有.StartsWith()的直接等价物。如果您将存储库与LINQ结合使用,则可以使用.CompareTo()(>和<这将意味着,如果您运行对帐户1的搜索,并要求查询返回1000个结果,但只有600个结果对应帐户1,最后400个结果将对应帐户10(词法上的下一个帐户号码)。所以你需要聪明一点,如何处理你的结果。>

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

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

其他要记住的是,查询Azure表返回他们的结果在PartitionKey然后RowKey顺序。因此,在您的情况下,没有ParentMessageId的消息将在具有ParentMessageId的消息之前返回。如果你不打算通过ParentMessageId查询这个表,我将把它移到一个属性。

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

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

虽然尽量减少使用的事务数量是一种好做法,但不要太在意。运行worker/web角色的成本将使您的交易成本相形见绌。1,000,000个事务将花费您1美元,这比运行一个小实例9小时的成本要少。

相关内容

  • 没有找到相关文章

最新更新