mysql - MySQL 中的版本控制行
问题描述
(在数据库管理员组上没有得到太多答案,所以在这里试试我的运气)
所以我在“不可变”记录的脑海中就有了这个概念,我确信这并不新颖,但似乎无法找到合适的谷歌关键字。
基本上,历史行值需要保留为“过时”,但仍可作为旧记录中的 FK 引用。这些类型的修改很少见。我正在使用 MySQL,这有点限制。我看到的四种方法是:
幼稚的
- PK 是自动生成的 ID
- obsolete_stamp 是指示行值已过时的时间戳
缺点:保留历史数据,但无法跟踪更改历史
更好:
- PK同上
- old_id 是该行修改的行的 id(如果存在)
- obsolete_stamp(如果行数据是当前的,则为 null)
结果:新行是对旧行的修改,但新行必须更新 old_id(如果有的话)
审计:
- 更新触发器在审计表中创建新行
缺点:查询需要检查审计表中是否有过时的行
复合键:
- id + obsolete_stamp
缺点:id不能重新生成,只有当行是'novel'(没有历史);不清楚如何自动执行此操作。
我正在继续使用“更好”选项,这似乎是跟踪修订历史的最简单方法。
解决方案
如何维护当前实体的表和历史表?
您将使用on duplicate key update
. 它将有一个自动递增的 id 来标识每个实体。
它还有一个insert
/update
触发器。当插入新行(或覆盖旧行)时,该行将被写入历史表。
历史表可以具有历史表的唯一 ID、插入日期/时间和所有感兴趣的列。此表中的行永远不会被修改。
推荐阅读
- spring - 增加和减少按钮怎么做?
- laravel - 带有关系模型的 Laravel 策略
- maven - 具有完整 jar 名称的 Maven 复制依赖项
- python - 如何训练在线回归模型
- python - 使用 keras 进行训练总是在同一时期崩溃(或多或少)
- c# - 使用 NSwag.MSBuild 时的循环问题
- android - 在 xml 中设置翻译动画的持续时间
- java - 是否可以将浏览器的当前 URL 保存在 txt/csv 文件中?
- javascript - 分组复选框并有条件地显示输入字段
- azure - 列出 Azure 资源组、租户或订阅中的所有 DNS (FQDN)