database-design - 记录表中每一列的更改

标签 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),但这将导致表无法管理,因为更改会频繁发生。

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

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

最佳答案

我将在这里做出一些假设:

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

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

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

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

    关于database-design - 记录表中每一列的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7950768/

    相关文章:

    mysql - 使用 MySQL 在大表上运行更新非常慢

    MySQL 主键 : UUID/GUID vs BIGINT (timestamp+random)

    mysql - 调整数据库结构或 SQL 查询以允许特定输出

    sql - 我应该在查找表中使用代码吗

    sql - 具有多列的单个固定表与灵活的抽象表

    sql - 最佳用户角色权限数据库设计实践?

    sql - super 键和复合键的区别

    database - 可以与连接实体有关系吗?

    database - 具有 3 个键的数据库表

    使用 UML 类图进行数据库设计