提问人:Gacek 提问时间:12/15/2016 更新时间:12/15/2016 访问量:964
保留数据修订的历史记录 - 最佳实践?
Keeping history of data revisions - best practice?
问:
考虑一个数据库,其中包含多个 (3-4) 个表,其中包含大量列(从 15 到 40)。在每个表中,我们每年都会生成几千条记录,并且对每条记录进行了大约十几个更改。
现在,我们需要向系统添加以下功能:每次用户对我们的一个表的记录进行更改时,系统都需要对其进行跟踪 - 我们需要拥有完整的更改历史记录,并且能够将行数据恢复到选定点。
由于某些原因,我们不能将“最终”和“历史”数据保存在同一个表格中(因此我们不能在表格中添加一些列来保留某种版本信息,即就像 wordpress 在保留帖子的编辑历史时所做的那样)。
解决这个问题的最佳方法是什么?我正在考虑两种解决方案:
- 对于每个跟踪表,我们都有一个具有相同列的镜像表,以及保存有关版本信息的附加列(即时间戳、“原始”行的 ID 等......
优点:
我们的数据存储方式与原始表中的存储方式完全相同
每当我们需要向原始表添加新列时,我们都可以对镜像表执行相同的操作
缺点:
- 我们需要为每个跟踪表创建一个额外的镜像表。
- 我们为“历史”修订创建一个表。我们保留一些修订信息,如时间戳等,并且还保留数据来源的跟踪。但是原始数据行存储在 JSON 中的大文本列中。
优点:
对于所有跟踪的表,我们只有一个历史记录表
我们不需要在每次添加新的跟踪表时都创建新的镜像表,
缺点:
- 在更改原始表的结构(即添加了新列)后尝试还原数据时,可能会出现一些向后兼容性问题
- 也许是其他解决方案?
在这样的系统中保留版本历史记录的最佳方法是什么?
附加信息:
每个跟踪的表将来都可以更改(即添加新列),
跟踪表的数量将来可能会更改(即添加新表)。
仅供参考:我们正在使用 laravel 5.3 和 mysql 数据库。
答:
您需要多久访问一次审核数据?存储成本是否是一个问题?您是否需要它与需要普通数据的系统相同?
基本上,有一个名为 foo 的表和另一个名为 foo_log 的表并不少见。它还允许您将foo_log存储在不同的位置,甚至可能是辅助数据库。如果 foo_log 在心轴磁盘上,而 foo 在闪存上,您仍然可以获得快速读取,但您可以获得更便宜的备份存储。
如果您不需要显示这些数据,而只是出于法律原因需要它,或者为了弄清楚出了什么问题,那么单表并不是一个可怕的计划。
但是,如果问题是备份,这听起来像是备份,为什么不定期备份MySQL数据库并将备份存储在其他地方呢?
评论
上一个:如何“锁定”正在处理的数据库行
下一个:声明式数据结构查询语言
评论