当前位置: 首页 > 面试题库 >

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

蓬长恨
2023-03-14
问题内容

前言:前几天,我在考虑为新应用程序使用新的数据库结构,并意识到我们需要一种有效地存储历史数据的方法。我想让其他人看一看,看看这种结构是否有任何问题。我意识到这种存储数据的方法很可能以前就已经发明了(我几乎可以肯定已经有了),但是我不知道它是否有名称,并且我尝试过的一些Google搜索都没有产生任何结果。

问题:假设您有一个订单表,并且订单与下订单的客户的客户表相关。在正常的数据库结构中,您可能会期望如下所示:

orders
------
orderID
customerID


customers
---------
customerID
address
address2
city
state
zip

非常简单明了,orderID具有customerID的外键,这是customer表的主键。但是,如果要在订单表上运行报表,我们将把客户表加入到订单表中,这将带回该客户ID的当前记录。如果下订单时客户的地址不同并且后来又更改了该怎么办。现在,我们的订单不再反映下订单时该客户地址的历史记录。基本上,通过更改客户记录,我们只更改了该客户的所有历史记录。

现在有几种解决方法,其中一种是在创建订单时复制记录。不过,我想出的是,我认为这是一种更简单的方法,可能更优雅一些,并且具有在进行任何更改时进行日志记录的额外好处。

如果我改成这样的结构怎么办:

orders
------
orderID
customerID
customerHistoryID


customers
---------
customerID
customerHistoryID


customerHistory
--------
customerHistoryID
customerID
address
address2
city
state
zip
updatedBy
updatedOn

请原谅格式,但我认为您可以看到这个想法。基本上,这种想法是,只要更改,插入或更新客户,就可以增加customerHistoryID并使用最新的customerHistoryID更新客户表。现在,订单表不仅指向customerID(允许您查看客户记录的所有修订版),而且还指向customerHistoryID,后者指向记录的特定修订版。现在,订单反映了创建订单时的数据状态。

通过向customerHistory表中添加一个updateby和updatedon列,您还可以看到数据的“审核日志”,因此您可以看到谁进行了更改以及何时进行了更改。

删除可能是一个潜在的弊端,但是我对此并不真正担心,因为什么也不能删除。但即使如此,根据数据域的不同,使用activeFlag或类似的方法也可以实现相同的效果。

我的想法是所有表都将使用此结构。每当检索历史数据时,都将使用customerHistoryID将其与历史表结合起来,以显示该特定订单的数据状态。

检索客户列表很容易,只需在customerHistoryID上联接到客户表即可。

无论是从设计角度还是出于性能原因,任何人都可以看到这种方法的任何问题。请记住,无论我做什么,我都需要确保保留历史数据,以便以后对记录的更新不会更改历史记录。有没有更好的办法?这是一个有名称或任何文件的已知想法吗?

谢谢你的帮助。

更新:
这是我真正要拥有的非常简单的示例。我的实际应用程序将具有“订单”,并带有指向其他表的多个外键。始发地/目的地位置信息,客户信息,设施信息,用户信息等。曾有几次建议我可以将该信息复制到订单记录中,而且我已经看到过很多次,但这会导致记录包含数百列,在这种情况下,这实际上是不可行的。


问题答案:

当我遇到这样的问题时,一种选择是对历史记录表进行排序。它的功能相同,但易于操作

orders
------
orderID
customerID
address
City
state
zip



customers
---------
customerID
address
City
state
zip

编辑:如果您喜欢的列数很高,则可以按自己的喜好将其分开。

如果您确实选择了另一个选项并使用了历史表,则应考虑使用时空数据,因为您可能不得不处理需要更正历史数据的可能性。例如,客户将其当前地址从A更改为B,但您还必须更正当前正在履行的现有订单上的地址。

另外,如果您使用的是MS SQL
Server,则可能要考虑使用索引视图。这将使您可以将较小的增量插入/更新性能降低与较大的选择性能提高进行交易。如果您不使用MS SQL
Server,则可以使用触发器和表来复制它。



 类似资料:
  • 本文向大家介绍数据模型和数据库的历史,包括了数据模型和数据库的历史的使用技巧和注意事项,需要的朋友参考一下 数据模型的历史已有三代DBMS- 分层系统是第一代DBMS。第一代还带有CODASYL系统。他们两个都是在1960年代推出的。 第二代包括关系模型。EFCodd博士于1970年将其引入。 在第三代包括对象关系数据库管理系统和面向对象的数据库管理系统。 数据库的历史时间表如下所示- 基于文件的

  • 首先,我将用现实生活中的例子来解释我的问题。假设我们是一家公司,我们销售不同的运输工具,例如汽车、公共汽车、卡车、火车、飞机等。假设我们有大约10,000,000种不同的产品,每天都有变化。 对于每个项目,我们都有一个唯一的名称(例如,汽车奥迪A8 X或飞机波音747-200by),其中X和Y是唯一的值。不用担心命名,因为它工作很好。 对于每一项,我们也有一些特殊的数据。数据取决于类型,例如汽车:

  • Room存储数据库的位置以及如何强制重新生成数据库?我尝试在以下位置查找DB: 我想使用SQLLite看看数据库中到底有什么数据,所以我按照“Access database in Android Studio”的方向操作,但我只看到一个缓存和codecache目录存储在那里。没有数据库目录。 想要查看DB的原因是我更改了模型以添加几个字段,但我想不出如何强制使用Room来重新创建并用数据重新填充D

  • 使用指南 - 数据报告 - 概述 - 报告的时效性及历史数据的存储 百度统计对网站访问数据的收集是实时的,但报告展现存在一定的计算耗时,您查看数据时会有少量的时间延迟。 报告类延迟: 实时访客报告的实时性很高,仅有几秒的延迟,可忽略不计; 其他报告的延时在15分钟左右。 设置类延迟: 完成设置后,一般20分钟后就会生效。 百度统计会帮您一直保存所有历史数据,直到您在系统中进行了删除操作。

  • 我正在通过使用Laravel作为后端开发来创建一个电子商务移动应用程序。 方案:我有一个Product表,其中存储了有关产品的一些信息。每当用户购买一个产品,他将得到一个购买历史记录(它将显示产品信息)将被存储到数据库中。所以当卖家更新他们的产品信息时,用户购买历史记录的产品信息不会受到影响。 问题:如果我只是简单地创建一个用户的购买历史记录表来存储每个用户的记录,我认为这将在数据库中需要大量的空

  • 问题内容: 最近,我考虑了将历史数据存储在MySQL数据库中的最佳做法。目前,每个可版本控制的表都有两列-和,两者均为类型。具有当前数据的记录已充满了创建日期。当我更新此行时,我填写了更新日期,并添加了与上一行相同的新记录- 简单的东西。但是我知道表会非常快,因此获取数据可能会很慢。 我想知道您是否有任何存储历史数据的做法? 问题答案: 担心“大”表和性能是一个常见的错误。如果您可以使用索引来访问