gpt4 book ai didi

c# - 在Azure表存储中按标签查询

转载 作者:太空宇宙 更新时间:2023-11-03 15:36:00 25 4
gpt4 key购买 nike

根据 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com