Mik*_*and 5 data-warehouse database-design
我有一个旨在促进收入预测的数据库。收入预测包括跟踪在多个时间点(每个点,一个收入日期)确认为收入的订单。有两个表(斜体键):
在任何时候,查询收入表都会给我每个收入日期的总收入。
我想添加一个时间组件,以便我可以跟踪任何给定时间点的收入预测情况。类似于以下内容:
以这种方式做表将允许我查询(forecastDate,revenueDate)以获得我的答案。不幸的是,它还需要我为每次重新预测复制所有数据点,即使是那些没有改变的数据点。
是否有更有效的方法来设计我的表格,以便每个新预测只需要附加更改或更改的数据点,同时仍然允许我查看任何历史时间点的预测?
===更新===
我实际上并不期望对此有明确的答案,因为 Snodgrass 和 Darwen 等领域的杰出人物似乎对如何最好地在数据库中建模时间存在根本分歧(请参阅 ISO 在 1996 年拒绝时间元素) .
快照与运行求和
任何时间点报告方法实际上都等同于快照或计算运行总和。您的选择有以下几种变化:
从时间开始或某个定期检查点位置计算运行总和。这要求您记录更改而不是总数。
计算定期快照并根据快照进行历史统计。
混合运行总和,定期对基线位置进行快照,并减少需要计算运行总和的数据集。
这本质上是一种速度与空间的权衡,而时态数据库实际上只是数据结构的抽象,在语义上与上述方案之一等效。
如果您想要速度,请计算并保存您位置的定期快照。这将使用更多空间,但如果您的 DBMS 平台支持分区,则可以非常有效地管理和处理快照。快照日期形成分区键,因此任何指定日期的查询都将为优化器提供足够的信息来忽略与查询不相关的分区。
频繁的快照将使用大量磁盘空间,因此您需要在粒度和磁盘空间使用之间进行权衡。
如果您想节省空间,请存储更改并计算当前位置的运行总和。您还可以将定期(尽管频率较低)快照与一段时间内的增量结合使用,通过从适当快照中的余额数字开始并将增量添加到当前日期来优化查询。此技术通常用于 Oracle Financials 等会计系统。
混合方法
本质上,你有一个从纯运行总和到纯快照的连续体。快照的查询速度更快,并且可用于通过允许您在快照日期开始运行总和计算来加速运行总和计算。混合方法更加复杂,因为您必须实现两种机制,但它确实允许您将速度/磁盘使用权衡调整为最适合您的应用程序的方式。
关于什么时候可能适用的一些想法
将快照改造为基本事务模型比反之亦然要容易得多。然而,某些模型(具有与时间相关的状态的模型)只有在被视为显示给定时间点状态的快照时才有意义。一个例子是账龄债务报告,您希望查看欠款超过(例如)180 天的发票。如果您想保留旧债务头寸的可调节记录,那么您可能希望定期对其进行快照。
在第一个实例中,带有基本变动(增量)的交易事实表为您提供原始数据,您可以从中计算快照头寸。如果可能的话,最好提供可用的格式,除非由于上游数据源的某些限制而无法以该格式记录数据。
我之前做过一个老化的债务报告系统和一个基于快照的索赔报告系统。账龄债务报告是每周初运行的运营报告,而索赔快照表的要求是一份月度报告,企业希望在其中查看当时未结索赔的计数和未偿价值。
有些事情(例如索赔准备金)是定期进行的,因此(例如)最终结果和 IBNR 1仅按月或按季度计算,并且只有定期报告这些内容才有意义。在这种情况下,由于生成数据的基础过程的性质,对数字进行快照是有意义的。
1最终结果是保险术语,指的是对给定年份开始的保单预期索赔总额的预测。IBNR(已发生但未报告)是对尚未发生或尚未报告的索赔数字的估计。
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |