Azure 表存储:按顺序排列

Posted

技术标签:

【中文标题】Azure 表存储:按顺序排列【英文标题】:Azure Table Storage: Order by 【发布时间】:2012-04-10 20:33:20 【问题描述】:

我正在建立一个有愿望清单的网站。我想将愿望清单存储在 azure 表存储中,但也希望用户能够在查看愿望清单时以多种不同的方式对愿望清单进行排序 - 添加日期、反转添加日期、项目名称等。我还想实现分页,我相信我可以通过使用延续令牌来实现。

据我了解,“order by”没有实现,从表存储返回结果的顺序基于分区键和行键。因此,如果我想实现我所描述的分页和排序,最好的方法是通过使用不同的分区键/行键多次存储愿望列表来实现这一点?

在这个简单的情况下,愿望清单可能不会那么大,实际上我可以限制可以出现在列表中的最大项目数,然后摆脱分页并在内存中排序。但是,我还有更复杂的情况,我还需要为其实现分页和排序。

【问题讨论】:

【参考方案1】:

在当今的硬件上,可以轻松支持在列表、内存中保存 1000 行并进行排序。真正的问题是,您有多少可能使用键访问表存储中的行而不必进行表扫描。跨多个表复制行可能会变得非常麻烦。

另一种解决方案是将您的行临时暂存到 SQL Azure 中并在那里应用订单。如果您的结果集太大而无法在内存中工作,这可能会很有效。为了获得最佳结果,临时表需要有必要的索引。

【讨论】:

我倾向于在内存中进行排序,以后会担心它是否会成为瓶颈。 ...您的第二个建议很有趣。你做过这样的事吗?在不同存储之间传输数据本身似乎很慢。 我最近没有这样做。鉴于这可能在一个断开连接的世界中工作,并且考虑到跨多个实例的可扩展性,将结果集从表存储加载到每个请求的本地内存可能效率低下。相反,在 SQL Azure 中暂存将允许在一次加载后从多个实例访问数据。另一方面,如果您的实现基于具有有限数据集的单个实例,则加载到内存中就足够了。如果不符合预期,我会先尝试内存选项,然后再转到 SQL 选项。 我暂时先在内存中进行。我正在采取 [希望] 务实的方法让它工作,然后担心如果/当它成为问题时优化性能。 如果你在 Azure Storage 表中工作,跳到 SQL Azure 是一个需要避免的大锤。【参考方案2】:

Azure 存储按字典顺序保存实体,分区键作为主索引,行键作为辅助索引。一般来说,对于您的方案,听起来 UserId 非常适合分区键,因此您可以针对每个查询优化行键。

如果您希望用户在顶部看到最新的愿望清单,那么您可以使用日志尾部模式,其中您的行键将是用户输入愿望清单时日期时间的倒置日期时间刻度。 https://docs.microsoft.com/azure/storage/tables/table-storage-design-patterns#log-tail-pattern

如果您希望用户查看按项目名称排序的愿望清单,您可以将项目名称作为行键,这样实体自然会按 azure 排序。

当您写入数据时,您可能希望对数据进行非规范化并使用这些不同的行键模式进行多次写入。由于您将拥有与用户 ID 相同的分区键,因此您可以在该阶段执行批量插入操作而不必担心一致性,因为 azure 表批量操作是原子的。

为了区分不同的行键模式,您可能需要在每个模式前添加一个 const 字符串值。例如,您的倒勾行键值将类似于“InvertedTicks_[InvertedDateTimeTicksOfTheWishList]”,而您的项目名称行键值将是“ItemName_[ItemNameOfTheWishList]”

【讨论】:

【参考方案3】:

为什么不在 .net 中使用列表来完成所有这些工作。

对于这种类型的应用程序,我认为 SQL Azure 会更合适。

【讨论】:

在愿望清单的情况下,列表/IEnumerable 可能是合适的,但我还有其他类似的屏幕,其中可能有 1000 个结果。我不想在记忆中做所有这些。在这种情况下,由于成本优势,我使用表存储来支持 SQL Azure。 1000 行的内存并不多。此外,当您确定成本效益时,您需要考虑您的时间。如果您打算每月通过使用 SQL Azure 节省一个小时或更多时间,那么使用 SQL Azure 的成本效益要高得多。除非您正在处理大数据并且我的意思是巨大的,否则表存储相对于 SQL Azure 的成本优势并不等同。 我给了你一个+1。它并不总是与成本或大小有关。对于需要分离数据的多租户应用程序,创建存储表比创建数据库更容易、更快捷。【参考方案4】:

这样的东西对我来说很好用:

List<TableEntityType> rawData = 
    (from c in ctx.CreateQuery<TableEntityType>("insysdata") 
     where ((c.PartitionKey == "PartitionKey") && (c.Field == fieldvalue))
     select c).AsTableServiceQuery().ToList();
List<TableEntityType> sortedData = rawData.OrderBy(c => c.DateTime).ToList();

【讨论】:

这将对内存中的行进行排序 这忽略了包括范围内分页在内的原始问题,而不仅仅是排序。

以上是关于Azure 表存储:按顺序排列的主要内容,如果未能解决你的问题,请参考以下文章

按字母顺序排列的数据透视表

二分查找算法(JAVA)

Apache梁管道Java:记录未按顺序写入目标文件

按字母顺序排列单词

如何将 NSArray 拆分为按字母顺序排列的部分以与索引表视图一起使用

Clickhouse:按与表存储相同的顺序排列内存耗尽