Azure表存储中的复合rowkey

时间:2013-06-04 08:46:49

标签: windows azure storage composite

我想将一些Azure SQL表移动到表存储。据我所知,我可以将所有内容保存在同一个表中,使用PartitionKey将其分开并使用Rowkey在每个分区中保持唯一。 现在,我有一个带复合键的表:

  • ParentId:(uniqueidentifier)
  • ReportTime:(datetime)

我也理解RowKeys必须是字符串。我需要将它们组合在一个字符串中吗?或者我可以通过其他方式组合多个键吗?我是否需要制作新钥匙?

感谢任何帮助。

更新

我的想法是从几个(现在三个)数据库表中放入数据并放入相同的存储表中,用分区键分隔它们。

我将使用ParentId和WeekNumber(另一列)进行查询。此表有大约100万行,每周从数据库中删除。我的另外两张表有大约600万和350万

2 个答案:

答案 0 :(得分:3)

这个问题相当广泛,没有正确的答案。

具体问题 - 您可以将复合键与Azure表存储一起使用。是的,你可以这样做。但这涉及手动序列化/反序列化对象的属性。您可以通过覆盖TableEntity的ReadEntityWriteEntity方法来实现这一目标。检查this detailed blog post,了解如何覆盖这些方法以使用自己的自定义序列化/反序列化。

我将进一步讨论我对更广泛问题的看法。

首先,为什么要将3(SQL)表中的数据放入一个(Azure表)?只需要3个Azure表。

第二个想法,正如Fabrizio指出的那样,你将如何查询记录。因为Windows Azure Table服务只有一个索引,那就是PartitionKey + RowKey属性(列)。如果您确定自己主要通过已知 PartitionKeyRowKey查询数据,那么Azure Tables非常适合您!但是你说RowKey的组合是ParentId + WeekNumber!这意味着此组合识别的记录唯一!如果这是真的,那么你就更愿意去了。

接下来你说你将每周删除记录!您应该知道DELETE操作对单个实体起作用。您可以使用Entity Group Transactions一次删除多个实体,但限制为(a)批处理操作中的所有实体必须具有相同的PartitionKey(b)最大数量每批实体为100,(c)批处理操作的最大大小为4MB。假设你有1M的记录,就像你说的那样。为了删除它们,你必须首先将它们按组检索100,然后按组100删除。最好的情况是10k操作检索和10k操作删除。事件,如果只花费0.002美元,请考虑对REST API执行10k操作所花费的时间。

由于您必须定期删除实体(固定为WeekNumber),我建议您动态创建表并在其名称中包含周数。因此,您将实现:

  • 更好的信息分区
  • 更轻松,更精细的信息备份/删除
  • 删除数百万个实体只需要一个操作 - 删除表。

答案 1 :(得分:1)

您的问题没有独特的解决方案。是的,您可以将ParentID用作PartitionKey,将ReportTime用作Rowkey(或反转赋值)。但重要的两个主要问题是:您如何查询您的数据,具体条件是什么?你存储了多少数据? 1000,100万件物品,1000万件物品?总存储使用量很重要。但是,考虑将为存储生成的事务数量也非常重要。