根据 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"
}
]
我需要的查询是这样的:
userId =“X”的前 1000 个最新实体
userId =“X”且标签包含“A”和“B”的所有实体
最佳答案
这取决于单个用户拥有多少数据。您的第一个查询很简单,因为分区键是用户 ID。 当谈到第二个查询时,由于表存储中没有“包含”功能,我想说您有以下选择:
- 获取用户的所有项目,并稍后在代码中过滤掉不必要的记录(如果每个用户没有那么多记录,那应该不是问题)
- 如果单个用户的记录较多,您可以根据某些标签范围对用户的记录进行分区,即分区键可以类似于“UserX_TagsA-K”、“UserX_TagsK-O”、“UserX_TagsO-Z”和然后仅从所需的切线中获取并稍后在代码中过滤掉
- 为每个标签制作冗余记录,那么一条记录的分区键可以是“UserX_Tag123”,同一条记录的分区键可以是“UserX_Tag324”,但表明它有两个标签。如果需要更新数据,行键可以是复合行键,即采用“GroupId:UniqueId”格式,通过在行键上使用“StartsWith”子句,可以获取所有冗余记录进行更新
无论哪种方式,表存储架构都不会让这种用例变得简单,您需要在代码中实现一些逻辑。
顺便说一句,IIRC 您可以使用默认的时间戳字段获取最新项目。
关于c# - 在Azure表存储中按标签查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31872263/