程序员处理很少使用但不能简单删除的数据的可能性有多少,因为至少报告仍需要它?
我在想的一些例子:
一些部分解决方案是活动标记,活动周期,可视化的优先级,但每个都意味着逐案决策,很难知道哪种类型的实体需要这种特殊处理。
可能存在此问题的设计模式。
结论:(根据目前为止的答案)
如果旧数据使大型数据库的日常工作变得困难,分区将会很有帮助。 Oracle对此主题的描述是here。
从设计师的角度来看,Slowly changing dimension的分类提供了一些背景信息。
答案 0 :(得分:4)
对于大多数查询中未使用的旧数据,最佳解决方案是通过键区分表,该键将陈旧与当前数据区分开(例如date,currency_id或类似的东西)。然后,您可以将陈旧数据放在单独的表,数据库甚至服务器中(具体取决于您运行的配置)。
这样做的缺点是你的应用程序必须知道分区,才能知道在哪里找到数据(虽然有抽象可以帮助处理分片和分区)。
答案 1 :(得分:2)
对于任何可以具有有限生命期的实体,只需在其定义中添加时间组件即可。例如。你的意大利里拉可以建模为:
CREATE TABLE Currency (CurrencyID NUMBER, CurrencyStartDate DATETIME, CurrentEndDate DATETIME)
然后,您可以从与当前活动相关的任何应用程序功能中排除过期货币,并且仍然保持历史数据的关系。
答案 2 :(得分:1)
在某些情况下,我使用适当的只读权限集来复制旧数据和旧程序。因此,用户能够使用旧程序查看旧数据并进行报告。然后,您可以自由地推进现代程序的工作方式,删除列或表,迁移某些数据等。
答案 3 :(得分:1)
您必须逐个处理它,因为业务规则定义了过时记录何时相关。例如,在某些历史资料中,将销售包含在苏联是有意义的,在其他情况下,您可以将其排除在外。
一般模式是在记录上具有“相关的/来自”数据时间字段。在这种情况下,历史报告可以包括与该时期相关的类型。 (一个更简单的解决方案是记录上的布尔“过时”标志,但由于这并不表示它何时相关,因此对历史报告不会有帮助。)
答案 4 :(得分:1)
这是标准的慢慢变化维度问题。你有SCD的状态和/或日期范围。
“他们每个人都意味着个案 决定,很难知道是什么 实体类型需要这个特殊的 处理“
是的。对于那个很抱歉。你必须分析你的数据并思考。没有简单的方法来解决这个问题。
答案 5 :(得分:1)
我建议将操作系统和报告系统分开。为操作 - 在线系统提供一个数据库,为报告提供另一个数据库。 (可以是数据仓库,也可以是简单的另一个数据库),这取决于您需要报告系统的多样性。
定期将数据从操作系统移至报告系统。 (频率取决于您系统的性质)。 所有历史报告都将基于报告数据库。在线数据库还包含报告,但不包含(非常)历史报告。
而且,是的。您需要在表格上维护日期或标志,以确定某个项目是否已已过期。
答案 6 :(得分:0)
可以采用一种解决方案(假设引用过时数据的记录是最早的):归档这些记录并删除旧的参考数据。
答案 7 :(得分:0)
除了Eran所说的分区之外,您还可以通过使用LastModified列或类似方法来部分自动化决定放入存档分区的内容的过程。然后通过简单地基于LastModified<大约1个左右,系统应该了解过时的数据。
答案 8 :(得分:0)
商业DBMS(Informix,DB2,可能是Oracle,...)具有分区或碎片功能,因此您可以将不同的数据放在不同的片段中,并且查询优化器将忽略它知道不需要的片段。您有时可以使用这些将较不常用的数据放入仅用于古代数据的存储区域。这样做的好处是系统处理放置(OK,系统加DBA),应用程序完全无视它。
任何需要更改报告应用程序的方案都注定要破坏其中一些应用程序。
答案 9 :(得分:0)
我发现了一个类似的问题:What is the best way to implement soft deletion?处理活动标记解决方案。
这是另一个关于mysql和postgresql的活动标志`active’ flag or not?。
基于这两个问题,活动标志和/或表分区是解决问题的最常见方法。
答案 10 :(得分:0)
您还可以更新旧数据。例如,您可以将意大利里拉金额转换为欧元金额。但这确实是个案决定。您最了解您的系统和要求。