数据库 - 历史数据
本文关键字:历史数据 数据库 | 更新日期: 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
乍一看,它似乎工作正常。
问候塞布