2012-02-28 41 views
2

这里是例子,比如我有一个表叫Profile,并且有不同的栏目,如:如何在关系数据库中存储不同版本的数据?

id, firstName, secondName, address 

通常,我创建一个配置文件,全面的信息,并且数据库将成为这样的事情:

1| Ted | WONG | Hong Kong | 

在那之后,我可以更新数据,这样

1| Ted | WONG | US | 

数据Hong Kong将由UPDATE SQL命令更改,并且我失去了以前的数据跟踪。那么,有没有办法让数据库跟踪以前的数据并保持当前的信息?谢谢。那么当你更新数据你永远ALTER它,你只需要添加一个新的修订

id, firstname,secondname, address, group 

+0

我希望它是通过'UPDATE'而不是'ALTER'改变的 - 你使用的是哪个数据库? – 2012-02-28 07:23:25

+0

你是对的,我只是输入错误。 MySQL的。 – DNB5brims 2012-02-28 07:46:48

+0

我已经添加了该标记并删除了我的答案,因为我不认为这会对MySQL起作用。 – 2012-02-28 07:48:04

回答

1

这可以通过存储所有历史数据,并具有group柱来实现。

所以,你的表将如下所示:

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

所以检索需要选择适当的修订当前(或上次)的修订:

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

但我使用id作为与其他表的关系的关键字,例如,我有一个带有profile_id的用户表,如果我这样做,当我有新版本时,我的个人档案表id被更改,用户表的profile_id指向不更新数据。 – DNB5brims 2012-02-28 06:52:11

+0

是的,所以我需要更好地理顺你的数据库结构。选择不会更改的列,并将其粘在第一个表中。然后,您可以将配置文件数据放在另一个表格中,并使用类似于我的或KAJ的配置文件,并使用最新版本或版本号 – Simon 2012-02-28 10:12:02

3

添加一个版本号每次更新时增加的列,但保留相同的ID。然后检索最新的行为给定ID,当你需要做一个

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

对数据执行连接。每次查询时执行max(verionNo)可能会使性能下降获取大量数据。我做了类似的事情,除了我更喜欢将版本0作为最新版本并在任何更新之前将所有数据归档到版本X之外。它使查询更简单。 – 2012-12-19 19:38:06

1

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

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

版本,编号,名字,secondName,地址(PK-VERSIONID,ID)

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

版本,ID,TRANSACTIONID,金额(PK-VERSIONID,ID,TRANSACTIONID)

我有ü sed这种维护数据版本的方法,而不必额外创建表来支持它。

相关问题