2

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

  • ParentId:(唯一标识符)
  • 报告时间:(日期时间)

我也明白 RowKeys 必须是字符串。我需要将这些组合成一个字符串吗?或者我可以通过其他方式组合多个键吗?我是否需要制作新钥匙?

任何帮助表示赞赏。

更新

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

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

4

2 回答 2

3

这个问题非常广泛,没有正确答案。

具体问题 - 您可以将复合键与 Azure 表存储一起使用。是的,你可以这么做。但这涉及到对象属性的手动序列化/反序列化。您可以通过重写 TableEntity 的ReadEntityWriteEntity方法来实现。查看这篇详细的博客文章,了解如何覆盖这些方法以使用您自己的自定义序列化/反序列化。

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

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

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

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

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

  • 更好的信息划分
  • 更轻松、更细粒度的信息备份/删除
  • 删除数百万个实体只需要一项操作 - 删除表。
于 2013-06-04T11:05:08.917 回答
1

您的问题没有唯一的解决方案。是的,您可以使用 ParentID 作为 PartitionKey 和 ReportTime 作为 Rowkey(或反转分配)。但是有两个主要问题是:如何查询数据,在什么条件下?你存储了多少数据?1000、100 万件、10 亿件?总存储使用量很重要。但考虑您将生成到存储的事务数量也非常重要。

于 2013-06-04T09:34:24.390 回答