【问题标题】:Versioning rows in MySQLMySQL 中的版本控制行
【发布时间】:2019-04-13 17:25:36
【问题描述】:

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

所以我在“不可变”记录的脑海中产生了这个概念,我确信这并不新颖,但似乎无法找到正确的 google 关键字。

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

天真

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

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

更好

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

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

审核

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

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

复合键:

  • id + obsolete_stamp

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

我正在继续使用“更好”选项,这似乎是跟踪修订历史的最简单方法。

【问题讨论】:

    标签: mysql sql versioning


    【解决方案1】:

    如何维护当前实体的表和历史表?

    您将使用on duplicate key update 插入此表。它会有一个自动递增的 id 来标识每个实体。

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

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

    【讨论】:

    • Gordon,我认为这与审计表相似,但又不一样。我能看到的唯一缺点是需要查询两个表才能找到一行:当前数据表和审计数据表。但是,每种解决方案都有其权衡。顺便说一句,我没有考虑过on duplicate key update 的想法。这可能很有用。
    • @JeffLowery 。 . .一点也不。创建行时,您将在审计表中插入该行。它在两个表中。
    • 对,我错过了。
    猜你喜欢
    • 2011-09-11
    • 2010-12-27
    • 1970-01-01
    • 2015-03-10
    • 2012-11-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多