如何制作 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 上使用触发器,它可以是应用程序用来更改错误的触发器。例如,它会将任何版本化字段的更新更改为新版本的插入。
重点是,这是一个非常灵活的设计,您可以轻松地只显示您想要的数据,以及您想要的方式,随时显示。
每天,我都在(使用 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 上使用触发器,它可以是应用程序用来更改错误的触发器。例如,它会将任何版本化字段的更新更改为新版本的插入。
重点是,这是一个非常灵活的设计,您可以轻松地只显示您想要的数据,以及您想要的方式,随时显示。