记录表中每列的更改

时间:2011-10-31 07:02:16

标签: database-design

我正在忙着创建一个系统,我需要跟踪系统中的每个变化。换句话说,当数据库中的列被更改时,我需要知道哪个表,哪个列,何时进行更改,哪个用户,从哪个值到什么值。

我的第一个想法是为每个表创建第二个表以进行日志记录,包含column_name,updated_by,updated_on,from_value,to_value等字段(为简单起见,将from_value和to_value字段保留为字符串)。但是,这基本上会创建数据库的副本。

我的第二个选择是为所有表创建一个类似类型的大型表(table_name,column_name,updated_by,updated_on,from_value,to_value),但这将导致无法管理的表,因为更改将经常发生

这两个选项都有同样的问题,我不确定如何引用表的列,最糟糕的是,如何在应用程序的生命周期中处理列名的更改。

任何想法和建议都将不胜感激。

4 个答案:

答案 0 :(得分:3)

我将在这里做一些假设:

  • 您不受磁盘空间的限制
  • 你有一个非平凡的数据模型
  • 您需要能够以人类可读的格式报告您的审核/历史信息
  • 您没有处理极端性能或可扩展性要求
  • 您的审核数据的受众是业务用户级别,而不是技术级别。

在这种情况下,我所知道的最佳解决方案是让“历史”成为您设计中的一流概念。所引用的link GregL对此有很好的描述;我更简单的实现基本上意味着在每个表上都有“valid_from”和“valid_until”和“operator_id”列,并使用“is_valid”而不是删除操作。

这比审核对单独表的更改更好,因为它允许您在历史记录中的任何给定点创建数据的完整图片,并使用与常规数据访问代码相同的逻辑来完成表之间的所有关系。反过来,这意味着您可以使用标准报告工具创建报告,回答诸如“哪个运营商更改了食品类别中所有产品的价格”,“1月1日有多少产品低于100美元?”等问题。等

它确实消耗更多空间,并且确实使您的数据库访问逻辑更加复杂。它也不能很好地与ORM解决方案配合使用。

答案 1 :(得分:1)

我只记得这种功能的术语叫做“审计”。谷歌快速搜索“数据库设计全面审计”产生了以下有趣的链接 - 可能值得一读:

http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture/

http://www.restfuldevelopment.net/david-kawliche/writing/time-after-time/

Best implementation for fully auditable data model?

http://www.sqlservercentral.com/articles/SQL+Puzzles/anaudittrailgenerator/2067/

他们只是那些与我相比的人,你可能会发现更好的链接,因为你知道“审计”的关键词。

答案 2 :(得分:1)

检查我的answer for the question "history rows management in database" 它描述了我使用该解决方案的优点和缺点的解决方案。

基本上,它是一个庞大的表,但更改在一个字符串字段中记录为XML。

修改

我没有更改列名的问题,因为每个更改都是一个XML字符串 大多数时候我不得不深入研究历史,问题是“谁和何时改变了一个特定的记录”,所以我可以选择具有相同Id的少量记录。
这种方法的问题是,如果您需要查找发生某些值的所有记录。它需要在整个表格上进行全文搜索,这非常慢 您需要分析可能的搜索方案,然后选择最佳解决方案。

还有一件事需要考虑 - 历史记录永远不会被更改,因此您可以拥有另一个数据库,该数据库可以保留历史记录副本的交叉索引以便快速搜索。创建一个自动服务,该服务将不时从实时数据库中复制历史记录。

答案 3 :(得分:0)

这有点奇怪但你可以在每个表中添加一个“InsertedOnTimestamp”列作为第二个主键。然后永远不允许用户更新表并创建仅显示最新记录的视图。

Select * From Table
    Inner Join (Select ID, Max(InsertedOnTimestamp) as LastestRecord From Table Group By ID) as Latest 
    On Table.ID = LatestID AND Table.InsertedOnTimestamp = Latest.LatestRecord

听起来像梅西一样,但一个想法一点也不......