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

时间:2012-02-28 06:21:14

标签: mysql sql relational-database

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

id, firstName, secondName, address

通常,我在信息中创建一个完整的配置文件,数据库将变为这样:

 1| Ted | WONG | Hong Kong |
之后,我可以像这样更新数据

 1| Ted | WONG | US |

数据Hong Kong将被UPDATE SQL命令更改,我将丢失以前的数据。那么,有没有办法让数据库跟踪以前的数据并维护当前的信息?感谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

这可以通过存储所有历史数据并具有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

答案 2 :(得分:1)

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

在您的情况下,您的新表结构将是......

版本,ID,firstName,secondName,地址(PK- VersionId,id)

如果你有一个子表,就像一个事务表,它看起来像这样......

版本,ID,TransactionId,金额(PK- VersionId,id,TransactionId)

我已经使用这种方法来维护数据版本,而无需额外的表来支持它。