保持数据修订的历史 - 最佳实践?

时间:2016-12-14 21:56:33

标签: database language-agnostic

考虑一个包含多个(3-4)表的数据库,这些表有很多列(从15到40)。在每个表中,我们每年生成数千条记录,并为每条记录进行大约十几条更改。

现在我们需要为我们的系统添加以下功能:每当用户对其中一个表的记录进行更改时,系统需要跟踪它 - 我们需要有完整的更改历史记录能够将行数据恢复到选定点。

由于某些原因,我们无法在同一个表中保留“最终”和“历史”数据(因此我们无法在表格中添加一些列来保留某种版本信息,就像wordpress在保存编辑历史时所做的那样的帖子)。

解决这个问题的最佳方法是什么?我在想两个解决方案:

  1. 对于每个跟踪表,我们都有一个具有相同列的镜像表,并且还有其他列,用于保存有关版本的信息(即时间戳,“原始”行的ID等...)
  2. 优点:

    • 我们的数据存储方式与原始表中的数据完全相同

    • 每当我们需要向原始表添加新列时,我们都可以对镜像表执行相同的操作

    缺点:

    • 我们需要为每个跟踪表创建一个额外的镜像表。
    1. 我们为“历史”修订创建一个表。我们保留一些修订信息,如时间戳等,并且我们保持跟踪数据来自哪个表。但原始数据行存储在JSON中的大文本列中。
    2. 优点:

      • 我们只有一个所有跟踪表的历史记录表

      • 每次添加新的跟踪表时,我们都不需要创建新的镜像表,

      缺点:

      • 在更改原始表的结构(即添加了新列)后尝试还原数据时可能会出现一些向后兼容性问题。
      1. 也许其他一些解决方案?
      2. 在这样的系统中保留版本历史的最佳方法是什么?

        其他信息:

        • 将来每个跟踪表都会发生变化(即添加新列),

        • 将来可以更改跟踪表的数量(即添加了新表)。

        仅供参考:我们正在使用laravel 5.3和mysql数据库。

1 个答案:

答案 0 :(得分:0)

您需要多久访问一次审核数据?存储成本是否值得关注?您是否需要在需要普通数据的同一系统中使用它?

基本上,拥有一个名为foo的表和一个名为foo_log的第二个表并不常见。它还允许您以不同的方式存储foo_log,甚至可能是辅助DB。如果foo_log在主轴磁盘上并且foo在闪存上,你仍然可以快速读取,但是你可以获得更便宜的备份存储。

如果你不需要显示这些数据,只是出于法律原因需要它,或者弄清楚出了什么问题,单表并不是一个糟糕的计划。

但如果问题是备份,听起来可能是这样,为什么不定期备份MySQL数据库并将备份存储在其他地方呢?