gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:42:12 25 4
gpt4 key购买 nike

我正在尝试将自己的注意力从关系数据库设计中解放出来,转向 Azure 存储表,以开展我即将开展的大数据宠物项目。

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

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

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

谢谢。

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

最佳答案

您可以采用这两种方法。只是大声思考,以下是一些可能的方法:

方法 1:将成员(member)信息和历史记录保存在单个表中 (1)

其工作方式是,您将 PartitionKey 保留为成员的唯一标识符,将 RowKey 保留为成员信息更新时的时间戳。由于您希望获取有关该成员的最新信息,因此我建议您使用以下内容按时间倒序保留 RowKey:

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

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

这种方法的一个问题是,如果不知道成员的成员 ID,您就无法获取有关任何成员的当前详细信息。

方法 2:将成员(member)信息和历史记录保存在单独的表中

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

其工作方式是,您始终对 Members 表中的实体执行 InsertOrUpdate(或 InsertOrMerge)操作,而您始终对 MembersHistory 表中的实体执行 Insert 操作。

虽然这种方法更加简洁,并且使您能够提取有关所有成员的当前信息,但您将遇到的问题是,您无法利用 Azure 表存储中的事务功能,因为您正在处理有两张 table 。因此,可能会发生您的主表已更新但您的历史表无法更新的情况,因此您也必须应对这种情况。

方法 3:将成员(member)信息和历史记录保存在单个表中 (2)

在此方法中,对于主记录和历史记录,您可以将 PartitionKey 保留为成员 ID,但将主记录的 RowKey 保留为空,RowKey 作为历史表的时间戳(同样按时间倒序排列)。

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

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

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

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

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

RowKey == ''

请注意,上面的查询将进行全表扫描,因此请为连续 token 和一些性能下降做好准备。

关于Azure 存储表 - 实体版本历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23590681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com