如何制作 sql 数据的历史记录? (报告数据变化)

how to make history of sql data? (report data changes)

每天,我都在(使用 crontab,php 脚本)将错误信息保存到数据库中。每一行都是这样的: (Bugidentification、Date、Title、Who 等...)

(例如: Bugidentification, Date, Title, Who, etc....

issue1, 2015-04-01, blabla, bill 等...

issue2, 2015-04-01, nnnnnnn, john, 等...

issue3、2015-04-01、vvvvvvv、greg 等...

issue1, 2015-04-02, blabla, bill 等...

issue2, 2015-04-02, nnnnnnn, john, 等...

issue3, 2015-04-02, vvvvvvv, mario, etc...(现在是mario)

issue2、2015-04-03、nnnnnnn、john 等...(issue1 已消失)

issue3、2015-04-03、vvvvvvv、tod 等...(tod 为新信息)

issue4, 2015-04-03, rrrrrrrr, john, etc...(issue4 是新的)

................................................ )

基本上,如果我以上面发布的示例为例,结果应该类似于 4 月 2 日和 4 月 3 日日期之间的比较

新行是:issue4

已关闭的行是:Issue1

更新的行是:第 3 期(使用 tod 而不是 mario)

没有更改行是:Issue2

在我的例子中,有数百行,我相信我知道如何去做,多亏了 php,但我的代码会很长,就像创建 foreach 循环一样,如果有任何变化,一一查看。我不确定我是否得到了直接的解决方案。

所以我的问题是,是否有任何简单的方法可以使用 "simple" 代码(例如 sql 特殊请求或任何项目代码或简单的 php 函数来报告这些更改? ).

此设计中内置了太多假设。这些假设需要您比较不同日期之间的行,以便首先做出假设——更不用说您必须从一天到下一天复制未更改的行,以维持满足假设所需的完整的每日条目。呼。

规则 1:不要在设计中加入假设。如果是新的东西,应该标记,"HEY! I'm new here!" 当对数据进行更改时,"OK, something changed. Here it is." 并且当问题最终关闭时,"OK, that's it for me. I'm done for."

create table Bug_Static( -- Contains one entry for each bug
    ID     int identity,
    Opened date not null default sysdate,
    Closed date [null | not null default date '9999-12-31'],
    Title  varchar(...),
    Who    id references Who_Table,
    <other non-changing data>,
    constraint PK_Bug_Static primary key( ID )
);
create table Bug_Versions( -- Contains changing data, like status
    ID        int not null,
    Effective date not null,
    Status    varchar not null,  -- new,assigned,in work,closed,whatever
    <other data that may change from day to day>,
    constraint PK_Bug_Versions primary key( ID, Effective ),
    constraint FK_Bug_Versions_Static foreign key( ID )
        references Bug_Static( ID )
);

现在您可以 select 任何给定日期的错误和当前数据(所做的最后更改)。

select  s.ID, s.Opened, s.Title, v.Effective, v.Status
from    Bug_Static   s
join    Bug_Versions v
    on  v.ID = s.ID
    and v.Effective =(
        select  Max( Effective )
        from    Bug_Versions
        where   ID = v.ID
            and Effective <= sysdate )
where   s.Closed < sysdate;

where s.Closed < sysdate 是可选的。为您提供的是在执行查询之日关闭的所有错误,而不是在此之前关闭的错误。这可以防止已关闭的错误一遍又一遍地重新出现——除非那是你想要的。

sysdate 值更改为特定的 date/time,您将获得截至该日期和时间出现的数据。

通常,当创建一个错误时,会在两个 table 中输入一行。然后随着状态或任何其他数据的变化,只有新版本被输入。如果一天没有任何变化,则不会输入任何内容。然后当 bug 最终被关闭时,静态 table 的 Closed 字段被更新,并且一个 closed 版本被插入到版本 table 中。我已经显示了带有两个选项的 Closed 字段,null 或定义的 "maximum date" of Dec 31, 9999。您可以使用任何一个,但我喜欢最大日期方法。它简化了查询。

我还会在两个 table 前面加上几个加入 table 的视图。一个只显示每个错误的最新版本 (Bug_Current),另一个显示每个错误的每个版本 (Bug_History)。在 Bug_Current 上使用触发器,它可以是应用程序用来更改错误的触发器。例如,它会将任何版本化字段的更新更改为新版本的插入。

重点是,这是一个非常灵活的设计,您可以轻松地只显示您想要的数据,以及您想要的方式,随时显示。