如何在Azure表

时间:2017-08-10 17:32:48

标签: c# azure azure-table-storage

我想知道哪个用户在群组中发送了更多邮件。

public class UserEntity : TableEntity
{
    public UserEntity()
    {

    }

    public UserEntity(string chatId, string userId) 
        : base(chatId, userId)
    {
    }

    public int Name { get; set; }
    public int MessagesCount { get; set; }
}

当我收到新消息时,我会增加该用户的MessagesCount。在一天结束时,我怎么知道哪一个具有最高MessagesCount

感谢。

3 个答案:

答案 0 :(得分:4)

这是一种不需要您进行表扫描的替代方法。如果您创建了第二个表,其中分区键为反向消息计数(int.Max - MessageCount),行键为用户ID,则查询表没有任何分区或行键但使用Take(1)应该返回顶部的项目的表。由于azure表是按字典排序的,因此应该返回具有最低分区键的项目,该分区键是具有最高消息计数的实体。这种技术称为log-tail模式,当应用于行键时,它肯定适用于分区。我相信它应该适用于整个表中的分区键。

答案 1 :(得分:1)

您必须枚举所有实体,以找到具有最大MessagesCount的实体。

有关如何设计表格以实现更多方案目标的详细信息,请参阅Azure Storage Table Design Guide

  

更新

     

我不知道谁标记我的答案刚才没用,但Azure存储表服务确实不支持服务器端排序。换句话说,如果属性不是PartitionKey / RowKey,那么人们必须从表服务中查询所有实体并从客户端查找最小/最大值,这正是费韩的答案实际上所做的。老实说,这样的表格扫描总是意味着你的桌子设计不合适,这就是我建议人们阅读设计指南的原因。

答案 2 :(得分:1)

  

在一天结束时,我怎么知道哪一个具有最高的MessagesCount?

您可以按MessagesCount排序,并获取具有最高MessagesCount的用户。并且您可以在计划的WebJob中执行以下查询并缓存结果,然后您可以从程序中的缓存中获取结果,而不是从表存储中查询结果。

TableQuery<UserEntity> query = new TableQuery<UserEntity>();

UserEntity user = table.ExecuteQuery(query).OrderBy(a => a.MessagesCount).LastOrDefault();

此外,您的要求类似于实施记分板,如果可能,您可以在每次更新用户时将 top-one 用户信息存储在单独的实体中MessagesCount,您可以将当前用户的MessagesCount与该实体进行比较,并在当前用户的MessagesCount更高时更新该实体。通过这种方式,您可以通过点查询查询该(一个)实体,以获得具有最高MessagesCount的用户。