数据库 - 历史数据

本文关键字:历史数据 数据库 | 更新日期: 2023-09-27 18:30:20

只是想知道您是否对关注有意见。

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

简化发票表是:

ID int,
NUMBER varchar(20)
CustomerID INT

客户数据是:

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

现在,因为我想将我的发票与原始客户数据(因此客户在打印时拥有的数据)一起保留,所以我希望避免在某个时候更改原始客户数据,否则所有过去的发票也会更改客户详细信息。

最好的方法是什么?

数据库 - 历史数据

这本质上是引用数据和非引用数据之间的区别。为了避免始终访问当前客户信息的引用问题,您需要像当时一样将客户信息写入发票表。因此,您的发票表架构看起来更像:

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)
...

这样,数据将始终按原样显示,而不是当前显示。缺点是,由于没有利用规范化,因此会存储更多数据。

如果您

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

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

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

如果选择后者,则应NOT NULL ValidTo,并且需要向Customer表添加一个ModifiedDate字段。无论哪种方式,这都可以通过触发器轻松完成。

谢谢大家的所有想法。同时,我想出了一些其他可能的解决方案,我想知道你对此有何看法。

基本上,我将有 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

乍一看,它似乎工作正常。

问候塞布