2012-08-23 27 views
2

我希望有人能够指出我关于何时计算存储在数据仓库中的计算值的一些最佳实践。计算ETL期间或插入数据仓库期间的计算列

考虑下面的例子,

CREATE TABLE 
(
    MyFactID INT NOT NULL IDENTITY(1, 1), 
    OrderDimID INT NOT NULL, -- FK To OrderDimension 
    StartDate DATETIME NOT NULL, 
    CompletedDate DATETIME NULL, 
    ElapsedCalendarTimeInMinutes INT NULL, 
    ElapsedBusinessTimeInMinutes INT NULL 
) 

在这个例子中,在分钟的经过日历时间将是从开始时间(以分钟计)的结束日期。然后,我们的业务时间反映了这些日历日期间可用的工作时间。

目前,我们在ETL中计算并插入两个日期。我想知道这是否是执行此操作的正确位置。

一些其他的想法是对:

A)通过仅存储开始和结束日期中的事实表,然后创建其计算以分钟的经过时间和具有使用计算列的图使用索引视图一个计算工作日的函数。

B)插入或更新完成日期为非空值后,使用After触发器更新已发生日历时间和业务时间。

我觉得这应该在数据库中完成,以便如果对结束日期或计算业务时间进行任何更改,它都会反映出来。在ETL期间这样做似乎很容易出现问题。

对此的任何想法表示赞赏!

更新:至少有6列以这种方式确定。我们有营业时间,时间和天数(我们的业务的天数为12小时);那么我们有客户的分钟,小时和天数(通过查找表确定客户的工作时间);那么我们只需要日历分钟,小时和天(尽管这些不会被存储;只有几分钟)。由于这是一个数据仓库,我预计所有的数据都会出现,不需要计算。对我来说,确保ETL是正确的并且应用到处,而不是创建一个超过基础数据的视图以获得计算信息似乎需要做更多的工作。

+0

你为什么要在数据库中做到这一点?一旦数据在ETL过程结束时到达数据库,您就不应该修改它 - 唯一改变仓库中的数据的东西应该是ETL(这在很大程度上就是您通常不需要数据库的原因在仓库中执行约束) –

+0

我想在数据库中这样做,这样我们只需插入最少量的信息(例如开始和结束日期时间),并将其余数据一致地计算在数据库中在任何时间使用业务的时间都将通过相同的功能。使用ETL迫使我们确保加载所有表使用相同的进程,同时创建超过基本数据的视图允许我们在逻辑改变时删除并重新创建视图。 – MPavlak

+2

“使用ETL迫使我们确保加载所有表使用相同的过程” - 我认为这是一件好事,因为您正在执行规则。视图可以很好,但不会表现得很好。您也可以在数据库中执行ETL作为“ELT”(提取 - 加载 - 转换)。 –

回答

3

最简单的方法应该是最好的解决办法:

在你的ETL处理线(让我们supose是SSIS但可以推断其他技术):

  1. 创建data flow从复制表您的运营数据库转移到数据仓库后台。
  2. T-Sql task更新您的事实表。一个merge的说法应该是足够了:

合并样本:

MERGE Target AS T 
USING Source AS S 
ON (__ matching criteria ___) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(OrderDimID, startDate, ...) VALUES(...) 
WHEN MATCHED 
    THEN UPDATE SET T.ElapsedCalendarTimeInMinutes = ___some calculations___ 
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE (?) 

这避免诱发和索引视图。

+0

我会研究这种方法,但为什么我们要避免意见/触发器(只是好奇)? – MPavlak

+1

我尽可能避免触发器:不容易调试,也应该记住所有存在的时间。关于视图,在数据集市中,我更喜欢将所有数据物化,更快速地制作新索引,连接,搜索...。我不知道他们是否对这个问题“写规则”,但是这只是我工作和为我运行。 – danihp

+0

我将此标记为接受的答案,但尚未探索解决方案。从答复看来,这似乎是一个合理的解决方案。 – MPavlak