Azure存储表 - 实体版本历史记录

时间:2014-05-11 08:48:00

标签: azure azure-storage azure-table-storage

我正试图摆脱关系数据库设计,进入Azure存储表,为即将开始的大数据宠物项目。

我的第一个问题是记录我的实体的版本历史。

假设我有一个名为Members的表,我希望能够看到以前版本的成员详细信息,我可以将PartitionKey设置为其成员编号,然后将日期时间戳的RowKey设置为更新吗?

这是解决此版本历史问题的有效/推荐方法吗?

感谢。

更新: 或者我会更好地将最新的条目存储在成员表中,然后有一个成员“历史”表来记录这些变化?

1 个答案:

答案 0 :(得分:4)

你可以采取两种方法。只是大声思考,这里有一些可能的方法:

方法1:将会员信息和历史保存在一个表格中(1)

这样做的方法是将PartitionKey作为成员的唯一标识符,将RowKey作为成员信息更新时的时间戳。由于您希望获得有关该成员的最新信息,我建议您使用以下内容按时间顺序保持RowKey

var rowKey = (DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks).ToString("d20");

要获取有关成员的最新信息,您只需获取给定PartitionKey的一行(即成员ID)。要获取有关成员的完整历史记录,您只需获取所有行。

此方法的一个问题是,您无法在不知道其成员ID的情况下获取有关任何成员的当前详细信息。

方法2:将会员信息和历史记录保存在单独的表格中

在这种方法中,您将保留两个表 - 一个用于成员信息(让我们称之为Member),另一个表用于成员历史记录(让我们称之为MemberHistory)。 PartitionKey表中的Member可以是成员ID,行键可以是任意值(甚至null值)。 PartitionKey表中的MemberHistory将是成员ID,RowKey将是更新信息时的时间戳。同样,您可能希望以反向时间顺序存储它们。

这样做的方法是始终对InsertOrUpdate表中的实体执行InsertOrMerge(或Members)操作,而您始终执行Insert操作MembersHistory表中的实体。

虽然这种方法更简洁并且使您能够提取有关所有成员的当前信息,但您将遇到的问题是,您无法利用Azure表存储中的事务功能,因为您&# 39;重新处理两个表格。因此,您的主表可能会更新,但您的历史记录表无法更新,因此您也必须覆盖该场景。

方法3:将会员信息和历史保存在一个表格中(2)

在此方法中,对于主记录和历史记录,您应将PartitionKey保留为成员ID,但将RowKey保留为主记录为空,将RowKey保留为时间戳(再次以反向时间顺序)为历史表。

要查询成员的当前记录,您可以查询类似(伪代码)的内容:

PartitionKey == 'Member ID' && RowKey == ''

要查询成员的历史记录,您可以查询类似(伪代码)的内容:

PartitionKey == 'Member ID' && RowKey != ''

要查询所有成员的当前记录,您可以查询类似(伪代码)的内容:

RowKey == ''

请注意,上面的查询将执行全表扫描,因此请为持续令牌和性能降低做好准备。