(在数据库管理员组中没有得到太多答案,所以在这里试试运气)
所以我的“不可变”记录脑子里有这个概念,我确信这并不新颖,但似乎无法找到正确的谷歌关键字。
基本上,历史行值需要保留为“过时”,但仍可作为旧记录中的 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/