我正忙于创建一个系统,需要跟踪系统中的每个更改。换句话说,当数据库中的一列发生更改时,我需要知道哪个表,哪个列,何时进行更改,哪个用户,从哪个值到哪个值。
我的第一个想法是为每个表创建第二个表以用于记录目的,其中包含诸如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),但这将导致表无法管理,因为更改会频繁发生。
这两个选项都具有相同的问题,即我不确定如何引用表的列,最糟糕的是,在应用程序生命周期的后期,如何处理列名的更改。
任何想法和建议,将不胜感激。
最佳答案
我将在这里做出一些假设:
在这种情况下,我所知道的最佳解决方案是使“历史记录”成为设计中的一流概念。所引用的link GregL对此有很好的描述。我更简单的实现基本上意味着在每个表上都有“valid_from”,“valid_until”和“operator_id”列,并使用“is_valid”而不是删除操作。
这比审核对单独表的更改要好,因为它允许您使用与常规数据访问代码相同的逻辑,在历史的任何给定点创建数据的完整图片,其中包括表之间的所有关系。也就是说,这意味着您可以使用标准报告工具创建报告,回答诸如“哪个运营商更改了食品类别中所有产品的价格”,“有多少产品在1月1日的价格低于$ 100”之类的问题。等等。
它确实消耗了更多空间,并且确实使数据库访问逻辑更加复杂。它也不能很好地与ORM解决方案配合使用。
关于database-design - 记录表中每一列的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7950768/