Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 如何处理长期运行系统中陈旧的数据库数据?_Database Design - Fatal编程技术网

Database design 如何处理长期运行系统中陈旧的数据库数据?

Database design 如何处理长期运行系统中陈旧的数据库数据?,database-design,Database Design,程序员处理很少使用但不能简单删除的数据的可能性是什么,因为至少报告仍然需要它 我想到的一些例子: 大学老年期的折扣资助类型 未使用的货币(如意大利里拉) 失踪国家的名称(如奥匈帝国、苏联) 一些局部解决方案是活动标志、活动周期、可视化优先级,但它们中的每一个都意味着个案决策,很难知道哪些类型的实体需要这种特殊处理 可能有一种设计模式可以解决这个问题 结论:(基于目前的答案) 如果旧数据使在大型数据库上的日常工作变得困难,分区将很有帮助。甲骨文对此主题的描述如下 从设计师的角度来看,的分类法

程序员处理很少使用但不能简单删除的数据的可能性是什么,因为至少报告仍然需要它

我想到的一些例子:

  • 大学老年期的折扣资助类型
  • 未使用的货币(如意大利里拉)
  • 失踪国家的名称(如奥匈帝国、苏联)
一些局部解决方案是活动标志、活动周期、可视化优先级,但它们中的每一个都意味着个案决策,很难知道哪些类型的实体需要这种特殊处理

可能有一种设计模式可以解决这个问题

结论:(基于目前的答案)

  • 如果旧数据使在大型数据库上的日常工作变得困难,分区将很有帮助。甲骨文对此主题的描述如下

  • 从设计师的角度来看,的分类法提供了一些背景信息


一种解决方案可能是(假设引用过时数据的记录是最旧的):归档这些记录并删除旧的引用数据。

对于大多数查询中未使用的旧数据,最好的解决方案是通过区分过时数据和当前数据的键对表进行分区(例如日期、货币id或诸如此类的东西)。然后,您可以将过时的数据放在单独的表、数据库甚至服务器中(取决于您运行的配置)


这样做的缺点是,应用程序必须具有分区意识,才能知道在哪里可以找到数据(尽管有一些抽象可以帮助处理切分和分区).

在一些情况下,我已经使用适当的只读权限设置复制了旧数据和旧程序。因此,用户能够查看旧数据并使用旧程序进行报告。然后,您可以自由地按照自己的意愿推进现代程序,删除列或表,迁移一些数据等。

你真的必须逐案处理,因为业务规则定义了过时记录的相关与否。例如,在一些历史记录中,将对苏联的销售包括在内是有意义的,在其他情况下,你可以忽略它


一般的模式是在记录上有一个“相关自/到”数据时间字段。在这种情况下,历史报告可以包括与该期间相关的类型。(更简单的解决方案是布尔值“过时”标记在记录上,但由于这并不表示何时相关,因此对历史报告没有帮助。)

除了Eran所说的分区外,您还可以通过使用LastModified列或类似的列,部分自动化决定将什么放入存档分区的过程。然后,只需根据LastModified<-1y左右进行分区,系统就应该了解陈旧数据本身。

这是标准的缓慢变化的分区离子问题。您有状态和/或日期范围的SCD

“每一项都是指个案 而且很难知道是什么决定 实体类型需要这种特殊的属性 处理”


是的。很抱歉。你必须分析你的数据并思考。没有简单的方法来思考这一部分。

对于任何生命周期有限的实体,只需在其定义中添加时间成分。例如,你的意大利里拉可以建模为:

CREATE TABLE Currency (CurrencyID NUMBER, CurrencyStartDate DATETIME, CurrentEndDate DATETIME)
然后,您可以从与当前活动相关的任何应用程序函数中排除过期的货币,并且仍然保持历史数据的关系。

商业DBMS(Informix、DB2,可能是Oracle,…)具有分区或分段功能,这样您可以将不同的数据放在不同的片段中,而查询优化器将忽略它知道不需要的片段。您有时可以使用这些功能将不太常用的数据放在仅用于过时数据的存储区中。这样做的好处是系统als的位置(好的,系统加上DBA),应用程序完全不知道它


任何需要更改报告应用程序的方案都注定会破坏其中至少一些应用程序。

我建议将操作系统和报告系统分开。一个数据库用于操作-在线系统,另一个数据库用于报告。(可以是数据仓库,或简单的另一个数据库)基于报告系统的通用性

定期将数据从操作系统移动到报告系统。(频率取决于系统的性质)。 所有历史报告都将基于报告数据库。在线数据库也将包含报告,但不包含(非常)历史报告


而且,是的。您需要在表上维护日期或标志,以确定项目是否已过期。

我发现了一个类似的问题:如何处理活动标志解决方案

这里还有一个关于mysql和postgresql的活动标志


基于这两个问题,活动标志和/或表分区是解决该问题最常见的解决方案。

您也可以更新旧数据。例如,您可以将意大利里拉金额转换为欧元金额。但这确实是一个逐案决定。您最了解您的系统和需求。

存档意味着我可以不要像以前那样使用程序中的旧数据,例如查询1990年的意大利银行账户将是不可能的。但这将需要一年的时间才能生效;)我在我的问题中将此解决方案称为活动期。这种方法的问题是,每个查询都必须知道货币的这个新属性。您所称的“活动周期”也被称为“有效时间”,它是时态数据库中的一个重要概念,我在这里写到:如果您感兴趣