回答

收藏

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

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

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

本版积分规则