保留数据修订的历史记录 - 最佳实践?

Keeping history of data revisions - best practice?

提问人:Gacek 提问时间:12/15/2016 更新时间:12/15/2016 访问量:964

问:

考虑一个数据库,其中包含多个 (3-4) 个表,其中包含大量列(从 15 到 40)。在每个表中,我们每年都会生成几千条记录,并且对每条记录进行了大约十几个更改。

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

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

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


  1. 对于每个跟踪表,我们都有一个具有相同列的镜像表,以及保存有关版本信息的附加列(即时间戳、“原始”行的 ID 等......

优点:

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

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

缺点:

  • 我们需要为每个跟踪表创建一个额外的镜像表。

  1. 我们为“历史”修订创建一个表。我们保留一些修订信息,如时间戳等,并且还保留数据来源的跟踪。但是原始数据行存储在 JSON 中的大文本列中。

优点:

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

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

缺点:

  • 在更改原始表的结构(即添加了新列)后尝试还原数据时,可能会出现一些向后兼容性问题

  1. 也许是其他解决方案?

在这样的系统中保留版本历史记录的最佳方法是什么?

附加信息:

  • 每个跟踪的表将来都可以更改(即添加新列),

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

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

与数据库 语言无关

评论


答:

0赞 Dean J 12/15/2016 #1

您需要多久访问一次审核数据?存储成本是否是一个问题?您是否需要它与需要普通数据的系统相同?

基本上,有一个名为 foo 的表和另一个名为 foo_log 的表并不少见。它还允许您将foo_log存储在不同的位置,甚至可能是辅助数据库。如果 foo_log 在心轴磁盘上,而 foo 在闪存上,您仍然可以获得快速读取,但您可以获得更便宜的备份存储。

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

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

评论

0赞 Gacek 12/15/2016
不,问题不在于备份,而在于编辑。存储的数据是客户表格,可以由工作人员编辑(发送到财务部门等)。我们需要跟踪任何工作人员所做的每一次更改,并能够将其还原。我们几乎从不直接访问记录/历史数据 - 只有在其中一个工人搞砸得非常严重的情况下才会这样做。