基于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"
答案 0 :(得分:0)
这取决于您将为单个用户提供多少数据。您的第一个查询很简单,因为分区键是用户ID。 说到第二个查询,因为表存储中没有“包含”功能,我会说你有以下选项:
无论哪种方式,表存储架构都不会使这种用例变得容易,您需要在代码中实现一些逻辑。
在旁注中,IIRC您可以使用默认的TimeStamp字段获取最新项目。
答案 1 :(得分:0)
您当前的设计对我来说很好,并且符合Azure Storage Table Design Guide中的指南。您提到的2个查询可以在您设计的表格中高效完成。你还有其他问题吗?