按Azure表存储

时间:2015-08-07 07:45:41

标签: c# azure azure-storage azure-table-storage

基于Azure表存储中的标记查询大量行的最有效方法是什么?

我需要找到至少标有“A”和“B”标签的所有行。在插入之前标签将被标准化,例如。全部只有小写和字母数字。我还需要轻松提取最新项目,因此我当前的RowKey包含倒置DateTime string.Format("{0:D19}", DateTime.MaxValue.Ticks-DateTime.UtcNow.Ticks)

我的所有行都由UserId

分区

我目前的解决方案是为每个标记添加一个额外的行(考虑将它们放在一个单独的表中),然后我可以触发多个查询并将它们连接到我的服务器上,然后再将它们返回给客户端。因此,当插入具有两个标签(A,B)的实体时,它将按如下方式存储:

[
    {
        "partitionKey": "123", // UserId
        "rowKey": "2519633682044852820"
    },
    {
        "partitionKey": "123_tags", // UserId + tags constant, this is not the actual tags - this is to put the tagged entities in a different partition
        "rowKey": "a" // normalized tag
    },
    {
        "partitionKey": "123_tags",
        "rowKey": "b"
    }
]

我需要的查询是这样的:

  • top 1000 latest entities where userId = "X"
  • all entities where userId = "X" and tags contains "A" AND "B"

2 个答案:

答案 0 :(得分:0)

这取决于您将为单个用户提供多少数据。您的第一个查询很简单,因为分区键是用户ID。 说到第二个查询,因为表存储中没有“包含”功能,我会说你有以下选项:

  • 获取用户的所有项目,并在代码中过滤掉不必要的记录(如果每个用户没有那么多记录,那么这应该不是问题)
  • 如果单个用户的记录很多,您可以根据某个标记范围为用户分区记录,即分区键可以看起来像“UserX_TagsA-K”,“UserX_TagsK-O”,“UserX_TagsO-Z”和然后只从所需的tange获取并稍后在代码中过滤掉
  • 为每个标记创建冗余记录,然后分区键对于一条记录看起来像“UserX_Tag123”,对于相同记录看起来像“UserX_Tag324”,但表示它有两个标记。如果需要更新数据,行键可以是复合数据,即采用以下格式“GroupId:UniqueId”,并使用rowkey上的“StartsWith”子句,您可以获取所有冗余记录以更新它们

无论哪种方式,表存储架构都不会使这种用例变得容易,您需要在代码中实现一些逻辑。

在旁注中,IIRC您可以使用默认的TimeStamp字段获取最新项目。

答案 1 :(得分:0)

您当前的设计对我来说很好,并且符合Azure Storage Table Design Guide中的指南。您提到的2个查询可以在您设计的表格中高效完成。你还有其他问题吗?