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

Mysql 如何在关系数据库中存储不同版本的数据?,mysql,sql,relational-database,Mysql,Sql,Relational Database,下面是一个示例,例如,我有一个名为Profile的表,有不同的列,如: id, firstName, secondName, address 通常,我会创建一个配置文件,其中包含完整的信息,数据库将如下所示: 1| Ted | WONG | Hong Kong | 之后,我可能会更新数据,如下所示 1| Ted | WONG | US | 将通过更新SQL命令更改数据,并且丢失以前的数据。那么,有没有办法让数据库跟踪以前的数据并维护当前的信息?谢谢。这可以通过存储所有历史数据并具有组列

下面是一个示例,例如,我有一个名为Profile的表,有不同的列,如:

id, firstName, secondName, address
通常,我会创建一个配置文件,其中包含完整的信息,数据库将如下所示:

 1| Ted | WONG | Hong Kong |
之后,我可能会更新数据,如下所示

 1| Ted | WONG | US |

<香港>将通过更新SQL命令更改数据,并且丢失以前的数据。那么,有没有办法让数据库跟踪以前的数据并维护当前的信息?谢谢。

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

然后,当您更新数据时,您永远不会更改它,您只需添加一个新的修订

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

1, Ted, Wong, Hong Kong, 1
2, Ted, Wong, US, 1
因此,要检索当前或上次修订,您需要选择适当的修订:

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

添加一个版本号列,该列随每次更新而增加,但保留相同的id。然后在检索给定id的最新行时,需要执行以下操作:

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

添加一个版本列作为要跟踪版本的每个表及其子表的第一列。该列应作为第一列添加到集群主键中。当前版本应始终具有version=0,以便更轻松地编写查询,并且不需要在每个查询上搜索MAXversion。确保所有子表也包含Version列,并在其外键中引用它。在更新之前,将所有相关表中的Version=0数据复制到Version=1。下一次更新将复制到Version=2,以此类推。最终,您将拥有Version=1中最旧的数据、Version=0中最新的数据和Version=X中最新的数据。通过这种方式,您可以创建复杂的数据库架构,控制数据版本,并能够通过将数据从Version=X复制到Version=0,将数据完全回滚到历史版本

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

版本,id,第一个名称,第二个名称,地址PK-VersionId,id

如果您有一个子表,如事务表,它将如下所示

版本,id,TransactionId,金额主键-版本id,id,TransactionId


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

但我使用id作为键来建立与其他表的关系,例如,我有一个带有profile_id的用户表,如果我这样做,当我有一个新版本时,我的profile表id会更改,用户表的profile_id指向一个不更新的数据。是的,正确,所以我认为在这种情况下,您需要更好地合理化数据库结构。选择不会更改的列并将其粘贴到第一个表中。然后,您可以将配置文件数据放在另一个表中,使用类似于mine或KAJ的方案,并使用最新版本或版本号对数据执行连接。我希望它是通过更新而不是更改来更改的-您使用的是什么数据库?您是对的,我只是键入了错误。MySQL。我添加了这个标签并删除了我的答案,因为我认为它不会对MySQL起作用。在每个查询上执行maxverionNo会在获得大量数据时真正影响性能。我做了一些类似的事情,只是我更喜欢将版本0设置为最新版本,并在任何更新之前将所有数据归档到版本X。它使查询变得更简单。
where versionNo = (select max(versionNo) from table where id = <outerTableAliasOrVariable>.id)