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

标签 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"
    }
]

我需要的查询是这样的:

  • 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/

相关文章:

c# - 方向取决于数据时的 OrderByWithDirection

c# - sql语句c#有问题

c# - 将单个对象绑定(bind)到 Datagridview

node.js - 无法使用 NestJS 应用程序验证 Azure AD token

azure - 列出 Azure AD 组所需的权限

iis - 如何通过wifi访问Azure存储模拟器(本地)?

azure - 如何在Azure WebJob函数中执行异步

c# - Caliburn 绑定(bind)异常

azure - 使用 Azure 存储 REST API 版本 >= 2019-02-02 指定文件系统属性

azure - 如何向 HTTPS 调用添加自定义属性,以便我可以在 Azure Application Insights 中查看它们?