Mar*_*kes 4 azure azure-storage azure-table-storage
我正在努力使自己脱离关系数据库的设计,进入即将开始的大数据宠物项目的Azure存储表。
我的第一个问题是关于记录实体的版本历史。
假设我有一个名为Members的表,我希望能够看到以前版本的成员详细信息,我可以将PartitionKey设置为其成员编号,然后将其更新的日期时间戳的RowKey设置吗?
这是解决此版本历史记录问题的有效/推荐方法吗?
谢谢。
更新:或者我最好将最新条目存储在members表中,然后有一个记录更改的成员“ history”表?
您可以采用两种方法。只是大声思考,这里是一些可能的方法:
方法1:将成员信息和历史记录保存在一个表中(1)
这将起作用,您将保留PartitionKeyas成员的唯一标识符和RowKeyas时间戳(自成员信息更新起)。由于您希望获取有关该成员的最新信息,因此我建议您RowKey使用类似以下内容的时间顺序相反:
var rowKey = (DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks).ToString("d20");
Run Code Online (Sandbox Code Playgroud)
要获取有关成员的最新信息,您将仅获取给定行PartitionKey(即成员ID)的一行。要获取有关成员的完整历史记录,您只需获取所有行。
这种方法的一个问题是,您无法在不知道其成员ID的情况下获取有关任何成员的当前详细信息。
方法2:将成员信息和历史记录保存在单独的表中
在这种方法中,您将维护两个表-一个用于成员信息(称为Member),另一个用于成员历史记录(称为MemberHistory)。的PartitionKey在Member表可以是部件ID和行密钥可以是任意值(或者甚至null值)。的PartitionKey在MemberHistory表将是部件ID和RowKey当信息被更新将是时间戳。同样,您希望按相反的时间顺序存储它们。
这种方法的工作方式是,您始终对表中的实体执行InsertOrUpdate(或InsertOrMerge)操作Members,而始终Insert对MembersHistory表中的实体执行操作。
尽管此方法更加整洁,并且使您能够提取有关所有成员的当前信息,但是您将遇到的问题是,由于您要处理两个表,因此无法利用Azure表存储中的事务功能。因此,可能会发生主表被更新而历史表无法更新的情况,因此您也必须涵盖该情况。
方法3:将会员信息和历史记录保存在一个表中(2)
在这种方法中,对于主记录和历史记录,您将保留PartitionKeyas成员ID,但将RowKey主记录的as 保留为空RowKey,并将历史记录表的时间戳记为时间戳(再次按相反的时间顺序)。
要查询成员的当前记录,您可以查询类似(伪代码)的信息:
PartitionKey == 'Member ID' && RowKey == ''
Run Code Online (Sandbox Code Playgroud)
要查询成员的历史记录,您可以查询类似(伪代码)的信息:
PartitionKey == 'Member ID' && RowKey != ''
Run Code Online (Sandbox Code Playgroud)
要查询所有成员的当前记录,您可以查询类似(伪代码)的信息:
RowKey == ''
Run Code Online (Sandbox Code Playgroud)
请注意,上面的查询将进行全表扫描,因此请为连续令牌和性能下降做好准备。
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |