2015-05-01 77 views
1

每天,我都会将(使用crontab,php脚本)保存到数据库错误信息中。每一行是这样的: (Bugidentification,日期,标题,谁,等...)如何创建sql数据的历史记录? (报告数据更改)

(如: Bugidentification,日期,标题,谁,等...

issue1,2015 - 04-01,布拉布拉,票据等..

issue2,2015-04-01,NNNNNNN,约翰,等等

issue3,2015-04-01,vvvvvvv,格雷格等。 ..

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

issue2,2015年4月2日,NNNNNNN,约翰,等等

issue3,2015年4月2日,vvvvvvv,马里奥,等等......(这里现在是马里奥)

issue2,2015年4月3日,NNNNNNN,约翰,等等...(issue1 dissapeared)

issue3,2015年4月3日,vvvvvvv,TOD等...(TOD是新信息)

issue4,2015-04-03,rrrrrrrr,john等...(issue4 is new)

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

基本上if我采取例如我上面贴的结果应该是这样的4月2日的日期,4月3日之间的比较

新行:issue4

封闭式行:Issue1

更新的行是:Issue3(用tod代替马里奥)

没有变化的行是:Issue2

在我的情况下,有数百行,我相信我知道如何做到这一点,感谢PHP,但我的代码将很长时间像创建foreach循环,并一个接一个地看到,如果有任何改变。我不知道我正在得到直接的解决方案。

所以我的问题是,有没有简单的方法来报告这些变化与“简单”的代码(如SQL特殊要求或任何项目代码或简单的PHP函数?)。

+0

可能你需要一个'SELECT'语句和一个'WHERE'条件,日期'BETWEEN'。通过这种方式,您将能够从数据库中仅获取感兴趣的行 – mucio

+0

感谢您的回复,但我的观点是在两个日期之间精确比较,然后知道哪一行是新的,哪一行是关闭的,哪一行更新哪一行不变。 – Oeiloff

+0

最好的事情是,如果你也发布了一个输入参数的例子和你期望的最终结果 – mucio

回答

1

这个设计中有太多的假设。这些假设要求您比较不同日子之间的行,以便首先进行假设 - 更不用说,您必须将未更改的行从一天复制到下一天,以便维护完成假设所需的每日不间断条目。呼。规则1:不要在设计中建立假设。如果有什么新东西的话,应该标注“嘿,我是新来的!”当数据发生改变时,“好的,改变了一些东西。”当问题终于结束时,“好吧,这就是我的,我完了。”

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 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是可选的。给你的是在查询执行的日期关闭的所有错误,但不是在那之前关闭的错误。这样可以让被封闭的bug不断重复出现 - 除非这是你想要的。

更改sysdate值到特定的日期/时间,你将得到的数据,因为它似乎为日期和时间。

通常情况下,当创建一个bug,一行进入这两个表。然后,只有新版本作为状态或任何其他数据更改输入。如果一天没有变化,则不会输入任何内容。然后,当错误最终关闭时,静态表的Closed字段会更新,并且版本表中会插入closed版本。我已经在Closed字段中显示了两个选项,即null或定义的“最大日期”为9999年12月31日。您可以使用任意一个,但我喜欢max date方法。它简化了查询。

我也要与前面一对夫妇的意见,其连接表这两个表。一个只显示每个错误(Bug_Current)的最新版本,另一个显示每个错误(Bug_History)的每个版本。使用Bug_Current上的触发器,它可以是应用程序用来更改错误的触发器。例如,它会改变任何版本化字段到新版本插入的更新。

的一点是,这是一个非常灵活的设计,你可以很容易地只显示你想要你想要的数据,为你想要的任何时间。

+0

您好, 非常感谢您的详细反馈。 对我而言,设计的一部分不是来自我,我必须处理它。无论如何,我同意你的解决方案要更加优化。由于我无法改变现有的设计,我唯一的解决方案是创建PHP脚本。其实我的问题的起源是要知道简单的命令是否可以解决它。看起来不是, – Oeiloff

+0

这就是为什么我强调每当我可以使用视图的重要性。应用程序代码不应直接访问表。当他们这样做时,如果允许的话,稍作改动就会花费大量的时间和精力。当他们接触的都是视图时,对表格的改变是常规的。只需更新相关的视图,应用程序代码甚至不知道进行了更改。太简单。 – TommCatt

相关问题