Mysql SQL数据库中数据修订控制的最佳实践

Mysql SQL数据库中数据修订控制的最佳实践,mysql,sql,postgresql,Mysql,Sql,Postgresql,我的整个数据库偶尔会有错误的条目,但我不想直接修改数据,而是希望能够对更改进行修订 这些变化很少发生 理想情况下是这样的:- (original table fields) | revision_version | origin | user | timestamp 假设我有一个名为posts的表,其模式如下:- title | description | timestamp | author 因此,将创建一个名为posts_revisions的附加表:- title | descript

我的整个数据库偶尔会有错误的条目,但我不想直接修改数据,而是希望能够对更改进行修订

这些变化很少发生

理想情况下是这样的:-

 (original table fields) | revision_version | origin | user | timestamp
假设我有一个名为posts的表,其模式如下:-

title | description | timestamp | author
因此,将创建一个名为posts_revisions的附加表:-

title | description | timestamp | author | revision_version | origin | user | timestamp
来源是变更的来源,无论是机器人、用户生成的还是您拥有的。
可以想象,这是对现有数据库的一个相当大的更改,我当前关心的是检查每个查询的_revisions表的性能影响。这是这类事情的最佳实践吗?

如果表用于摘要目的,尤其是业务用户,如果他们有一些SQL访问权限,我认为最好删除数据并将其放在另一个表中。虽然标记和修订有时很好,但当您必须按照select sumselect someVar(其中revision\U version=maxrevision\U version和someID=ID)的思路执行某些操作时,它实际上已经超出了简单的范围


如果您有一个用于快速收集数据的表,请替换数据,如果需要,将旧数据放入修订表中。如果只有某个应用程序会访问它,并且它不是性能问题,则将其保留在主表中。

对于此类问题,我保留一个当前表和一个历史记录表

历史记录表具有以下附加列:

历史类 生效日期 结束日期 版本号 创造的 创建数据 生效日期和结束日期是值有效的时间跨度。每次记录发生更改时,版本都会增加。id、CreatedAt和CreatedBy是我放入数据库中几乎每个表中的列

通常,我使用夜间作业来更新历史记录表,这些作业比较表,然后使用合并来合并数据。另一种方法是在存储过程中包装所有更改,并在其中更新两个表。另一种选择是使用触发器,它可以检测何时发生更改。然而,我回避触发器,更喜欢前两种选择

我必须承认,磁盘空间对于这些表来说并不是一个很大的考虑因素。因此,将数据存储两次是没有问题的,一次存储在结果中,一次存储在历史中。在历史记录表中只存储历史记录,而当前记录在当前表中,这只是一个小小的调整


这种方法的一个缺点是更改基表的结构。如果要添加列,则需要将其添加到历史记录表和基表中。

不要害怕在两个表中重复原点、用户和时间戳。您可能希望删除后台作业中的修订。删除其帖子不存在的所有修订。理论上,您甚至可以通过日志挖掘创建修订。更大的交易量和更低的摊余成本。