繁体   English   中英

如何在关系数据库中存储不同版本的数据?

[英]How to store different version of data in a relational database?

这是示例,例如,我有一个名为Profile的表,并且具有不同的列,例如:

id, firstName, secondName, address

通常,我创建一个配置文件,其中包含所有信息,数据库将变成这样:

 1| Ted | WONG | Hong Kong |

之后,我可能会像这样更新数据

 1| Ted | WONG | US |

Hong Kong的数据将被UPDATE SQL命令更改,而我无法跟踪以前的数据。 那么,有什么方法可以让数据库跟踪以前的数据并维护当前的信息? 谢谢。

添加随每次更新而增加但保留相同ID的版本号列。 然后,在获取给定ID的最新行时,您需要执行

where versionNo = (select max(versionNo) from table where id = <outerTableAliasOrVariable>.id)

将“版本”列添加为要跟踪版本的每个表及其子表的第一列。 该列应作为第一列添加到群集主键中。 当前版本应始终具有Version = 0,以使编写查询更加容易,并且不需要在每个查询中都搜索MAX(version)。 确保所有子表还包含“版本”列,并在其外键中对其进行引用。 更新之前,将所有相关表中的Version = 0数据复制到Version = 1。 下次更新将复制到Version = 2,依此类推。 最终,您将在Version = 1中拥有最旧的数据,在Version = 0中拥有最新的数据,而在Version = X中拥有最新的数据。 这样,您可以制作复杂的数据库架构,控制数据版本,并可以通过将数据从Version = X复制到Version = 0来将数据完全回滚到历史版本。

就您而言,您的新表结构将是...

版本,ID,名字,第二名,地址(PK-版本ID,ID)

如果您有一个子表(例如事务表),它将看起来像这样……

版本ID,交易ID,金额(PK版本ID,ID,交易ID)

我使用这种方法来维护数据版本,而不必制作额外的表来支持它。

这可以通过存储所有历史数据并具有一个group列来实现:

id, firstname,secondname, address, group

然后当你更新你从来数据ALTER它,你只需要添加一个新的修订。

因此,您的表将如下所示:

1, Ted, Wong, Hong Kong, 1
2, Ted, Wong, US, 1

因此,要检索当前(或上一个)修订,您需要选择适当的修订:

SELECT TOP 1 * FROM <table> WHERE Group = 1 ORDER BY id DESC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM