mysql - MySQL 中的行版本控制

标签 mysql sql versioning

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

所以我的“不可变”记录脑子里有这个概念,我确信这并不新颖,但似乎无法找到正确的谷歌关键字。

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

天真

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

缺点:历史数据被保留,但无法跟踪历史变化

更好:

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

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

审核:

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

缺点:查询需要检查审核表中是否有过时的行

复合键:

  • id + obsolete_stamp

缺点:只有当行是“新颖”(没有历史记录)时,才能重新生成 id;不清楚如何自动执行此操作。

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

最佳答案

维护当前实体表和历史表怎么样?

您可以使用重复键更新插入此表。它将有一个自动递增的 id 来标识每个实体。

它还有一个插入/更新触发器。当插入新行(或覆盖旧行)时,该行将被写入历史表。

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

关于mysql - MySQL 中的行版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55668092/

相关文章:

mysql - 嵌套集合模型的两侧配对?从家长的角度

sql - 如何从多列分组中返回一行

git - 有条件的 Gitignore

android - 我可以从 alpha 测试 channel 获得较低版本的代码吗

MySQL 对两个表字段求和并更新

sharepoint - 共享点版本控制是否存储在 Excel 文档的文档中?

Java MySQL 空结果集

mysql - 没有内联子查询的多月列

mysql - 从 R 插入 MySQL

sql - 用两个整数设置主键