2012-03-28 45 views
4

我的同事和我当前正在为产品实现撤销/重做功能。我们使用命令模式并在表'ProductHistory'中保存每个命令(例如,创建组件'myFancyComponent')作为TableStorageEntry。本表中的PartitionKey是唯一的产品名称,RowKey是一个唯一的标识符。从Azure表中删除数百个实体存储

问题是如果产品被删除,它也应该删除表存储中的整个历史记录。使用批量删除会变得非常复杂,因为有几个限制: 100个实体或最大4 MB(无论是更小的)。这个问题有什么最佳实践吗?或者是唯一的解决方案来查询所有条目并检查条目的大小,并批量删除正确数量的条目?

我也发现这个相似的question,并考虑为每个产品创建一个表。它似乎有这种做法的一些优点:

  • 选择应该会更快,因为只有一个表将被查询
  • 删除很容易,只需要删除整个表

只有缺点我发现(在“Windows Azure的表” - 白皮书):

  • 需要注意的是,当一个表被删除,同一个表名不能被重新创建至少30秒,而表被垃圾收集。

如果我创建几百个表,是否还有其他(性能)问题?

回答

8

我强烈建议每个产品的单一表的方法,正如你指出的那样,它将迅速消除批量删除交易的需要,如果你想删除30秒的限制,你只需要一个索引表存储表和他们的产品之间的关系。然后,您可以将产品标记为已删除,并在重新添加时重新分配其表格。从而允许30秒限制的简单旁路。另一种方法(我也推荐)是将产品的添加分离,以便异步发生,从而允许您在名称再次可用时等待创建表。

至于性能问题,即使您拥有数千个表,但不会超出Azure存储帐户上每秒最多5千次的事务限制。 :)

+0

你能详细说明解决30秒限制的第二种方法吗?您是否建议创建产品,但不建议使用表格,并在稍后删除旧表格时创建表格? – Robar 2012-03-28 11:47:59

+0

实现规模的努力取决于停止“实时”操作。排队创建新产品的请求,并在完成后直接向用户发送消息。是的,我们习惯于即时满足,但这种方法更具可扩展性,并且还可以解决您的30秒等待时间限制。 :) – BrentDaCodeMonkey 2012-03-28 17:05:58

相关问题