数据库 - 历史数据

时间:2014-11-12 23:04:32

标签: c# sql database

只是想知道你是否对此有意见。

想象一下,我有一个简单的应用程序,可以为客户存储发票。

简化发票表是:

ID int,
NUMBER varchar(20)
CustomerID INT

客户数据是:

ID int
Number varchar(20)
Name varchar(30)
TaxID varchar(20)
...

现在因为我希望将原始客户数据的发票保留(因此客户在打印时的数据)我希望避免在某些时候更改原始客户数据,否则所有过去的发票都会有客户详细信息改变了。

最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

这实质上是参考数据和非参考数据之间的差异。为避免始终访问当前客户信息的参考问题,您需要将当时的客户信息写入发票表。因此,您的发票表架构看起来更像:

ID int
NUMBER varchar(20) <-- also why is a column called NUMBER a varchar?!
CustomerID INT
CustomerNumber varchar(20)
CustomerName varchar(30)
CustomerTaxID varchar(20)
...

这样,数据将始终显示为 ,而不是 当前。缺点是您存储了更多数据,因为您没有利用规范化。

答案 1 :(得分:1)

如果您不希望将信息与发票一起存储(我不愿意),另一种解决方案是使用如下表格跟踪Customer数据的更改:

HistoricID INT,
CustomerID INT,
....
ValidFrom DateTime NOT NULL,
ValidTo DateTime (NOT NULL) //read below for reason of ()

您可以通过以下两种方式执行此操作:在插入Customer表时插入此表,然后更新行以使ValidTo字段具有值,并在每次更新时插入一行Customer表。或者,每次更新反映先前信息的Customer表时,您都可以插入一行。

如果您使用后者,ValidTo应为NOT NULL,您需要在ModifiedDate表中添加Customer字段。无论哪种方式,这都可以通过触发器轻松完成。

答案 2 :(得分:0)

感谢各位提出的所有想法。与此同时,我提出了一些其他可能的解决方案,我想知道你对它的看法是什么。

基本上我将有2个消费者表 - 一个包含静态数据,如电话号码,电子邮件代码等,另一个包含客户详细信息。一旦重要数据发生变化,我只会向详细信息表中添加详细信息,此ID将在发票表中使用,以便:

[Customer]
ID int
Code varchar(20) 
....
Phone

[CustomerDetails]
ID INT
CustomerID Int
Name ...
Address
And other important data that I need to track

[Invoice]
ID
Number
CustomerDetailsID INT
乍一看,它似乎工作正常。

此致 SEB