【问题标题】:Database history for client usage客户使用的数据库历史记录
【发布时间】:2009-03-17 18:09:55
【问题描述】:

我正在尝试找出在数据库中保存历史记录以跟踪已完成的任何插入/删除/更新的最佳方式。历史数据需要被编码到前端,因为它将被用户使用。创建“历史表”(用于存储历史的每个表的副本)不是一个好方法,因为数据分布在多个表中。

此时,我最好的想法是创建一些历史记录表,这些表将反映我想向用户显示的输出。每当对特定表进行更改时,我也会使用数据更新此历史表。

我正在尝试找出最好的方法。任何建议将不胜感激。

我正在使用 Oracle + VB.NET

【问题讨论】:

标签: vb.net oracle database-design


【解决方案1】:

我已经非常成功地使用了一个模型,其中每个表都有一个审计副本 - 同一个表有几个额外的字段(时间戳、用户 ID、操作类型),以及第一个表上的 3 个触发器用于插入/更新/删除.
我认为这是一种很好的处理方式,因为表和触发器可以从模型中生成,并且从管理的角度来看几乎没有开销。 应用程序可以使用这些表向用户显示审计历史记录(只读)。

【讨论】:

  • @dotjoe:审计表是不同的表,同一个表中没有更多记录。
  • 正确。审计表没有约束或索引,只有原始数据。它的目的是审计,因此得名。如果您确实需要将数据拉回 UI,这可能是一个不同的业务案例,您可能希望设计其他东西作为运营模型的一部分。
  • 这是我现在所拥有的,但我在重建数据时遇到了问题。问题在于连接多个表以显示数据时。在我们的例子中,表连接是非常有问题的。
  • @Jon - 您有单独的审计表主键吗?那会派上用场的。否则,加入它几乎是不可能的。
【解决方案2】:

我们的系统中有这个要求。我们添加了两个表,一个标题,一个名为 AuditRow 和 AuditField 的详细信息。 AuditRow 包含在任何其他表中更改的每行一行,而 AuditField 包含每列更改旧值和新值的行。

我们在每个表上都有一个触发器,它在每次插入/更新/删除时写入标题行 (AuditRow) 和所需的详细信息行(每个更改的列一个)。这个系统确实依赖于这样一个事实,即我们在每个表上都有一个可以唯一表示行的 guid。不必是“业务”或“主”键,但它是该行的唯一标识符,因此我们可以在审计表中识别它。像冠军一样工作。矫枉过正?也许吧,但我们从来没有遇到过审计师的问题。 :-)

是的,审计表是迄今为止系统中最大的表。

【讨论】:

    【解决方案3】:

    如果您有幸使用 Oracle 11g,您还可以使用Flashback Data Archive

    【讨论】:

      【解决方案4】:

      就我个人而言,我会远离触发器。当涉及到调试时,它们可能是一场噩梦,如果您希望向外扩展,它们不一定是最好的。

      如果您使用 PL/SQL API 执行 INSERT/UPDATE/DELETE,您可以通过简单的设计转变来管理此操作,而无需(预先)历史表。

      您只需要 2 个额外的列,即 DATE_FROM 和 DATE_THRU。插入记录时,DATE_THRU 保留为 NULL。如果该记录已更新或删除,只需通过将 DATE_THRU 设为当前日期/时间 (SYSDATE) 来“结束日期”记录。显示历史就像从表中选择一样简单,其中 DATE_THRU 为 NULL 的一条记录将是您当前或活动的记录。

      现在,如果您预计会有大量更改,最好将旧记录注销到历史记录表中,但我仍然不会使用触发器来管理它,我会使用 API 来完成。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        • 2021-03-03
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多