回答

收藏

数据库结构用于存储历史数据

技术问答 技术问答 145 人阅读 | 0 人回复 | 2023-09-13

前言:几天前,我正在考虑为新应用程序使用新的数据库结构,并意识到我们需要一种有效的方法来存储历史数据。我想让别人看看这个结构是否有问题。我意识到这种存储数据的方法可能以前已经发明过(我几乎可以肯定已经有了),但我不知道它是否有名字,我试过一些Google搜索没有结果。  J! t8 v& N1 h
问题:假设您有订单表,订单与下订单的客户表有关。您可能希望在正常的数据库结构中显示以下内容:
& J. v' G3 ?7 Dorders------orderIDcustomerIDcustomers---------customerIDaddressaddress2citystatezip非常简单明了,orderID具有customerID外键,这是customer表的主键。但是,如果我们想在订单表上操作报表,我们将在订单表中添加客户表,这将带回客户ID当前记录。如果客户的地址在下订单时有所不同,并以后更改了该怎么办。现在,我们的订单不再反映下订单时客户地址的历史记录。基本上,我们只改变客户的所有历史记录。; u' g9 D; t$ `: u" M. B
现在有几种解决方案,其中一种是在创建订单时复制记录。然而,我认为这是一种更简单的方法,可能更优雅,并且在任何更改时记录日志都有额外的好处。
. G0 G8 m8 Q( V% A0 C$ J0 ]" [+ T如果我改成这样的结构怎么办?2 ?0 `+ d$ y) {2 ~1 V1 v
orders------orderIDcustomerIDcustomerHistoryIDcustomers---------customerIDcustomerHistoryIDcustomerHistory--------customerHistoryIDcustomerIDaddressaddress2citystatezipupdatedByupdatedOn请原谅格式,但我认为你可以看到这个想法。基本上,这个想法是,只要更改、插入或更新客户,就可以增加customerHistoryID使用最新的customerHistoryID更新客户表。现在,订单表不仅指向customerID(允许您查看客户记录的所有修改版本),并指向customerHistoryID,具体修订版的后者指向记录。现在,订单反映了创建订单时的数据状态。7 y9 C( j) y6 _; o* N4 ?
通过向customerHistory在表中加一个updateby和updatedon列,你还可以看到数据的审核日志,所以你可以看到谁做了改变,什么时候做了改变。' C/ c. G( R: X9 P, _' r5 I
删除可能是一个潜在的缺点,但我并不真的担心,因为没有什么可以删除的。但即便如此,根据不同的数据域使用它activeFlag或者类似的方法也能达到同样的效果。
- l# D# ~# F! j# c! H8 E我的想法是,所有的手表都将使用这种结构。每当检索历史数据时,都会使用它customerHistoryID将其与历史表相结合,以显示特定订单的数据状态。
% G5 P/ Z5 V9 C: y+ S+ ?0 @+ i很容易检索客户列表,只需要customerHistoryID连接到客户表。
! L( x2 Y, B: ^9 V  K无论是从设计角度还是性能原因,任何人都可以看到这种方法的任何问题。请记住,无论我做什么,我都需要确保历史数据的保留,这样未来的记录更新就不会改变历史记录。有更好的方法吗?这是一个已知的想法,有名称或任何文件吗?
( t+ Y0 Z3 y8 a( y+ c% P谢谢你的帮助。4 Q3 d* m) p. h  O
更新:
3 X0 J9 P8 d1 _2 ~$ o+ I这是我真正想要的一个非常简单的例子。我的实际应用程序将有一个订单,并有多个外部按钮指向其他表格。起始地点/目的地位置信息、客户信息、设施信息、用户信息等。我曾多次建议我可以将信息复制到订单记录中,我见过很多次,但这将导致数百列记录,这实际上是不可行的。
5 E" {3 P4 g2 N' [3 ]9 p                                                                & M4 X4 A: }+ ^+ I: L- l" R
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则