繁体   English   中英

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

[英]Best practice for revision control of data in SQL databases

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

这些变化很少发生。

理想情况是这样的: -

 (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表的性能。 对于这种事情,这是最好的做法吗?

对于这种类型的问题,我保留了当前表和历史表。

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

  • HistoryID
  • EFFECTIVEDATE
  • 结束日期
  • VERSIONNUMBER
  • 由...制作
  • CreatedAt

有效日期和结束日期是值有效的时间跨度。 每当记录发生变化时,版本就会增加。 id,CreatedAt和CreatedBy是我几乎放入数据库中每个表的列。

通常,我会将历史记录表与夜间作业保持同步,比较表格然后使用MERGE组合数据。 另一种方法是将所有更改包装在存储过程中,并在那里更新两个表。 另一种方法是使用触发器来检测何时发生更改。 但是,我回避触发器,更喜欢前两种选择。

我必须承认磁盘空间不是这些表的重要考虑因素。 因此,存储数据两次没有问题,一次在历史记录中的结果中一次。 仅在历史表中存储历史记录只是一个小调整,当前记录在“当前”表中。

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

如果这些表用于摘要目的(特别是业务用户,如果他们有一些SQL访问权限),我认为最好删除数据并将其放入另一个表中。 虽然标志和修订有时候很好,但是当你必须按照select sum(select someVar where revision_version=max(revision_version and someID=ID))它确实超出了简单的范围。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM