C# Azure表存储-索引?

C# Azure表存储-索引?,c#,.net,azure,azure-storage,azure-table-storage,C#,.net,Azure,Azure Storage,Azure Table Storage,我有一个实体表,例如“故事”。它将包含大量的“故事”供人们投票 我的应用程序的主要功能是用户阅读“热门”故事,这些故事拥有最多的投票权(最终可能会有其他算法) 我对Azure表结构的第一个想法是: RowKey=唯一id 分区键=???(可能是用户Id,因为您可以查看用户的故事列表) 头衔 描述 用户Id 网址 如何有效地查询被认为是“顶级”故事的故事?大部分流量都将查询最热门的新闻,否则不需要拉出新闻范围。我想要的是一种索引顶级故事的方法,但索引不是表存储的一个功能。我曾考虑保留第二个表,

我有一个实体表,例如“故事”。它将包含大量的“故事”供人们投票

我的应用程序的主要功能是用户阅读“热门”故事,这些故事拥有最多的投票权(最终可能会有其他算法)

我对Azure表结构的第一个想法是:

  • RowKey=唯一id
  • 分区键=???(可能是用户Id,因为您可以查看用户的故事列表)
  • 头衔
  • 描述
  • 用户Id
  • 网址
如何有效地查询被认为是“顶级”故事的故事?大部分流量都将查询最热门的新闻,否则不需要拉出新闻范围。我想要的是一种索引顶级故事的方法,但索引不是表存储的一个功能。我曾考虑保留第二个表,但如果用户更新另一个表中的故事,这可能会有问题

这是我第一次使用Azure Table Storage挂断,应用程序的其余部分将运行良好。因为这个问题,我不想升级到使用完整的SQLAzure


PS-如果有意义的话,我愿意将“热门”故事存储在Azure表之外的其他地方。我的服务器将运行C#web api,但可能没有什么区别。

您应该首先思考“热门故事”的真正含义。 你的意思是最后的前10个故事还是更高的价格

您可以使用rate值作为分区键(例如rate_1、rate_2、rate_3、rate_4、rate_5)。 但是您必须将值舍入为整数,因此如果值为4.1,它将被放入分区率_4中


或者,您可以只使用两个分区:“TopStories”和“OtherStories”。

Azure表存储是一个平面的非关系数据存储。因此,存储和建模数据的方式截然不同。一种常见的模式是为不同访问类型的两个不同数据存储建模。所以一个表是最近的,另一个表是更新的,比如说“最喜欢”

鉴于

  • 您的顶层算法可能会随着时间的推移而发展
  • 这是一个类似于总结的信息
  • 而且可能会变老

  • 我将远离表存储,而是在关系数据库中对其进行建模,以实现查询的灵活性。

    将引导您通过不同的方法创建自己的二级索引。它还提供了设计NoSQL数据库时需要考虑的原则和实现指南。

    那么,什么机制可以将一个故事从“顶层”故事分区移动到另一个分区呢?我将不得不删除该记录并插入新记录?这会发生在人们对一篇报道投赞成票或反对票时。使用两个分区或两个表更好吗?想法?是的,你需要替换实体。您预期的数据访问模式是什么?若有很多更新,那个么更新分区密钥可能不是一个好的解决方案。您还可以提供缓存顶级故事,以改善阅读空间。关于您的问题“两个分区或两个表”,答案是:两个分区。但在可伸缩性方面,如果您使用一个或两个表,则没有区别。我建议您为每日投票保留单独的表,以便您可以聚合多个投票,而不是每次有人投票时重新计算故事的投票率。例如,每天你都会收集选票,并在stories表上使用预定的夜间批量更新来重新计算排名。是的,我认为拥有两个表是一个不错的选择。当人们对一个故事进行投票时,我可以检查投票计数,并将记录复制到“top”stories表中。如果我有一个commments表,它们可以通过storie的“id”访问,我认为如果“top”stories表有一个记录副本,这将很好。使用两个分区还是两个表更好?想法?没有多大关系,因为分区是规模单位,Azure表存储是无模式的。你需要考虑的更大的问题是如何管理“投票”。如果你有成千上万的人在写一篇文章,投票表可能会受到限制。也许可以看看:在RDBMS中执行此操作存在规模问题。1) 不影响存储方法2)也可以在Azure表中解决3)也可以在Azure表中解决我建议使用SQL Db仅用于跟踪“热门故事”,而不用于故事本身。top story算法可能只需要跟踪过去24小时内的故事,因此不需要大规模工作。SQL Db肯定支持更通用的查询场景,这将是我的“首选”。好吧,SQL Db是我们都接受过培训的方式,但价格要高出100倍。这是一个很好的信息,其他人可能想知道@Jason是作者。但我认为他不需要-1,+1。