有没有办法从表中获取不同的PartionKeys

cta*_*cke 14 .net azure azure-table-storage

目前,我正在使用PartitionKey来区分将数据存储到Azure Table Services的设备.我想构建一个允许我浏览该数据的查看器,但能够构建它以便我可以"通过设备"或通过PartitionKey查看数据会很好.查看器应用程序将不知道存在哪些设备,因此如果我能以某种方式返回给定表中的不同PartionKeys列表,那将会很棒.这是可能的,还是我将被降级为创建一个元数据表,我为每个设备插入一个新行,然后使用它进行查询?

dan*_*ofo 13

创建一个表来存储您的分区.按您使用的表名对表进行分区,并为您创建的每个分区添加一个条目.

public class PartitionEntry : TableServiceEntity { }

tableServiceContext.AddObject("TablePartitions", new PartitionEntry
{
    PartitionKey = "<table name>",
    RowKey = "<partition key>",
});
tableServiceContext.BeginSaveChanges(SaveChangesOptions.ContinueOnError, null, null);
Run Code Online (Sandbox Code Playgroud)

然后只查询此表以获取分区列表.这对我来说非常易于管理.

var tbl = tableServiceContext.CreateQuery<PartitionEntry>("TablePartitions");
return tbl.Where(i => i.PartitionKey == "<table name>")
          .Select(i => new { PartitionKey = i.RowKey, });
Run Code Online (Sandbox Code Playgroud)

我打赌这可以优化.


Jud*_*her 7

我认为没有办法检索所有分区键.不过,这是一个聪明的解决方法:http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/23/retrieving-partition-key-range-in-windows-azure-table-storage.aspx

引用Avkash的博客:

进一步挖掘,我发现没有内置的API来获取分区键列表,而是我必须为自己创建一个解决方案.所以我最终在每个分区中插入一个虚拟行,当我想获得一个分区键列表时,我只是查询那些虚拟项目,他们给了我正在寻找的列表.

我相信你已经看过这个,但对于其他可能在这个问题上发生的人,我认为这是表服务功能的最佳指南:http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables /带有示例和指向详细API文档的链接.

  • 这种方法不会导致全表扫描吗?更好的方法是为每个分区(设备)创建一个单独的表,或者创建一个只包含每个设备的信息的表(主要详细方法的种类). (8认同)
  • @GauravMantri - 是的,我认为它可能导致整个表扫描.我想这是一个问题,你是想在创建和管理附加表时减少开销,还是在执行扫描时更高效 - 这取决于你的用例和数据量.你不需要一个单独的表 - 一个索引分区除了其他分区的密钥之外什么都没有. (4认同)
  • 没有办法返回所有分区(今天).您必须扫描整个表才能知道.使用计算分区键的元数据或通用算法. (2认同)

Kar*_*rie 5

遗憾的是,Azure 表没有不同的功能或其他功能 - 将其视为基于键的结构化存储,如内存中的字典。您执行的任何操作都必须遍历所有项目才能获得它们的子集,除非知道要首先加载哪些键并处理该子列表。

我个人会简单地使用第二个 azure 表并将分区键存储在那里(作为行键),然后让您有机会按另一个因素对它们进行分组。或者简单地为第二个表使用单个分区键。

这将为您提供最佳性能和最少的头痛。

有时,最简单的方法是最好的方法,因为您可以完成工作。

希望这可以帮助,