我正试图摆脱关系数据库设计,进入Azure存储表,为即将开始的大数据宠物项目。
我的第一个问题是记录我的实体的版本历史。
假设我有一个名为Members的表,我希望能够看到以前版本的成员详细信息,我可以将PartitionKey设置为其成员编号,然后将日期时间戳的RowKey设置为更新吗?
这是解决此版本历史问题的有效/推荐方法吗?
感谢。
更新: 或者我会更好地将最新的条目存储在成员表中,然后有一个成员“历史”表来记录这些变化?
答案 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 == ''
请注意,上面的查询将执行全表扫描,因此请为持续令牌和性能降低做好准备。