【问题标题】:Audit history of record field changes记录字段更改的审核历史记录
【发布时间】:2019-08-01 18:22:05
【问题描述】:

我有一个关于我正在为我的软件开发课程做的项目的数据库设计的问题。

我有一个表来存储“采购订单”,每个采购订单都与一个“状态”表存在多对一的关系。因此,每个采购订单都可以有一个状态,例如:“未结请求”、“收到货”、“收到发票”等。

嗯,一切正常;但是,我希望存储状态字段更改的历史记录。因此,当它更改为“收到货物”时,何时更改为“收到发票”或任何其他状态。

我想我需要创建一个新表来存储这些?如果是这样,我不确定如何实现这一点,以及如何将所需的逻辑构建到我的 Web 应用程序中。我从头开始学习一切,所以我不确定这个逻辑是否应该在我的 laravel 项目(MVC)的控制器中,或者数据库是否能够处理这个 - 例如它能够在主控时级联删除记录记录被删除。

我的主要问题是我不知道这种类型的问题是否有名字,所以我也在努力用谷歌搜索它。

非常感谢任何帮助,谢谢。

【问题讨论】:

  • github.com/VentureCraft/revisionable 你可以看看这个库,看看它应该如何工作的一个很好的例子。
  • 您想要当前的“状态”吗? (使用同一张表。)还是对“状态”的所有更改逐一进行? (使用不同的表格。)

标签: mysql database model-view-controller database-design


【解决方案1】:

我的主要问题是我不知道这种类型的问题是否有名字,所以我也在努力用谷歌搜索它。

您要查找的是“审计”或“审计日志”或“版本控制”。

我喜欢paper_trail 的做法。您有一个表来存储对任何表的更改。审计表将表、主键、操作(插入、更新、删除)和行的快照存储为JSON

您可以将其实现为 database triggers 或作为 ORM 中的回调。

【讨论】:

    【解决方案2】:

    历史记录有多种方法,也可以说是审核记录。

    1.Triggers
    2.CDC(IN SQL server only)
    3. By Your own code (i.e object cloning)
    4. Inside your DML procedures
    

    【讨论】:

      【解决方案3】:

      我认为您正在尝试根据订单的“状态”创建订单的审核/历史记录。
      仅从数据库的角度来看,这是实现您正在寻找的东西的一种方法:

      1. 创建一个新表,比如 OrderStatusLog --> 列: 一种。 OrderID(Orders 表中的主键) - 知道它与哪个订单相关 湾。 Prev_OrderStatusID - 这将是旧/原始订单状态 C。 Current_OrderStatsID - 这将具有最新的 OrderStatusID

      2. 在 Orders 表上创建一个触发器,例如:

        CREATE TRIGGER [dbo].[trgOrderStatusLog] 
        ON [dbo].[Orders]
        AFTER UPDATE   
        
        -- If you need to log when initially the Order was placed, change the 
        above line to:  
        -- AFTER INSERT,UPDATE 
        
        AS 
        
        INSERT INTO OrderStatusLog(OrderID, Prev_OrderStatusID, Current_OrderStatsID)
        
        SELECT           
          I.ORDERID,
          D.OrderStatusID, -- This is your Order Status before update
          I.OrderStatusID  -- This is your Order Status before update
        FROM INSERTED I 
        INNER JOIN DELETED D ON I.ORDERID = D.ORDERID
        
      3. 一个好主意是添加时间戳和用户更新记录(即使对于学校项目)。

      4. 从现在开始,您只需要一个更新调用/过程来更新 Orders 表。并且,将在OrderStatusLog 表中创建每个更新的日志/记录。

      这是完成手头任务的非常基本且直接的方法。此外,此语法基于 SQL Server。

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多