我正在创建一个包含债券和贷款等金融证券数据的DW。这些证券与付款时间表相关联。例如,债券可以按季度支付,而抵押贷款通常每月支付(有时是每两周一次)。交易证券时会创建付款计划,并且在大多数情况下,将保持不变。但是,设计需要适应那些确实发生变化的情况。
我目前正在尝试对这些数据进行建模,但我很难想出一个可行的设计。最常查询的字段之一是“下一个付款日期”。用户通常想知道安全性何时会支付。因此,我希望让他们尽可能轻松地获得每个证券的下一个付款日期和金额。
此外,用户经常运行历史查询,在这种情况下,他们需要下一个付款日期和特定时间点的金额。例如,他们可能希望回顾1/31/09并查询下一个付款日期(通常是2009年2月的抵押贷款)。他们想要查询证券的整个付款时间表也很常见,这可能包含360条记录(30年抵押x 12次付款/年)。
由于下一个付款日期和金额将每月或甚至每两周更改一次,因此这些字段似乎不会很好地适应缓慢变化的维度。使用事实表可能更有意义,但我不确定如何对其进行建模。任何想法都将不胜感激。
答案 0 :(得分:1)
下一个付款日期是“无事实的事实表”的示例。没有措施,只有FK在至少两个维度之间:安全性和时间。
您可以对安全性进行非规范化,使其具有类型1 SCD(每次加载都会被覆盖),其中包含一些重要的“下一个付款日期”。
然而,我认为最好带一些重要的付款日期和事实。如果您有贷款的“当前余额”事实表,那么您有此余额的适用日期,您也可以随身携带上一个和下一个付款日期以及余额。
对于整个付款时间表,您有一个特殊的无事实的事实表,其中只有适用的日期和未来的付款日期顺序。这样,当计划发生变化时,您可以选择截至某个特定日期的付款顺序。
答案 1 :(得分:1)
我会使用表格(securityid,startdate,paymentevery,period)它还可以包括enddate,paymentpershare
期间为1天,2周,3个月,4年。
因此,对于在2009年3月1日开始每周付费的安全1,那么日期在4/2改为每20天一次,然后在2009年5月1日后每周改变一次,然后在2009年7月1日改为每月一次,它将包含:
1,'3/1/2009',1,2
1,'4/2/2009',20,1
1,'5/1/2009',1,2
1,'7/1/2009',1,3
要获得实际日期,我会使用这样的算法:
要知道2009年3月5日至5月17日的安全1的付款日期:
Find first entry before 3/5 = 3/1
Loop:
Get next date that's after 3/5 and before the next entry (4/2 - weekly) = 3/8
Get next date that's before next the entry (4/2) = 3/15
Get next date that's before next the entry (4/2) = 3/22
Get next date that's before next the entry (4/2) = 3/29
Next date >4/2 switch to next entry:
Loop:
Get next date that's after 4/2 and before the next entry (5/1 - every 20 days) = 4/22
Next date 5/12 is AFTER next entry 5/1, switch to next entry
Loop:
Get next date that's after 5/1 and before the lastdate (5/17 - weekly) = 5/8
Get next date that's before the lastdate = 5/15
Next date > 5/17
2009年3月5日至2008年5月17日期间的日期为3 / 8,3 / 15,3 / 22,3 / 29,4 / 22,5 / 8,5 / 15
答案 2 :(得分:0)
为什么不将下一个付款日期存储为当前付款日期后的天数?
进一步澄清:
每个过去的付款都会链接到某个日期维度。这些事实中的每一个都将具有字段next payment in
,该字段将是整数。我们的想法是,当前付款的日期+ next payment in
将是下一次付款事实的日期。这个应该能够满足一切。