在MySQL中对行进行版本控制

时间:2019-04-13 17:25:36

标签: mysql sql versioning

(在数据库管理员组上没有得到太多的答案,所以请在这里试试我的运气)

因此,我在“不可变”记录的脑海中有了这个概念,我确信这不是新颖的,但似乎找不到正确的google关键字。

基本上,历史行值需要保留为“过时”,但仍可作为旧记录中的FK引用。这些修改类型很少。我正在使用MySQL,这对事情有所限制。我看到的四种方法是:

天真

  • PK是自动生成的ID
  • obsolete_stamp是一个时间戳,指示行值是 已过时

缺点:历史数据已保留,但无法跟踪更改历史记录

更好

  • PK与上述相同
  • old_id是该行修改的行的ID(如果存在)
  • obsolete_stamp(如果行数据是最新的,则为null)

后果:新行是对旧行的修改,但是新行必须更新old_id(如果有的话)

审核

  • 更新触发器在审核表中创建新行

缺点:查询将需要检查审计表中是否有废弃的行

复合键:

  • id + obsolete_stamp

drawback:仅当行为'novel'(无历史记录)时,才能重新生成id;不清楚如何自动执行操作。

我正在采用“更好”选项,这是跟踪修订历史记录的最简单方法。

1 个答案:

答案 0 :(得分:2)

如何维护当前实体的表以及历史记录表?

您将使用on duplicate key update插入此表。它将具有一个自动递增的ID,用于标识每个实体。

它还会有一个insert / update触发器。当插入新行(或覆盖较旧的行)时,该行将被写入历史记录表。

历史记录表可以具有历史记录表的唯一ID,插入日期/时间以及所有感兴趣的列。该表中的行将永远不会被修改。