只是想知道你是否对此有意见。
想象一下,我有一个简单的应用程序,可以为客户存储发票。
简化发票表是:
ID int,
NUMBER varchar(20)
CustomerID INT
客户数据是:
ID int
Number varchar(20)
Name varchar(30)
TaxID varchar(20)
...
现在因为我希望将原始客户数据的发票保留(因此客户在打印时的数据)我希望避免在某些时候更改原始客户数据,否则所有过去的发票都会有客户详细信息改变了。
最好的方法是什么?
答案 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